Compare commits
50 Commits
chore-upda
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 798afdd512 | |||
|
05ae96ffdd
|
|||
|
66aa7ba962
|
|||
|
ccb2b6fbdc
|
|||
| 196cc04df7 | |||
|
093bf774ab
|
|||
|
e09247a03e
|
|||
|
f87e56a92f
|
|||
| d6cb1fda63 | |||
|
2a98718699
|
|||
|
fda49d091c
|
|||
|
284e7dce67
|
|||
|
30e4cded8f
|
|||
| 9556588d9d | |||
|
8455322af4
|
|||
| 14ec61d209 | |||
|
ae72b22d94
|
|||
|
458174ca6d
|
|||
|
539e1331a0
|
|||
|
04010815a9
|
|||
|
|
cb470c2850 | ||
| 4eb3856c36 | |||
|
97a1becc86
|
|||
|
3a83ef27da
|
|||
|
14f9748957
|
|||
|
|
c8b3590355 | ||
| cf8ec8b07e | |||
|
d74b94b769
|
|||
|
|
2d08c2959a | ||
| 5da3050da6 | |||
|
|
e681c8ba92 | ||
| 3a6da75c8f | |||
| 5c8ffb45c0 | |||
|
|
80d2b9bda1 | ||
| 765c7ada8c | |||
|
3270173fd9
|
|||
|
2740a13ebb
|
|||
|
6509f99215
|
|||
|
12f2bd31c9
|
|||
|
4d8c5da4f5
|
|||
|
ce3eea7243
|
|||
|
f45c869b56
|
|||
|
026e39b9b8
|
|||
|
ac10501131
|
|||
| dab9d08297 | |||
| 49b347deec | |||
| 41d696525e | |||
| 5dd8479e48 | |||
| 301525121e | |||
| de07c698af |
@@ -2,18 +2,18 @@ on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
github_release:
|
||||
description: 'Create Gitea Release'
|
||||
description: "Create Gitea Release"
|
||||
default: true
|
||||
type: boolean
|
||||
bump:
|
||||
description: 'Bump type'
|
||||
description: "Bump type"
|
||||
required: false
|
||||
default: 'patch'
|
||||
default: "patch"
|
||||
type: choice
|
||||
options:
|
||||
- 'major'
|
||||
- 'minor'
|
||||
- 'patch'
|
||||
- "major"
|
||||
- "minor"
|
||||
- "patch"
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -22,11 +22,11 @@ jobs:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@master
|
||||
with:
|
||||
fetch-depth: 0 # Fetch full history
|
||||
fetch-tags: true # Fetch all tags (refs/tags)
|
||||
fetch-depth: 0 # Fetch full history
|
||||
fetch-tags: true # Fetch all tags (refs/tags)
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v5
|
||||
uses: astral-sh/setup-uv@v7
|
||||
- name: Set up Python
|
||||
run: uv python install
|
||||
with:
|
||||
@@ -54,7 +54,7 @@ jobs:
|
||||
uses: https://github.com/mikepenz/release-changelog-builder-action@v5
|
||||
with:
|
||||
platform: "gitea"
|
||||
baseURL: "http://gitea:3000"
|
||||
baseURL: "http://192.168.178.110:3000"
|
||||
configuration: ".gitea/changelog_config.json"
|
||||
|
||||
env:
|
||||
@@ -65,7 +65,6 @@ jobs:
|
||||
env:
|
||||
USERNAME: ${{ github.repository_owner }}
|
||||
run: uv publish --publish-url https://git.theprivateserver.de/api/packages/$USERNAME/pypi/ -t ${{ secrets.TOKEN }}
|
||||
|
||||
|
||||
- name: Create release
|
||||
id: create_release
|
||||
@@ -81,4 +80,4 @@ jobs:
|
||||
files: |
|
||||
dist/*
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.TOKEN }}
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
uses: actions/checkout@master
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v5
|
||||
uses: astral-sh/setup-uv@v7
|
||||
with:
|
||||
python-version-file: "pyproject.toml"
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ jobs:
|
||||
uses: actions/checkout@master
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v5
|
||||
uses: astral-sh/setup-uv@v7
|
||||
with:
|
||||
python-version-file: "pyproject.toml"
|
||||
|
||||
|
||||
7
.vscode/settings.json
vendored
Normal file
7
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"python.testing.pytestArgs": [
|
||||
"tests"
|
||||
],
|
||||
"python.testing.unittestEnabled": false,
|
||||
"python.testing.pytestEnabled": true
|
||||
}
|
||||
11
TODO.md
Normal file
11
TODO.md
Normal file
@@ -0,0 +1,11 @@
|
||||
- [ ] Add SRU APIs for
|
||||
- [x] KOBV
|
||||
- [x] HEBIS
|
||||
- [x] K10Plus
|
||||
- [x] DNB
|
||||
- [ ] StaBi Berlin
|
||||
- [ ] TIB Hannover
|
||||
- [x] ÖVK
|
||||
- [x] HBZ
|
||||
|
||||
Run test on
|
||||
107
pyproject.toml
107
pyproject.toml
@@ -1,23 +1,33 @@
|
||||
[project]
|
||||
name = "bibapi"
|
||||
version = "0.1.0"
|
||||
version = "0.0.6"
|
||||
description = "Add your description here"
|
||||
readme = "README.md"
|
||||
authors = [
|
||||
{ name = "WorldTeacher", email = "coding_contact@pm.me" }
|
||||
]
|
||||
authors = [{ name = "WorldTeacher", email = "coding_contact@pm.me" }]
|
||||
requires-python = ">=3.13"
|
||||
dependencies = [
|
||||
"regex>=2025.9.18",
|
||||
"requests>=2.32.5",
|
||||
]
|
||||
|
||||
[project.optional-dependencies]
|
||||
# SRU API feature: for accessing library catalogs via SRU protocol
|
||||
sru = ["requests>=2.32.5"]
|
||||
|
||||
# Catalogue feature: web scraping local library catalog
|
||||
catalogue = ["requests>=2.32.5", "beautifulsoup4>=4.12.0"]
|
||||
|
||||
webrequest = ["bibapi[catalogue]", "ratelimit>=2.2.0"]
|
||||
|
||||
# Install all features
|
||||
all = ["bibapi[sru,catalogue]"]
|
||||
|
||||
[build-system]
|
||||
requires = ["hatchling"]
|
||||
build-backend = "hatchling.build"
|
||||
requires = ["uv_build >= 0.9.5, <0.10.0"]
|
||||
build-backend = "uv_build"
|
||||
|
||||
[tool.bumpversion]
|
||||
current_version = "0.0.1"
|
||||
current_version = "0.0.6"
|
||||
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
|
||||
serialize = ["{major}.{minor}.{patch}"]
|
||||
search = "{current_version}"
|
||||
@@ -39,8 +49,89 @@ pre_commit_hooks = []
|
||||
post_commit_hooks = []
|
||||
|
||||
[dependency-groups]
|
||||
test = [
|
||||
dev = [
|
||||
"pylint>=4.0.3",
|
||||
"pytest-mock>=3.15.1",
|
||||
"types-pysocks>=1.7.1.20251001",
|
||||
"types-regex>=2025.9.18.20250921",
|
||||
"types-requests>=2.32.4.20250913",
|
||||
"mypy>=1.18.2",
|
||||
"pytest>=8.4.2",
|
||||
"pytest-cov>=7.0.0",
|
||||
"ratelimit>=2.2.0",
|
||||
"beautifulsoup4>=4.12.0",
|
||||
]
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
testpaths = ["tests"]
|
||||
python_files = ["test_*.py"]
|
||||
python_classes = ["Test*"]
|
||||
python_functions = ["test_*"]
|
||||
markers = [
|
||||
"integration: marks tests as integration tests (deselect with '-m \"not integration\"')",
|
||||
]
|
||||
|
||||
[tool.coverage.run]
|
||||
source = ["src"]
|
||||
branch = true
|
||||
omit = [
|
||||
"*/tests/*",
|
||||
"*/test_*.py",
|
||||
"*/__pycache__/*",
|
||||
"*/.venv/*",
|
||||
"*/site-packages/*",
|
||||
"test.py",
|
||||
]
|
||||
|
||||
[tool.coverage.report]
|
||||
precision = 2
|
||||
show_missing = true
|
||||
skip_covered = false
|
||||
exclude_lines = [
|
||||
"pragma: no cover",
|
||||
"def __repr__",
|
||||
"raise AssertionError",
|
||||
"raise NotImplementedError",
|
||||
"if __name__ == .__main__.",
|
||||
"if TYPE_CHECKING:",
|
||||
"@abstractmethod",
|
||||
"@abc.abstractmethod",
|
||||
]
|
||||
|
||||
[tool.coverage.html]
|
||||
directory = "htmlcov"
|
||||
|
||||
[tool.mypy]
|
||||
python_version = "3.13"
|
||||
warn_return_any = true
|
||||
warn_unused_configs = true
|
||||
disallow_untyped_defs = false
|
||||
disallow_incomplete_defs = false
|
||||
check_untyped_defs = true
|
||||
no_implicit_optional = true
|
||||
warn_redundant_casts = true
|
||||
warn_unused_ignores = true
|
||||
warn_no_return = true
|
||||
strict_equality = true
|
||||
|
||||
[[tool.mypy.overrides]]
|
||||
module = "tests.*"
|
||||
ignore_errors = true
|
||||
|
||||
[[tool.mypy.overrides]]
|
||||
module = [
|
||||
"regex.*",
|
||||
"requests.*",
|
||||
"bs4.*",
|
||||
"ratelimit.*",
|
||||
"pytest.*",
|
||||
"pytest_mock.*",
|
||||
"bibapi._transformers",
|
||||
"bibapi.webrequest",
|
||||
"bibapi.catalogue",
|
||||
"bibapi.lehmanns",
|
||||
"bibapi.schemas.bookdata",
|
||||
"bibapi.sru",
|
||||
]
|
||||
ignore_missing_imports = true
|
||||
ignore_errors = true
|
||||
|
||||
3
renovate.json
Normal file
3
renovate.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
|
||||
}
|
||||
@@ -1,2 +1,92 @@
|
||||
def hello() -> str:
|
||||
return "Hello from bibapi!"
|
||||
from .schemas.api_types import (
|
||||
ALMASchema,
|
||||
DNBSchema,
|
||||
HBZSchema,
|
||||
HebisSchema,
|
||||
KOBVSchema,
|
||||
OEVKSchema,
|
||||
SWBSchema,
|
||||
)
|
||||
from .sru import Api as _Api
|
||||
|
||||
__all__ = [
|
||||
"DNB",
|
||||
"HBZ",
|
||||
"HEBIS",
|
||||
"KOBV",
|
||||
"OEVK",
|
||||
"SWB",
|
||||
]
|
||||
|
||||
|
||||
class SWB(_Api):
|
||||
def __init__(self) -> None:
|
||||
self.site = SWBSchema.NAME.value
|
||||
self.url = SWBSchema.URL.value
|
||||
self.prefix = SWBSchema.ARGSCHEMA.value
|
||||
self.library_identifier = SWBSchema.LIBRARY_NAME_LOCATION_FIELD.value
|
||||
super().__init__(self.site, self.url, self.prefix, self.library_identifier)
|
||||
|
||||
|
||||
class DNB(_Api):
|
||||
def __init__(self) -> None:
|
||||
self.site = DNBSchema.NAME.value
|
||||
self.url = DNBSchema.URL.value
|
||||
self.prefix = DNBSchema.ARGSCHEMA.value
|
||||
super().__init__(self.site, self.url, self.prefix, self.library_identifier)
|
||||
|
||||
|
||||
class KOBV(_Api):
|
||||
def __init__(self) -> None:
|
||||
self.site = KOBVSchema.NAME.value
|
||||
self.url = KOBVSchema.URL.value
|
||||
self.prefix = KOBVSchema.ARGSCHEMA.value
|
||||
self.library_identifier = KOBVSchema.LIBRARY_NAME_LOCATION_FIELD.value
|
||||
super().__init__(self.site, self.url, self.prefix, self.library_identifier)
|
||||
|
||||
|
||||
class HEBIS(_Api):
|
||||
def __init__(self) -> None:
|
||||
self.site = HebisSchema.NAME.value
|
||||
self.url = HebisSchema.URL.value
|
||||
self.prefix = HebisSchema.ARGSCHEMA.value
|
||||
self.replace = HebisSchema.REPLACE.value
|
||||
self.library_identifier = HebisSchema.LIBRARY_NAME_LOCATION_FIELD.value
|
||||
self.notsupported_args = HebisSchema.NOTSUPPORTEDARGS.value
|
||||
super().__init__(
|
||||
site=self.site,
|
||||
url=self.url,
|
||||
prefix=self.prefix,
|
||||
library_identifier=self.library_identifier,
|
||||
notsupported_args=self.notsupported_args,
|
||||
replace=self.replace,
|
||||
)
|
||||
|
||||
|
||||
class OEVK(_Api):
|
||||
def __init__(self) -> None:
|
||||
self.site = OEVKSchema.NAME.value
|
||||
self.url = OEVKSchema.URL.value
|
||||
self.prefix = OEVKSchema.ARGSCHEMA.value
|
||||
self.library_identifier = OEVKSchema.LIBRARY_NAME_LOCATION_FIELD.value
|
||||
super().__init__(self.site, self.url, self.prefix, self.library_identifier)
|
||||
|
||||
|
||||
class HBZ(_Api):
|
||||
"""Small wrapper of the SRU API used to retrieve data from the HBZ libraries.
|
||||
|
||||
All fields are available [here](https://eu04.alma.exlibrisgroup.com/view/sru/49HBZ_NETWORK?version=1.2)
|
||||
|
||||
Schema
|
||||
------
|
||||
HBZSchema: "HBZSchema"
|
||||
|
||||
query prefix: alma.
|
||||
"""
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.site = HBZSchema.NAME.value
|
||||
self.url = HBZSchema.URL.value
|
||||
self.prefix = HBZSchema.ARGSCHEMA.value
|
||||
self.library_identifier = HBZSchema.LIBRARY_NAME_LOCATION_FIELD.value
|
||||
super().__init__(self.site, self.url, self.prefix, self.library_identifier)
|
||||
|
||||
503
src/bibapi/_transformers.py
Normal file
503
src/bibapi/_transformers.py
Normal file
@@ -0,0 +1,503 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import re
|
||||
from dataclasses import dataclass
|
||||
from dataclasses import field as dataclass_field
|
||||
from typing import Any
|
||||
|
||||
from regex import sub
|
||||
|
||||
from .schemas.bookdata import BookData
|
||||
|
||||
|
||||
@dataclass
|
||||
class Item:
|
||||
superlocation: str | None = dataclass_field(default_factory=str)
|
||||
status: str | None = dataclass_field(default_factory=str)
|
||||
availability: str | None = dataclass_field(default_factory=str)
|
||||
notes: str | None = dataclass_field(default_factory=str)
|
||||
limitation: str | None = dataclass_field(default_factory=str)
|
||||
duedate: str | None = dataclass_field(default_factory=str)
|
||||
id: str | None = dataclass_field(default_factory=str)
|
||||
item_id: str | None = dataclass_field(default_factory=str)
|
||||
ilslink: str | None = dataclass_field(default_factory=str)
|
||||
number: int | None = dataclass_field(default_factory=int)
|
||||
barcode: str | None = dataclass_field(default_factory=str)
|
||||
reserve: str | None = dataclass_field(default_factory=str)
|
||||
callnumber: str | None = dataclass_field(default_factory=str)
|
||||
department: str | None = dataclass_field(default_factory=str)
|
||||
locationhref: str | None = dataclass_field(default_factory=str)
|
||||
location: str | None = dataclass_field(default_factory=str)
|
||||
ktrl_nr: str | None = dataclass_field(default_factory=str)
|
||||
|
||||
def from_dict(self, data: dict[str, Any]) -> Item:
|
||||
"""Import data from dict."""
|
||||
data = data["items"]
|
||||
for entry in data:
|
||||
for key, value in entry.items():
|
||||
setattr(self, key, value)
|
||||
return self
|
||||
|
||||
|
||||
@dataclass
|
||||
class RDS_AVAIL_DATA:
|
||||
"""Class to store RDS availability data"""
|
||||
|
||||
library_sigil: str = dataclass_field(default_factory=str)
|
||||
items: list[Item] = dataclass_field(default_factory=list)
|
||||
|
||||
def import_from_dict(self, data: str):
|
||||
"""Import data from dict"""
|
||||
edata = json.loads(data)
|
||||
# library sigil is first key
|
||||
|
||||
self.library_sigil = str(list(edata.keys())[0])
|
||||
# get data from first key
|
||||
edata = edata[self.library_sigil]
|
||||
for location in edata:
|
||||
item = Item(superlocation=location).from_dict(edata[location])
|
||||
|
||||
self.items.append(item)
|
||||
return self
|
||||
|
||||
|
||||
@dataclass
|
||||
class RDS_DATA:
|
||||
"""Class to store RDS data"""
|
||||
|
||||
RDS_SIGNATURE: str = dataclass_field(default_factory=str)
|
||||
RDS_STATUS: str = dataclass_field(default_factory=str)
|
||||
RDS_LOCATION: str = dataclass_field(default_factory=str)
|
||||
RDS_URL: Any = dataclass_field(default_factory=str)
|
||||
RDS_HINT: Any = dataclass_field(default_factory=str)
|
||||
RDS_COMMENT: Any = dataclass_field(default_factory=str)
|
||||
RDS_HOLDING: Any = dataclass_field(default_factory=str)
|
||||
RDS_HOLDING_LEAK: Any = dataclass_field(default_factory=str)
|
||||
RDS_INTERN: Any = dataclass_field(default_factory=str)
|
||||
RDS_PROVENIENCE: Any = dataclass_field(default_factory=str)
|
||||
RDS_LOCAL_NOTATION: str = dataclass_field(default_factory=str)
|
||||
RDS_LEA: Any = dataclass_field(default_factory=str)
|
||||
|
||||
def import_from_dict(self, data: dict) -> RDS_DATA:
|
||||
"""Import data from dict"""
|
||||
for key, value in data.items():
|
||||
setattr(self, key, value)
|
||||
return self
|
||||
|
||||
|
||||
@dataclass
|
||||
class RDS_GENERIC_DATA:
|
||||
LibrarySigil: str = dataclass_field(default_factory=str)
|
||||
RDS_DATA: list[RDS_DATA] = dataclass_field(default_factory=list)
|
||||
|
||||
def import_from_dict(self, data: str) -> RDS_GENERIC_DATA:
|
||||
"""Import data from dict"""
|
||||
edata = json.loads(data)
|
||||
# library sigil is first key
|
||||
self.LibrarySigil = str(list(edata.keys())[0])
|
||||
# get data from first key
|
||||
edata = edata[self.LibrarySigil]
|
||||
for entry in edata:
|
||||
rds_data = RDS_DATA() # Create a new RDS_DATA instance
|
||||
# Populate the RDS_DATA instance from the entry
|
||||
# This assumes that the entry is a dictionary that matches the structure of the RDS_DATA class
|
||||
rds_data.import_from_dict(entry)
|
||||
self.RDS_DATA.append(rds_data) # Add the RDS_DATA instance to the list
|
||||
return self
|
||||
|
||||
|
||||
class BaseStruct:
|
||||
def __init__(self, **kwargs):
|
||||
for key, value in kwargs.items():
|
||||
setattr(self, key, value)
|
||||
|
||||
|
||||
class ARRAYData:
|
||||
def __init__(self, signature=None) -> None:
|
||||
self.signature = None
|
||||
|
||||
def transform(self, data: str) -> BookData:
|
||||
def _get_line(source: str, search: str) -> str:
|
||||
try:
|
||||
data = (
|
||||
source.split(search)[1]
|
||||
.split("\n")[0]
|
||||
.strip()
|
||||
.replace("=>", "")
|
||||
.strip()
|
||||
)
|
||||
return data
|
||||
|
||||
except Exception:
|
||||
return ""
|
||||
|
||||
def _get_list_entry(source: str, search: str, entry: str) -> str:
|
||||
try:
|
||||
source = source.replace("\t", "").replace("\r", "")
|
||||
source = source.split(search)[1].split(")")[0]
|
||||
return _get_line(source, entry).replace("=>", "").strip()
|
||||
except Exception:
|
||||
return ""
|
||||
|
||||
def _get_isbn(source: str) -> list:
|
||||
try:
|
||||
isbn = source.split("[isbn]")[1].split(")")[0].strip()
|
||||
isbn = isbn.split("(")[1]
|
||||
isbns = isbn.split("=>")
|
||||
ret = []
|
||||
for _ in isbns:
|
||||
# remove _ from list
|
||||
isb = _.split("\n")[0].strip()
|
||||
if isb == "":
|
||||
continue
|
||||
ret.append(isb) if isb not in ret else None
|
||||
return ret
|
||||
except Exception:
|
||||
isbn = []
|
||||
return isbn
|
||||
|
||||
def _get_signature(data):
|
||||
try:
|
||||
sig_data = (
|
||||
data.split("[loksatz]")[1]
|
||||
.split("[0] => ")[1]
|
||||
.split("\n")[0]
|
||||
.strip()
|
||||
)
|
||||
signature_data = eval(sig_data)
|
||||
return signature_data["signatur"]
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def _get_author(data):
|
||||
try:
|
||||
array = data.split("[au_display_short]")[1].split(")\n")[0].strip()
|
||||
except Exception:
|
||||
return ""
|
||||
entries = array.split("\n")
|
||||
authors = []
|
||||
hg_present = False
|
||||
verf_present = False
|
||||
lines = []
|
||||
for entry in entries:
|
||||
if "=>" in entry:
|
||||
line = entry.split("=>")[1].strip()
|
||||
if "[HerausgeberIn]" in line:
|
||||
hg_present = True
|
||||
if "[VerfasserIn]" in line:
|
||||
verf_present = True
|
||||
lines.append(line)
|
||||
for line in lines:
|
||||
if hg_present and verf_present:
|
||||
if "[HerausgeberIn]" in line:
|
||||
authors.append(line.split("[")[0].strip())
|
||||
elif verf_present:
|
||||
if "[VerfasserIn]" in line:
|
||||
authors.append(line.split("[")[0].strip())
|
||||
else:
|
||||
pass
|
||||
return ";".join(authors)
|
||||
|
||||
def _get_title(data):
|
||||
titledata = None
|
||||
title = ""
|
||||
if "[ti_long]" in data:
|
||||
titledata = data.split("[ti_long]")[1].split(")\n")[0].strip()
|
||||
title = titledata.split("=>")[1].strip().split("/")[0].strip()
|
||||
if "[ti_long_f]" in data:
|
||||
titledata = data.split("[ti_long_f]")[1].split(")\n")[0].strip()
|
||||
title = titledata.split("=>")[1].strip().split("/")[0].strip()
|
||||
return title
|
||||
|
||||
def _get_adis_idn(data, signature):
|
||||
loksatz_match = re.search(
|
||||
r"\[loksatz\] => Array\s*\((.*?)\)",
|
||||
data,
|
||||
re.DOTALL,
|
||||
)
|
||||
if loksatz_match:
|
||||
loksatz_content = loksatz_match.group(1)
|
||||
|
||||
# Step 2: Extract JSON objects within the loksatz section
|
||||
json_objects = re.findall(r"{.*?}", loksatz_content, re.DOTALL)
|
||||
# Print each JSON object
|
||||
for obj in json_objects:
|
||||
data = eval(obj)
|
||||
if data["signatur"] == signature:
|
||||
return data["adis_idn"]
|
||||
|
||||
def _get_in_apparat(data):
|
||||
loksatz_match = re.search(
|
||||
r"\[loksatz\] => Array\s*\((.*?)\)",
|
||||
data,
|
||||
re.DOTALL,
|
||||
)
|
||||
if loksatz_match:
|
||||
loksatz_content = loksatz_match.group(1)
|
||||
|
||||
# Step 2: Extract JSON objects within the loksatz section
|
||||
json_objects = re.findall(r"{.*?}", loksatz_content, re.DOTALL)
|
||||
# Print each JSON object
|
||||
for obj in json_objects:
|
||||
data = eval(obj)
|
||||
if data["ausleihcode"] == "R" and data["standort"] == "40":
|
||||
return True
|
||||
return False
|
||||
|
||||
ppn = _get_line(data, "[kid]")
|
||||
title = _get_title(data).strip()
|
||||
author = _get_author(data)
|
||||
edition = _get_list_entry(data, "[ausgabe]", "[0]").replace(",", "")
|
||||
link = f"https://rds.ibs-bw.de/phfreiburg/link?kid={_get_line(data, '[kid]')}"
|
||||
isbn = _get_isbn(data)
|
||||
# [self._get_list_entry(data,"[isbn]","[0]"),self._get_list_entry(data,"[is]","[1]")],
|
||||
language = _get_list_entry(data, "[la_facet]", "[0]")
|
||||
publisher = _get_list_entry(data, "[pu]", "[0]")
|
||||
year = _get_list_entry(data, "[py_display]", "[0]")
|
||||
pages = _get_list_entry(data, "[umfang]", "[0]").split(":")[0].strip()
|
||||
signature = (
|
||||
self.signature if self.signature is not None else _get_signature(data)
|
||||
)
|
||||
|
||||
place = _get_list_entry(data, "[pp]", "[0]")
|
||||
adis_idn = _get_adis_idn(data, signature=signature)
|
||||
in_apparat = _get_in_apparat(data)
|
||||
return BookData(
|
||||
ppn=ppn,
|
||||
title=title,
|
||||
author=author,
|
||||
edition=edition,
|
||||
link=link,
|
||||
isbn=isbn,
|
||||
language=language,
|
||||
publisher=publisher,
|
||||
year=year,
|
||||
pages=pages,
|
||||
signature=signature,
|
||||
place=place,
|
||||
adis_idn=adis_idn,
|
||||
in_apparat=in_apparat,
|
||||
)
|
||||
|
||||
|
||||
class COinSData:
|
||||
def __init__(self) -> None:
|
||||
pass
|
||||
|
||||
def transform(self, data: str) -> BookData:
|
||||
def _get_line(source: str, search: str) -> str:
|
||||
try:
|
||||
data = source.split(f"{search}=")[1] # .split("")[0].strip()
|
||||
return data.split("rft")[0].strip() if "rft" in data else data
|
||||
except Exception:
|
||||
return ""
|
||||
|
||||
return BookData(
|
||||
ppn=_get_line(data, "rft_id").split("=")[1],
|
||||
title=_get_line(data, "rft.btitle"),
|
||||
author=f"{_get_line(data, 'rft.aulast')}, {_get_line(data, 'rft.aufirst')}",
|
||||
edition=_get_line(data, "rft.edition"),
|
||||
link=_get_line(data, "rft_id"),
|
||||
isbn=_get_line(data, "rft.isbn"),
|
||||
publisher=_get_line(data, "rft.pub"),
|
||||
year=_get_line(data, "rft.date"),
|
||||
pages=_get_line(data, "rft.tpages").split(":")[0].strip(),
|
||||
)
|
||||
|
||||
|
||||
class RISData:
|
||||
def __init__(self) -> None:
|
||||
pass
|
||||
|
||||
def transform(self, data: str) -> BookData:
|
||||
def _get_line(source: str, search: str) -> str:
|
||||
try:
|
||||
data = source.split(f"{search} - ")[1] # .split("")[0].strip()
|
||||
return data.split("\n")[0].strip() if "\n" in data else data
|
||||
except Exception:
|
||||
return ""
|
||||
|
||||
return BookData(
|
||||
ppn=_get_line(data, "DP").split("=")[1],
|
||||
title=_get_line(data, "TI"),
|
||||
signature=_get_line(data, "CN"),
|
||||
edition=_get_line(data, "ET").replace(",", ""),
|
||||
link=_get_line(data, "DP"),
|
||||
isbn=_get_line(data, "SN").split(","),
|
||||
author=_get_line(data, "AU").split("[")[0].strip(),
|
||||
language=_get_line(data, "LA"),
|
||||
publisher=_get_line(data, "PB"),
|
||||
year=_get_line(data, "PY"),
|
||||
pages=_get_line(data, "SP"),
|
||||
)
|
||||
|
||||
|
||||
class BibTeXData:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def transform(self, data: str) -> BookData:
|
||||
def _get_line(source: str, search: str) -> str:
|
||||
try:
|
||||
return (
|
||||
data.split(search)[1]
|
||||
.split("\n")[0]
|
||||
.strip()
|
||||
.split("=")[1]
|
||||
.strip()
|
||||
.replace("{", "")
|
||||
.replace("}", "")
|
||||
.replace(",", "")
|
||||
.replace("[", "")
|
||||
.replace("];", "")
|
||||
)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return ""
|
||||
|
||||
return BookData(
|
||||
ppn=None,
|
||||
title=_get_line(data, "title"),
|
||||
signature=_get_line(data, "bestand"),
|
||||
edition=_get_line(data, "edition"),
|
||||
isbn=_get_line(data, "isbn"),
|
||||
author=";".join(_get_line(data, "author").split(" and ")),
|
||||
language=_get_line(data, "language"),
|
||||
publisher=_get_line(data, "publisher"),
|
||||
year=_get_line(data, "year"),
|
||||
pages=_get_line(data, "pages"),
|
||||
)
|
||||
|
||||
|
||||
class RDSData:
|
||||
def __init__(self):
|
||||
self.retlist = []
|
||||
|
||||
def transform(self, data: str):
|
||||
# rds_availability = RDS_AVAIL_DATA()
|
||||
# rds_data = RDS_GENERIC_DATA()
|
||||
|
||||
def __get_raw_data(data: str) -> list:
|
||||
# create base data to be turned into pydantic classes
|
||||
data = data.split("RDS ----------------------------------")[1]
|
||||
edata = data.strip()
|
||||
edata = edata.split("\n", 9)[9]
|
||||
edata = edata.split("\n")[1:]
|
||||
entry_1 = edata[0]
|
||||
edata = edata[1:]
|
||||
entry_2 = "".join(edata)
|
||||
edata = []
|
||||
edata.append(entry_1)
|
||||
edata.append(entry_2)
|
||||
return edata
|
||||
|
||||
ret_data = __get_raw_data(data)
|
||||
# assign data[1] to RDS_AVAIL_DATA
|
||||
# assign data[0] to RDS_DATA
|
||||
self.rds_data = RDS_GENERIC_DATA().import_from_dict(ret_data[1])
|
||||
self.rds_availability = RDS_AVAIL_DATA().import_from_dict(ret_data[0])
|
||||
self.retlist.append(self.rds_availability)
|
||||
self.retlist.append(self.rds_data)
|
||||
return self
|
||||
|
||||
def return_data(self, option=None):
|
||||
if option == "rds_availability":
|
||||
return self.retlist[0]
|
||||
if option == "rds_data":
|
||||
return self.retlist[1]
|
||||
return {"rds_availability": self.retlist[0], "rds_data": self.retlist[1]}
|
||||
|
||||
|
||||
class DictToTable:
|
||||
def __init__(self):
|
||||
self.work_author = None
|
||||
self.section_author = None
|
||||
self.year = None
|
||||
self.edition = None
|
||||
self.work_title = None
|
||||
self.chapter_title = None
|
||||
self.location = None
|
||||
self.publisher = None
|
||||
self.signature = None
|
||||
self.type = None
|
||||
self.pages = None
|
||||
self.issue = None
|
||||
self.isbn = None
|
||||
|
||||
def makeResult(self):
|
||||
data = {
|
||||
"work_author": self.work_author,
|
||||
"section_author": self.section_author,
|
||||
"year": self.year,
|
||||
"edition": self.edition,
|
||||
"work_title": self.work_title,
|
||||
"chapter_title": self.chapter_title,
|
||||
"location": self.location,
|
||||
"publisher": self.publisher,
|
||||
"signature": self.signature,
|
||||
"issue": self.issue,
|
||||
"pages": self.pages,
|
||||
"isbn": self.isbn,
|
||||
"type": self.type,
|
||||
}
|
||||
data = {k: v for k, v in data.items() if v is not None}
|
||||
return data
|
||||
|
||||
def reset(self):
|
||||
for key in self.__dict__:
|
||||
setattr(self, key, None)
|
||||
|
||||
def transform(self, data: dict):
|
||||
mode = data["mode"]
|
||||
self.reset()
|
||||
if mode == "book":
|
||||
return self.book_assign(data)
|
||||
if mode == "hg":
|
||||
return self.hg_assign(data)
|
||||
if mode == "zs":
|
||||
return self.zs_assign(data)
|
||||
return None
|
||||
|
||||
def book_assign(self, data):
|
||||
self.type = "book"
|
||||
self.work_author = data["book_author"]
|
||||
self.signature = data["book_signature"]
|
||||
self.location = data["book_place"]
|
||||
self.year = data["book_year"]
|
||||
self.work_title = data["book_title"]
|
||||
self.edition = data["book_edition"]
|
||||
self.pages = data["book_pages"]
|
||||
self.publisher = data["book_publisher"]
|
||||
self.isbn = data["book_isbn"]
|
||||
return self.makeResult()
|
||||
|
||||
def hg_assign(self, data):
|
||||
self.type = "hg"
|
||||
self.section_author = data["hg_author"]
|
||||
self.work_author = data["hg_editor"]
|
||||
self.year = data["hg_year"]
|
||||
self.work_title = data["hg_title"]
|
||||
self.publisher = data["hg_publisher"]
|
||||
self.location = data["hg_place"]
|
||||
self.edition = data["hg_edition"]
|
||||
self.chapter_title = data["hg_chaptertitle"]
|
||||
self.pages = data["hg_pages"]
|
||||
self.signature = data["hg_signature"]
|
||||
self.isbn = data["hg_isbn"]
|
||||
return self.makeResult()
|
||||
|
||||
def zs_assign(self, data):
|
||||
self.type = "zs"
|
||||
self.section_author = data["zs_author"]
|
||||
self.chapter_title = data["zs_chapter_title"]
|
||||
self.location = data["zs_place"]
|
||||
self.issue = data["zs_issue"]
|
||||
self.pages = data["zs_pages"]
|
||||
self.publisher = data["zs_publisher"]
|
||||
self.isbn = data["zs_isbn"]
|
||||
|
||||
self.year = data["zs_year"]
|
||||
self.signature = data["zs_signature"]
|
||||
self.work_title = data["zs_title"]
|
||||
return self.makeResult()
|
||||
@@ -0,0 +1,333 @@
|
||||
import regex
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
from .schemas.bookdata import BookData as Book
|
||||
|
||||
URL = "https://rds.ibs-bw.de/phfreiburg/opac/RDSIndex/Search?type0%5B%5D=allfields&lookfor0%5B%5D={}&join=AND&bool0%5B%5D=AND&type0%5B%5D=au&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=ti&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=ct&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=isn&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=ta&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=co&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=py&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=pp&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=pu&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=si&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=zr&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=cc&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND"
|
||||
BASE = "https://rds.ibs-bw.de"
|
||||
|
||||
|
||||
class Catalogue:
|
||||
def __init__(self, timeout=15):
|
||||
self.timeout = timeout
|
||||
reachable = self.check_connection()
|
||||
if not reachable:
|
||||
raise ConnectionError("No internet connection available.")
|
||||
|
||||
def check_connection(self):
|
||||
try:
|
||||
response = requests.get("https://www.google.com", timeout=self.timeout)
|
||||
if response.status_code == 200:
|
||||
return True
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Could not connect to google.com: {e}")
|
||||
|
||||
def search_book(self, searchterm: str):
|
||||
response = requests.get(URL.format(searchterm), timeout=self.timeout)
|
||||
return response.text
|
||||
|
||||
def search(self, link: str):
|
||||
response = requests.get(link, timeout=self.timeout)
|
||||
return response.text
|
||||
|
||||
def get_book_links(self, searchterm: str) -> list[str]:
|
||||
response = self.search_book(searchterm)
|
||||
soup = BeautifulSoup(response, "html.parser")
|
||||
links = soup.find_all("a", class_="title getFull")
|
||||
res: list[str] = []
|
||||
for link in links:
|
||||
res.append(BASE + link["href"]) # type: ignore
|
||||
return res
|
||||
|
||||
def get_book(self, searchterm: str):
|
||||
links = self.get_book_links(searchterm)
|
||||
for elink in links:
|
||||
result = self.search(elink)
|
||||
# in result search for class col-xs-12 rds-dl RDS_LOCATION
|
||||
# if found, return text of href
|
||||
soup = BeautifulSoup(result, "html.parser")
|
||||
|
||||
# Optional (unchanged): title and ppn if you need them
|
||||
title_el = soup.find("div", class_="headline text")
|
||||
title = title_el.get_text(strip=True) if title_el else None
|
||||
|
||||
ppn_el = soup.find(
|
||||
"div",
|
||||
class_="col-xs-12 col-md-5 col-lg-4 rds-dl-head RDS_PPN",
|
||||
)
|
||||
# in ppn_el, get text of div col-xs-12 col-md-7 col-lg-8 rds-dl-panel
|
||||
ppn = (
|
||||
ppn_el.find_next_sibling(
|
||||
"div",
|
||||
class_="col-xs-12 col-md-7 col-lg-8 rds-dl-panel",
|
||||
).get_text(strip=True)
|
||||
if ppn_el
|
||||
else None
|
||||
)
|
||||
|
||||
# get edition text at div class col-xs-12 col-md-5 col-lg-4 rds-dl-head RDS_EDITION
|
||||
edition_el = soup.find(
|
||||
"div",
|
||||
class_="col-xs-12 col-md-5 col-lg-4 rds-dl-head RDS_EDITION",
|
||||
)
|
||||
edition = (
|
||||
edition_el.find_next_sibling(
|
||||
"div",
|
||||
class_="col-xs-12 col-md-7 col-lg-8 rds-dl-panel",
|
||||
).get_text(strip=True)
|
||||
if edition_el
|
||||
else None
|
||||
)
|
||||
|
||||
authors = soup.find_all(
|
||||
"div",
|
||||
class_="col-xs-12 col-md-5 col-lg-4 rds-dl-head RDS_PERSON",
|
||||
)
|
||||
author = None
|
||||
if authors:
|
||||
# get the names of the a href links in the div col-xs-12 col-md-7 col-lg-8 rds-dl-panel
|
||||
author_names = []
|
||||
for author in authors:
|
||||
panel = author.find_next_sibling(
|
||||
"div",
|
||||
class_="col-xs-12 col-md-7 col-lg-8 rds-dl-panel",
|
||||
)
|
||||
if panel:
|
||||
links = panel.find_all("a")
|
||||
for link in links:
|
||||
author_names.append(link.text.strip())
|
||||
author = (
|
||||
";".join(author_names) if len(author_names) > 1 else author_names[0]
|
||||
)
|
||||
signature = None
|
||||
|
||||
panel = soup.select_one("div.panel-body")
|
||||
if panel:
|
||||
# Collect the RDS_* blocks in order, using the 'space' divs as separators
|
||||
groups = []
|
||||
cur = {}
|
||||
for node in panel.select(
|
||||
"div.rds-dl.RDS_SIGNATURE, div.rds-dl.RDS_STATUS, div.rds-dl.RDS_LOCATION, div.col-xs-12.space",
|
||||
):
|
||||
classes = node.get("class", [])
|
||||
# Separator between entries
|
||||
if "space" in classes:
|
||||
if cur:
|
||||
groups.append(cur)
|
||||
cur = {}
|
||||
continue
|
||||
|
||||
# Read the value from the corresponding panel cell
|
||||
val_el = node.select_one(".rds-dl-panel")
|
||||
val = (
|
||||
val_el.get_text(" ", strip=True)
|
||||
if val_el
|
||||
else node.get_text(" ", strip=True)
|
||||
)
|
||||
|
||||
if "RDS_SIGNATURE" in classes:
|
||||
cur["signature"] = val
|
||||
elif "RDS_STATUS" in classes:
|
||||
cur["status"] = val
|
||||
elif "RDS_LOCATION" in classes:
|
||||
cur["location"] = val
|
||||
|
||||
if cur: # append the last group if not followed by a space
|
||||
groups.append(cur)
|
||||
|
||||
# Find the signature for the entry whose location mentions "Semesterapparat"
|
||||
for g in groups:
|
||||
loc = g.get("location", "").lower()
|
||||
if "semesterapparat" in loc:
|
||||
signature = g.get("signature")
|
||||
return Book(
|
||||
title=title,
|
||||
ppn=ppn,
|
||||
signature=signature,
|
||||
library_location=loc.split("-")[-1],
|
||||
link=elink,
|
||||
author=author,
|
||||
edition=edition,
|
||||
)
|
||||
return Book(
|
||||
title=title,
|
||||
ppn=ppn,
|
||||
signature=signature,
|
||||
library_location=loc.split("\n\n")[-1],
|
||||
link=elink,
|
||||
author=author,
|
||||
edition=edition,
|
||||
)
|
||||
|
||||
def get_book_with_data(self, searchterm: str) -> Book | None:
|
||||
book = self.get_book(searchterm)
|
||||
if book:
|
||||
# request data from book.link and parse for additional data
|
||||
result = self.search(book.link)
|
||||
soup = BeautifulSoup(result, "html.parser")
|
||||
|
||||
# from div col-xs-12 rds-dl RDS_SIGNATURE get signature (second div in this div)
|
||||
signature = None
|
||||
signature_el = soup.find("div", class_="RDS_SIGNATURE")
|
||||
if signature_el:
|
||||
signature = signature_el.find("div", class_="rds-dl-panel").get_text(
|
||||
strip=True,
|
||||
)
|
||||
book.signature = signature
|
||||
# from div col-xs-12 col-md-5 col-lg-4 rds-dl-head RDS_ISBN get isbn (second div in this div)
|
||||
isbn = None
|
||||
isbn_el = soup.find("div", class_="RDS_ISBN")
|
||||
if isbn_el:
|
||||
isbn = isbn_el.find_next_sibling(
|
||||
"div",
|
||||
class_="col-xs-12 col-md-7 col-lg-8 rds-dl-panel",
|
||||
).get_text(strip=True)
|
||||
book.isbn = isbn
|
||||
# from div col-xs-12 col-md-5 col-lg-4 rds-dl-head
|
||||
# RDS_SCOPE get pages (second div in this div)
|
||||
pages = None
|
||||
pages_el = soup.find("div", class_="RDS_SCOPE")
|
||||
if pages_el:
|
||||
pages = pages_el.find_next_sibling(
|
||||
"div",
|
||||
class_="col-xs-12 col-md-7 col-lg-8 rds-dl-panel",
|
||||
).get_text(strip=True)
|
||||
# regex match to get pages by grabbing the first number in the string
|
||||
match = regex.search(r"(\d+)", pages)
|
||||
if match:
|
||||
pages = match.group(1)
|
||||
book.pages = pages
|
||||
return book
|
||||
return None
|
||||
|
||||
def get(self, ppn: str) -> Book | None:
|
||||
# based on PPN, get title, people, edition, year, language, pages, isbn,
|
||||
link = f"https://rds.ibs-bw.de/phfreiburg/opac/RDSIndexrecord/{ppn}"
|
||||
result = self.search(link)
|
||||
BeautifulSoup(result, "html.parser")
|
||||
|
||||
def get_ppn(self, searchterm: str) -> str | None:
|
||||
links = self.get_book_links(searchterm)
|
||||
ppn = None
|
||||
for link in links:
|
||||
result = self.search(link)
|
||||
BeautifulSoup(result, "html.parser")
|
||||
ppn = link.split("/")[-1]
|
||||
if ppn and regex.match(r"^\d{8,10}[X\d]?$", ppn):
|
||||
return ppn
|
||||
return ppn
|
||||
|
||||
def get_semesterapparat_number(self, searchterm: str) -> int:
|
||||
links = self.get_book_links(searchterm)
|
||||
for link in links:
|
||||
result = self.search(link)
|
||||
# in result search for class col-xs-12 rds-dl RDS_LOCATION
|
||||
# if found, return text of href
|
||||
soup = BeautifulSoup(result, "html.parser")
|
||||
|
||||
locations = soup.find_all("div", class_="col-xs-12 rds-dl RDS_LOCATION")
|
||||
for location_el in locations:
|
||||
if "Semesterapparat-" in location_el.text:
|
||||
match = regex.search(r"Semesterapparat-(\d+)", location_el.text)
|
||||
if match:
|
||||
return int(match.group(1))
|
||||
if "Handbibliothek-" in location_el.text:
|
||||
return location_el.text.strip().split("\n\n")[-1].strip()
|
||||
return location_el.text.strip().split("\n\n")[-1].strip()
|
||||
return 0
|
||||
|
||||
def get_author(self, link: str) -> str:
|
||||
links = self.get_book_links(f"kid:{link}")
|
||||
author = None
|
||||
for link in links:
|
||||
result = self.search(link)
|
||||
soup = BeautifulSoup(result, "html.parser")
|
||||
# get all authors, return them as a string seperated by ;
|
||||
authors = soup.find_all(
|
||||
"div",
|
||||
class_="col-xs-12 col-md-5 col-lg-4 rds-dl-head RDS_PERSON",
|
||||
)
|
||||
if authors:
|
||||
# get the names of the a href links in the div col-xs-12 col-md-7 col-lg-8 rds-dl-panel
|
||||
author_names = []
|
||||
for author in authors:
|
||||
panel = author.find_next_sibling(
|
||||
"div",
|
||||
class_="col-xs-12 col-md-7 col-lg-8 rds-dl-panel",
|
||||
)
|
||||
if panel:
|
||||
links = panel.find_all("a")
|
||||
for link in links:
|
||||
author_names.append(link.text.strip())
|
||||
author = "; ".join(author_names)
|
||||
return author
|
||||
|
||||
def get_signature(self, isbn: str):
|
||||
links = self.get_book_links(f"{isbn}")
|
||||
signature = None
|
||||
for link in links:
|
||||
result = self.search(link)
|
||||
soup = BeautifulSoup(result, "html.parser")
|
||||
panel = soup.select_one("div.panel-body")
|
||||
if panel:
|
||||
# Collect the RDS_* blocks in order, using the 'space' divs as separators
|
||||
groups = []
|
||||
cur = {}
|
||||
for node in panel.select(
|
||||
"div.rds-dl.RDS_SIGNATURE, div.rds-dl.RDS_STATUS, div.rds-dl.RDS_LOCATION, div.col-xs-12.space",
|
||||
):
|
||||
classes = node.get("class", [])
|
||||
# Separator between entries
|
||||
if "space" in classes:
|
||||
if cur:
|
||||
groups.append(cur)
|
||||
cur = {}
|
||||
continue
|
||||
|
||||
# Read the value from the corresponding panel cell
|
||||
val_el = node.select_one(".rds-dl-panel")
|
||||
val = (
|
||||
val_el.get_text(" ", strip=True)
|
||||
if val_el
|
||||
else node.get_text(" ", strip=True)
|
||||
)
|
||||
|
||||
if "RDS_SIGNATURE" in classes:
|
||||
cur["signature"] = val
|
||||
elif "RDS_STATUS" in classes:
|
||||
cur["status"] = val
|
||||
elif "RDS_LOCATION" in classes:
|
||||
cur["location"] = val
|
||||
|
||||
if cur: # append the last group if not followed by a space
|
||||
groups.append(cur)
|
||||
|
||||
# Find the signature for the entry whose location mentions "Semesterapparat"
|
||||
for g in groups:
|
||||
loc = g.get("location", "").lower()
|
||||
if "semesterapparat" in loc:
|
||||
signature = g.get("signature")
|
||||
return signature
|
||||
signature = g.get("signature")
|
||||
return signature
|
||||
print("No signature found")
|
||||
return signature
|
||||
|
||||
def in_library(self, ppn: str) -> bool:
|
||||
if ppn is None:
|
||||
return False
|
||||
links = self.get_book_links(f"kid:{ppn}")
|
||||
return len(links) > 0
|
||||
|
||||
def get_location(self, ppn: str) -> str | None:
|
||||
if ppn is None:
|
||||
return None
|
||||
link = self.get_book(f"{ppn}")
|
||||
if link is None:
|
||||
return None
|
||||
return link.library_location
|
||||
|
||||
def check_book_exists(self, searchterm: str) -> bool:
|
||||
links = self.get_book_links(searchterm)
|
||||
return len(links) > 0
|
||||
|
||||
1
src/bibapi/schemas/__init__.py
Normal file
1
src/bibapi/schemas/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
"""Schemas for the provided APIs."""
|
||||
82
src/bibapi/schemas/api_types.py
Normal file
82
src/bibapi/schemas/api_types.py
Normal file
@@ -0,0 +1,82 @@
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class PicaSchema(Enum):
|
||||
TITLE = "pica.tit"
|
||||
CALLSIGN = "pica.abr"
|
||||
ALL = "pica.all"
|
||||
DATE_FIRST_CREATION = "pica.ser"
|
||||
DATE_LAST_MODIFIED = "pica.aed"
|
||||
ISBN = "pica.isb"
|
||||
ISSN = "pica.isn"
|
||||
ISMN = "pica.ism"
|
||||
PPN = "pica.ppn"
|
||||
AUTHOR = "pica.per"
|
||||
YEAR = "pica.jhr"
|
||||
AUTHOR_SCHEMA = "NoSpaceAfterComma"
|
||||
LIBRARY = "pica.bib"
|
||||
ENCLOSE_TITLE_IN_QUOTES = False
|
||||
|
||||
|
||||
class ALMASchema(Enum):
|
||||
TITLE = "alma.title"
|
||||
AUTHOR = "alma.author"
|
||||
ENCLOSE_TITLE_IN_QUOTES = True
|
||||
AUTHOR_SCHEMA = "NoSpaceAfterComma"
|
||||
YEAR = "date_of_publication"
|
||||
|
||||
|
||||
class DublinCoreSchema(Enum):
|
||||
TITLE = "dc.title"
|
||||
AUTHOR = "dc.creator"
|
||||
AUTHOR_SCHEMA = "SpaceAfterComma"
|
||||
ENCLOSE_TITLE_IN_QUOTES = False
|
||||
YEAR = "dc.date"
|
||||
|
||||
|
||||
class CQLSchema(Enum):
|
||||
pass
|
||||
|
||||
|
||||
class SWBSchema(Enum):
|
||||
URL = "https://sru.k10plus.de/opac-de-627!rec=1?version=1.1&operation=searchRetrieve&query={}&maximumRecords=100&recordSchema=marcxml"
|
||||
ARGSCHEMA = PicaSchema
|
||||
NAME = "SWB"
|
||||
LIBRARY_NAME_LOCATION_FIELD = "924$b"
|
||||
|
||||
|
||||
class DNBSchema(Enum):
|
||||
URL = "https://services.dnb.de/sru/dnb?version=1.1&operation=searchRetrieve&query={}&maximumRecords=100&recordSchema=MARC21-xml"
|
||||
ARGSCHEMA = DublinCoreSchema
|
||||
NAME = "DNB"
|
||||
|
||||
|
||||
class KOBVSchema(Enum):
|
||||
URL = "https://sru.kobv.de/k2?version=1.1&operation=searchRetrieve&query={}&startRecord=1&maximumRecords=100&recordSchema=marcxml"
|
||||
ARGSCHEMA = DublinCoreSchema
|
||||
NAME = "KOBV"
|
||||
LIBRARY_NAME_LOCATION_FIELD = "924$b"
|
||||
|
||||
|
||||
class HebisSchema(Enum):
|
||||
URL = "http://sru.hebis.de/sru/DB=2.1?query={}&version=1.1&operation=searchRetrieve&stylesheet=http%3A%2F%2Fsru.hebis.de%2Fsru%2F%3Fxsl%3DsearchRetrieveResponse&recordSchema=marc21&maximumRecords=100&startRecord=1&recordPacking=xml&sortKeys=LST_Y%2Cpica%2C0%2C%2C"
|
||||
ARGSCHEMA = PicaSchema
|
||||
NOTSUPPORTEDARGS = ["YEAR"]
|
||||
NAME = "HEBIS"
|
||||
REPLACE = {" ": "+", "&": "%26", "=": "+%3D+"}
|
||||
LIBRARY_NAME_LOCATION_FIELD = "924$b"
|
||||
|
||||
|
||||
class OEVKSchema(Enum):
|
||||
URL = "https://sru.k10plus.de/opac-de-627-2?version=1.1&operation=searchRetrieve&query={}&maximumRecords=100&recordSchema=marcxml"
|
||||
ARGSCHEMA = PicaSchema
|
||||
NAME = "OEVK"
|
||||
LIBRARY_NAME_LOCATION_FIELD = "924$b"
|
||||
|
||||
|
||||
class HBZSchema(Enum):
|
||||
URL = "https://eu04.alma.exlibrisgroup.com/view/sru/49HBZ_NETWORK?version=1.2&operation=searchRetrieve&recordSchema=marcxml&query={}&maximumRecords=100&recordSchema=marcxml"
|
||||
ARGSCHEMA = ALMASchema
|
||||
NAME = "HBZ"
|
||||
LIBRARY_NAME_LOCATION_FIELD = "852$a"
|
||||
NOTSUPPORTEDARGS = ["PPN"]
|
||||
@@ -1,20 +1,33 @@
|
||||
"""A dataclass representing book data from the library system and catalogue."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Any, Optional, Union
|
||||
from typing import Any
|
||||
|
||||
import regex
|
||||
|
||||
|
||||
@dataclass
|
||||
class BookData:
|
||||
"""A dataclass representing the book object.
|
||||
|
||||
Returns
|
||||
-------
|
||||
self : BookData
|
||||
The book data object with attributes like title, author, year, etc.
|
||||
|
||||
"""
|
||||
|
||||
ppn: str | None = None
|
||||
title: str | None = None
|
||||
signature: str | None = None
|
||||
edition: str | None = None
|
||||
link: str | None = None
|
||||
isbn: Union[str, list[str], None] = field(default_factory=list)
|
||||
isbn: str | list[str] | None = field(default_factory=list[str])
|
||||
author: str | None = None
|
||||
language: Union[str, list[str], None] = field(default_factory=list)
|
||||
language: str | list[str] | None = field(default_factory=list[str])
|
||||
publisher: str | None = None
|
||||
place: str | None = None
|
||||
year: int | None = None
|
||||
@@ -23,10 +36,13 @@ class BookData:
|
||||
in_apparat: bool | None = False
|
||||
adis_idn: str | None = None
|
||||
old_book: Any | None = None
|
||||
media_type: str | None = None #
|
||||
media_type: str | None = None
|
||||
in_library: bool | None = None # whether the book is in the library or not
|
||||
libraries: list[str] | None = field(default_factory=list[str])
|
||||
medianr: int | None = None # media number
|
||||
|
||||
def __post_init__(self):
|
||||
def __post_init__(self) -> None:
|
||||
"""Run Post-initialization processing."""
|
||||
self.library_location = (
|
||||
str(self.library_location) if self.library_location else None
|
||||
)
|
||||
@@ -36,12 +52,12 @@ class BookData:
|
||||
self.year = regex.sub(r"[^\d]", "", str(self.year)) if self.year else None
|
||||
self.in_library = True if self.signature else False
|
||||
|
||||
def from_dict(self, data: dict) -> "BookData":
|
||||
def from_dict(self, data: dict[str, Any]) -> BookData:
|
||||
for key, value in data.items():
|
||||
setattr(self, key, value)
|
||||
return self
|
||||
|
||||
def merge(self, other: "BookData") -> "BookData":
|
||||
def merge(self, other: BookData) -> BookData:
|
||||
for key, value in other.__dict__.items():
|
||||
# merge lists, if the attribute is a list, extend it
|
||||
if isinstance(value, list):
|
||||
@@ -71,28 +87,28 @@ class BookData:
|
||||
key: value for key, value in self.__dict__.items() if value is not None
|
||||
}
|
||||
# remove old_book from data_dict
|
||||
if "old_book" in data_dict:
|
||||
del data_dict["old_book"]
|
||||
data_dict.pop("old_book", None)
|
||||
return json.dumps(data_dict, ensure_ascii=False)
|
||||
|
||||
def from_dataclass(self, dataclass: Optional[Any]) -> None:
|
||||
def from_dataclass(self, dataclass: Any | None) -> None:
|
||||
if dataclass is None:
|
||||
return
|
||||
for key, value in dataclass.__dict__.items():
|
||||
setattr(self, key, value)
|
||||
|
||||
def get_book_type(self) -> str:
|
||||
if "Online" in self.pages:
|
||||
return "eBook"
|
||||
else:
|
||||
if isinstance(self.media_type, str):
|
||||
if "Online" in self.pages:
|
||||
return "eBook"
|
||||
return "Druckausgabe"
|
||||
return None
|
||||
|
||||
def from_string(self, data: str) -> "BookData":
|
||||
def from_string(self, data: str) -> BookData:
|
||||
ndata = json.loads(data)
|
||||
|
||||
return BookData(**ndata)
|
||||
|
||||
def from_LehmannsSearchResult(self, result: Any) -> "BookData":
|
||||
def from_LehmannsSearchResult(self, result: Any) -> BookData:
|
||||
self.title = result.title
|
||||
self.author = "; ".join(result.authors) if result.authors else None
|
||||
self.edition = str(result.edition) if result.edition else None
|
||||
@@ -111,7 +127,7 @@ class BookData:
|
||||
return self
|
||||
|
||||
@property
|
||||
def edition_number(self) -> Optional[int]:
|
||||
def edition_number(self) -> int | None:
|
||||
if self.edition is None:
|
||||
return 0
|
||||
match = regex.search(r"(\d+)", self.edition)
|
||||
|
||||
10
src/bibapi/schemas/errors.py
Normal file
10
src/bibapi/schemas/errors.py
Normal file
@@ -0,0 +1,10 @@
|
||||
class BibAPIError(Exception):
|
||||
"""Base class for all BibAPI errors."""
|
||||
|
||||
|
||||
class CatalogueError(BibAPIError):
|
||||
"""Raised when there is an error with the library catalogue API."""
|
||||
|
||||
|
||||
class NetworkError(BibAPIError):
|
||||
"""Raised when there is a network-related error."""
|
||||
67
src/bibapi/schemas/marcxml.py
Normal file
67
src/bibapi/schemas/marcxml.py
Normal file
@@ -0,0 +1,67 @@
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
|
||||
# --- MARC XML structures ---
|
||||
@dataclass
|
||||
class ControlField:
|
||||
tag: str
|
||||
value: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class SubField:
|
||||
code: str
|
||||
value: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class DataField:
|
||||
tag: str
|
||||
ind1: str = " "
|
||||
ind2: str = " "
|
||||
subfields: list[SubField] = field(default_factory=list)
|
||||
|
||||
|
||||
@dataclass
|
||||
class MarcRecord:
|
||||
leader: str
|
||||
controlfields: list[ControlField] = field(default_factory=list)
|
||||
datafields: list[DataField] = field(default_factory=list)
|
||||
|
||||
|
||||
# --- SRU record wrapper ---
|
||||
@dataclass
|
||||
class Record:
|
||||
recordSchema: str
|
||||
recordPacking: str
|
||||
recordData: MarcRecord
|
||||
recordPosition: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class EchoedSearchRequest:
|
||||
version: str
|
||||
query: str
|
||||
maximumRecords: int
|
||||
recordPacking: str
|
||||
recordSchema: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class SearchRetrieveResponse:
|
||||
version: str
|
||||
numberOfRecords: int
|
||||
records: list[Record] = field(default_factory=list)
|
||||
echoedSearchRetrieveRequest: EchoedSearchRequest | None = None
|
||||
|
||||
|
||||
@dataclass
|
||||
class FormattedResponse:
|
||||
title: str
|
||||
edition: str | None = None
|
||||
publisher: str | None = None
|
||||
year: str | None = None
|
||||
authors: list[str] = field(default_factory=list)
|
||||
isbn: list[str] = field(default_factory=list)
|
||||
ppn: str | None = None
|
||||
libraries: list[str] = field(default_factory=list)
|
||||
@@ -1,84 +1,31 @@
|
||||
import re
|
||||
import time
|
||||
import xml.etree.ElementTree as ET
|
||||
from dataclasses import dataclass, field
|
||||
from collections.abc import Iterable
|
||||
from enum import Enum
|
||||
from typing import Dict, Iterable, List, Optional, Tuple, Union
|
||||
from typing import Any
|
||||
|
||||
import requests
|
||||
from requests.adapters import HTTPAdapter
|
||||
|
||||
# centralized logging used via src.shared.logging
|
||||
from .schemas.bookdata import BookData
|
||||
|
||||
# -----------------------
|
||||
# Dataclasses
|
||||
# -----------------------
|
||||
|
||||
|
||||
# --- MARC XML structures ---
|
||||
@dataclass
|
||||
class ControlField:
|
||||
tag: str
|
||||
value: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class SubField:
|
||||
code: str
|
||||
value: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class DataField:
|
||||
tag: str
|
||||
ind1: str = " "
|
||||
ind2: str = " "
|
||||
subfields: List[SubField] = field(default_factory=list)
|
||||
|
||||
|
||||
@dataclass
|
||||
class MarcRecord:
|
||||
leader: str
|
||||
controlfields: List[ControlField] = field(default_factory=list)
|
||||
datafields: List[DataField] = field(default_factory=list)
|
||||
|
||||
|
||||
# --- SRU record wrapper ---
|
||||
@dataclass
|
||||
class Record:
|
||||
recordSchema: str
|
||||
recordPacking: str
|
||||
recordData: MarcRecord
|
||||
recordPosition: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class EchoedSearchRequest:
|
||||
version: str
|
||||
query: str
|
||||
maximumRecords: int
|
||||
recordPacking: str
|
||||
recordSchema: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class SearchRetrieveResponse:
|
||||
version: str
|
||||
numberOfRecords: int
|
||||
records: List[Record] = field(default_factory=list)
|
||||
echoedSearchRetrieveRequest: Optional[EchoedSearchRequest] = None
|
||||
|
||||
|
||||
# -----------------------
|
||||
# Parser
|
||||
# -----------------------
|
||||
from .schemas.marcxml import (
|
||||
ControlField,
|
||||
DataField,
|
||||
EchoedSearchRequest,
|
||||
MarcRecord,
|
||||
Record,
|
||||
SearchRetrieveResponse,
|
||||
SubField,
|
||||
)
|
||||
|
||||
ZS = "http://www.loc.gov/zing/srw/"
|
||||
MARC = "http://www.loc.gov/MARC21/slim"
|
||||
NS = {"zs": ZS, "marc": MARC}
|
||||
|
||||
|
||||
def _text(elem: Optional[ET.Element]) -> str:
|
||||
def _text(elem: ET.Element | None) -> str:
|
||||
return (elem.text or "") if elem is not None else ""
|
||||
|
||||
|
||||
@@ -90,32 +37,32 @@ def _req_text(parent: ET.Element, path: str) -> str:
|
||||
|
||||
|
||||
def parse_marc_record(record_el: ET.Element) -> MarcRecord:
|
||||
"""
|
||||
record_el is the <marc:record> element (default ns MARC in your sample)
|
||||
"""
|
||||
"""record_el is the <marc:record> element (default ns MARC in your sample)"""
|
||||
# leader
|
||||
leader_text = _req_text(record_el, "marc:leader")
|
||||
|
||||
# controlfields
|
||||
controlfields: List[ControlField] = []
|
||||
controlfields: list[ControlField] = []
|
||||
for cf in record_el.findall("marc:controlfield", NS):
|
||||
tag = cf.get("tag", "").strip()
|
||||
controlfields.append(ControlField(tag=tag, value=_text(cf)))
|
||||
|
||||
# datafields
|
||||
datafields: List[DataField] = []
|
||||
datafields: list[DataField] = []
|
||||
for df in record_el.findall("marc:datafield", NS):
|
||||
tag = df.get("tag", "").strip()
|
||||
ind1 = df.get("ind1") or " "
|
||||
ind2 = df.get("ind2") or " "
|
||||
subfields: List[SubField] = []
|
||||
subfields: list[SubField] = []
|
||||
for sf in df.findall("marc:subfield", NS):
|
||||
code = sf.get("code", "")
|
||||
subfields.append(SubField(code=code, value=_text(sf)))
|
||||
datafields.append(DataField(tag=tag, ind1=ind1, ind2=ind2, subfields=subfields))
|
||||
|
||||
return MarcRecord(
|
||||
leader=leader_text, controlfields=controlfields, datafields=datafields
|
||||
leader=leader_text,
|
||||
controlfields=controlfields,
|
||||
datafields=datafields,
|
||||
)
|
||||
|
||||
|
||||
@@ -132,6 +79,7 @@ def parse_record(zs_record_el: ET.Element) -> Record:
|
||||
if marc_record_el is None:
|
||||
# If the MARC record uses default ns (xmlns="...") ElementTree still needs the ns-qualified name
|
||||
# We already searched with prefix; this covers both default and prefixed cases.
|
||||
return None
|
||||
raise ValueError("Missing MARC21 record inside zs:recordData")
|
||||
|
||||
marc_record = parse_marc_record(marc_record_el)
|
||||
@@ -145,7 +93,7 @@ def parse_record(zs_record_el: ET.Element) -> Record:
|
||||
)
|
||||
|
||||
|
||||
def parse_echoed_request(root: ET.Element) -> Optional[EchoedSearchRequest]:
|
||||
def parse_echoed_request(root: ET.Element) -> EchoedSearchRequest | None:
|
||||
el = root.find("zs:echoedSearchRetrieveRequest", NS)
|
||||
if el is None:
|
||||
return None
|
||||
@@ -172,7 +120,7 @@ def parse_echoed_request(root: ET.Element) -> Optional[EchoedSearchRequest]:
|
||||
|
||||
|
||||
def parse_search_retrieve_response(
|
||||
xml_str: Union[str, bytes],
|
||||
xml_str: str | bytes,
|
||||
) -> SearchRetrieveResponse:
|
||||
root = ET.fromstring(xml_str)
|
||||
|
||||
@@ -181,10 +129,12 @@ def parse_search_retrieve_response(
|
||||
numberOfRecords = int(_req_text(root, "zs:numberOfRecords") or "0")
|
||||
|
||||
records_parent = root.find("zs:records", NS)
|
||||
records: List[Record] = []
|
||||
records: list[Record] = []
|
||||
if records_parent is not None:
|
||||
for r in records_parent.findall("zs:record", NS):
|
||||
records.append(parse_record(r))
|
||||
record = parse_record(r)
|
||||
if record is not None:
|
||||
records.append(record)
|
||||
|
||||
echoed = parse_echoed_request(root)
|
||||
|
||||
@@ -201,9 +151,9 @@ def parse_search_retrieve_response(
|
||||
|
||||
def iter_datafields(
|
||||
rec: MarcRecord,
|
||||
tag: Optional[str] = None,
|
||||
ind1: Optional[str] = None,
|
||||
ind2: Optional[str] = None,
|
||||
tag: str | None = None,
|
||||
ind1: str | None = None,
|
||||
ind2: str | None = None,
|
||||
) -> Iterable[DataField]:
|
||||
"""Yield datafields, optionally filtered by tag/indicators."""
|
||||
for df in rec.datafields:
|
||||
@@ -221,11 +171,11 @@ def subfield_values(
|
||||
tag: str,
|
||||
code: str,
|
||||
*,
|
||||
ind1: Optional[str] = None,
|
||||
ind2: Optional[str] = None,
|
||||
) -> List[str]:
|
||||
ind1: str | None = None,
|
||||
ind2: str | None = None,
|
||||
) -> list[str]:
|
||||
"""All values for subfield `code` in every `tag` field (respecting indicators)."""
|
||||
out: List[str] = []
|
||||
out: list[str] = []
|
||||
for df in iter_datafields(rec, tag, ind1, ind2):
|
||||
out.extend(sf.value for sf in df.subfields if sf.code == code)
|
||||
return out
|
||||
@@ -236,10 +186,10 @@ def first_subfield_value(
|
||||
tag: str,
|
||||
code: str,
|
||||
*,
|
||||
ind1: Optional[str] = None,
|
||||
ind2: Optional[str] = None,
|
||||
default: Optional[str] = None,
|
||||
) -> Optional[str]:
|
||||
ind1: str | None = None,
|
||||
ind2: str | None = None,
|
||||
default: str | None = None,
|
||||
) -> str | None:
|
||||
"""First value for subfield `code` in `tag` (respecting indicators)."""
|
||||
for df in iter_datafields(rec, tag, ind1, ind2):
|
||||
for sf in df.subfields:
|
||||
@@ -252,25 +202,24 @@ def find_datafields_with_subfields(
|
||||
rec: MarcRecord,
|
||||
tag: str,
|
||||
*,
|
||||
where_all: Optional[Dict[str, str]] = None,
|
||||
where_any: Optional[Dict[str, str]] = None,
|
||||
where_all: dict[str, str] | None = None,
|
||||
where_any: dict[str, str] | None = None,
|
||||
casefold: bool = False,
|
||||
ind1: Optional[str] = None,
|
||||
ind2: Optional[str] = None,
|
||||
) -> List[DataField]:
|
||||
"""
|
||||
Return datafields of `tag` whose subfields match constraints:
|
||||
ind1: str | None = None,
|
||||
ind2: str | None = None,
|
||||
) -> list[DataField]:
|
||||
"""Return datafields of `tag` whose subfields match constraints:
|
||||
- where_all: every (code -> exact value) must be present
|
||||
- where_any: at least one (code -> exact value) present
|
||||
Set `casefold=True` for case-insensitive comparison.
|
||||
"""
|
||||
where_all = where_all or {}
|
||||
where_any = where_any or {}
|
||||
matched: List[DataField] = []
|
||||
matched: list[DataField] = []
|
||||
|
||||
for df in iter_datafields(rec, tag, ind1, ind2):
|
||||
# Map code -> list of values (with optional casefold applied)
|
||||
vals: Dict[str, List[str]] = {}
|
||||
vals: dict[str, list[str]] = {}
|
||||
for sf in df.subfields:
|
||||
v = sf.value.casefold() if casefold else sf.value
|
||||
vals.setdefault(sf.code, []).append(v)
|
||||
@@ -297,8 +246,10 @@ def find_datafields_with_subfields(
|
||||
|
||||
|
||||
def controlfield_value(
|
||||
rec: MarcRecord, tag: str, default: Optional[str] = None
|
||||
) -> Optional[str]:
|
||||
rec: MarcRecord,
|
||||
tag: str,
|
||||
default: str | None = None,
|
||||
) -> str | None:
|
||||
"""Get the first controlfield value by tag (e.g., '001', '005')."""
|
||||
for cf in rec.controlfields:
|
||||
if cf.tag == tag:
|
||||
@@ -307,8 +258,10 @@ def controlfield_value(
|
||||
|
||||
|
||||
def datafields_value(
|
||||
data: List[DataField], code: str, default: Optional[str] = None
|
||||
) -> Optional[str]:
|
||||
data: list[DataField],
|
||||
code: str,
|
||||
default: str | None = None,
|
||||
) -> str | None:
|
||||
"""Get the first value for a specific subfield code in a list of datafields."""
|
||||
for df in data:
|
||||
for sf in df.subfields:
|
||||
@@ -318,8 +271,10 @@ def datafields_value(
|
||||
|
||||
|
||||
def datafield_value(
|
||||
df: DataField, code: str, default: Optional[str] = None
|
||||
) -> Optional[str]:
|
||||
df: DataField,
|
||||
code: str,
|
||||
default: str | None = None,
|
||||
) -> str | None:
|
||||
"""Get the first value for a specific subfield code in a datafield."""
|
||||
for sf in df.subfields:
|
||||
if sf.code == code:
|
||||
@@ -327,9 +282,8 @@ def datafield_value(
|
||||
return default
|
||||
|
||||
|
||||
def _smart_join_title(a: str, b: Optional[str]) -> str:
|
||||
"""
|
||||
Join 245 $a and $b with MARC-style punctuation.
|
||||
def _smart_join_title(a: str, b: str | None) -> str:
|
||||
"""Join 245 $a and $b with MARC-style punctuation.
|
||||
If $b is present, join with ' : ' unless either side already supplies punctuation.
|
||||
"""
|
||||
a = a.strip()
|
||||
@@ -344,7 +298,7 @@ def _smart_join_title(a: str, b: Optional[str]) -> str:
|
||||
def subfield_values_from_fields(
|
||||
fields: Iterable[DataField],
|
||||
code: str,
|
||||
) -> List[str]:
|
||||
) -> list[str]:
|
||||
"""All subfield values with given `code` across a list of DataField."""
|
||||
return [sf.value for df in fields for sf in df.subfields if sf.code == code]
|
||||
|
||||
@@ -352,8 +306,8 @@ def subfield_values_from_fields(
|
||||
def first_subfield_value_from_fields(
|
||||
fields: Iterable[DataField],
|
||||
code: str,
|
||||
default: Optional[str] = None,
|
||||
) -> Optional[str]:
|
||||
default: str | None = None,
|
||||
) -> str | None:
|
||||
"""First subfield value with given `code` across a list of DataField."""
|
||||
for df in fields:
|
||||
for sf in df.subfields:
|
||||
@@ -365,12 +319,11 @@ def first_subfield_value_from_fields(
|
||||
def subfield_value_pairs_from_fields(
|
||||
fields: Iterable[DataField],
|
||||
code: str,
|
||||
) -> List[Tuple[DataField, str]]:
|
||||
"""
|
||||
Return (DataField, value) pairs for all subfields with `code`.
|
||||
) -> list[tuple[DataField, str]]:
|
||||
"""Return (DataField, value) pairs for all subfields with `code`.
|
||||
Useful if you need to know which field a value came from.
|
||||
"""
|
||||
out: List[Tuple[DataField, str]] = []
|
||||
out: list[tuple[DataField, str]] = []
|
||||
for df in fields:
|
||||
for sf in df.subfields:
|
||||
if sf.code == code:
|
||||
@@ -378,24 +331,30 @@ def subfield_value_pairs_from_fields(
|
||||
return out
|
||||
|
||||
|
||||
def book_from_marc(rec: MarcRecord) -> BookData:
|
||||
def book_from_marc(rec: MarcRecord, library_identifier: str) -> BookData:
|
||||
library_ident_tag = library_identifier.split("$")[0]
|
||||
library_ident_code = library_identifier.split("$")[1]
|
||||
# PPN from controlfield 001
|
||||
ppn = controlfield_value(rec, "001")
|
||||
|
||||
# Title = 245 $a + 245 $b (if present)
|
||||
t_a = first_subfield_value(rec, "245", "a")
|
||||
t_b = first_subfield_value(rec, "245", "b")
|
||||
t_b = "" # first_subfield_value(rec, "245", "b")
|
||||
title = _smart_join_title(t_a, t_b) if t_a else None
|
||||
|
||||
# Signature = 924 where $9 == "Frei 129" → take that field's $g
|
||||
frei_fields = find_datafields_with_subfields(
|
||||
rec, "924", where_all={"9": "Frei 129"}
|
||||
rec,
|
||||
"924",
|
||||
where_all={"9": "Frei 129"},
|
||||
)
|
||||
signature = first_subfield_value_from_fields(frei_fields, "g")
|
||||
|
||||
# Year = 264 $c (prefer ind2="1" publication; fallback to any 264)
|
||||
year = first_subfield_value(rec, "264", "c", ind2="1") or first_subfield_value(
|
||||
rec, "264", "c"
|
||||
rec,
|
||||
"264",
|
||||
"c",
|
||||
)
|
||||
isbn = subfield_values(rec, "020", "a")
|
||||
mediatype = first_subfield_value(rec, "338", "a")
|
||||
@@ -404,6 +363,7 @@ def book_from_marc(rec: MarcRecord) -> BookData:
|
||||
author = None
|
||||
if authors:
|
||||
author = "; ".join(authors)
|
||||
libraries = subfield_values(rec, library_ident_tag, library_ident_code)
|
||||
|
||||
return BookData(
|
||||
ppn=ppn,
|
||||
@@ -418,34 +378,18 @@ def book_from_marc(rec: MarcRecord) -> BookData:
|
||||
link="",
|
||||
author=author,
|
||||
media_type=mediatype,
|
||||
libraries=libraries,
|
||||
)
|
||||
|
||||
|
||||
class SWBData(Enum):
|
||||
URL = "https://sru.k10plus.de/opac-de-627!rec=1?version=1.1&operation=searchRetrieve&query={}&maximumRecords=100&recordSchema=marcxml"
|
||||
ARGSCHEMA = "pica."
|
||||
NAME = "SWB"
|
||||
|
||||
|
||||
class DNBData(Enum):
|
||||
URL = "https://services.dnb.de/sru/dnb?version=1.1&operation=searchRetrieve&query={}&maximumRecords=100&recordSchema=MARC21-xml"
|
||||
ARGSCHEMA = ""
|
||||
NAME = "DNB"
|
||||
|
||||
|
||||
class SRUSite(Enum):
|
||||
SWB = SWBData
|
||||
DNB = DNBData
|
||||
|
||||
|
||||
RVK_ALLOWED = r"[A-Z0-9.\-\/]" # conservative char set typically seen in RVK notations
|
||||
|
||||
|
||||
def find_newer_edition(
|
||||
swb_result: BookData, dnb_result: List[BookData]
|
||||
) -> Optional[List[BookData]]:
|
||||
"""
|
||||
New edition if:
|
||||
swb_result: BookData,
|
||||
dnb_result: list[BookData],
|
||||
) -> list[BookData] | None:
|
||||
"""New edition if:
|
||||
- year > swb.year OR
|
||||
- edition_number > swb.edition_number
|
||||
|
||||
@@ -457,7 +401,7 @@ def find_newer_edition(
|
||||
edition_number desc, best-signature-match desc, has-signature desc).
|
||||
"""
|
||||
|
||||
def norm_sig(s: Optional[str]) -> str:
|
||||
def norm_sig(s: str | None) -> str:
|
||||
if not s:
|
||||
return ""
|
||||
# normalize: lowercase, collapse whitespace, keep alnum + a few separators
|
||||
@@ -491,7 +435,7 @@ def find_newer_edition(
|
||||
swb_sig_norm = norm_sig(getattr(swb_result, "signature", None))
|
||||
|
||||
# 1) Filter to same-work AND newer
|
||||
candidates: List[BookData] = []
|
||||
candidates: list[BookData] = []
|
||||
for b in dnb_result:
|
||||
# Skip if both signatures exist and don't match (different work)
|
||||
b_sig = getattr(b, "signature", None)
|
||||
@@ -507,7 +451,7 @@ def find_newer_edition(
|
||||
return None
|
||||
|
||||
# 2) Dedupe by PPN, preferring signature (and matching signature if possible)
|
||||
by_ppn: dict[Optional[str], BookData] = {}
|
||||
by_ppn: dict[str | None, BookData] = {}
|
||||
for b in candidates:
|
||||
key = getattr(b, "ppn", None)
|
||||
prev = by_ppn.get(key)
|
||||
@@ -540,17 +484,74 @@ def find_newer_edition(
|
||||
return [best] if best else None
|
||||
|
||||
|
||||
class QueryTransformer:
|
||||
def __init__(self, api_schema: type[Enum], arguments: Iterable[str] | str):
|
||||
self.api_schema = api_schema
|
||||
if isinstance(arguments, str):
|
||||
self.arguments = [arguments]
|
||||
else:
|
||||
self.arguments = arguments
|
||||
self.drop_empty = True
|
||||
|
||||
def transform(self) -> dict[str, Any]:
|
||||
arguments: list[str] = []
|
||||
schema = self.api_schema
|
||||
for arg in self.arguments:
|
||||
if "=" not in arg:
|
||||
continue
|
||||
if self.drop_empty and arg.endswith("="):
|
||||
continue
|
||||
key, value = arg.split("=", 1)
|
||||
if hasattr(schema, key.upper()):
|
||||
api_key = getattr(schema, key.upper()).value
|
||||
if key.upper() == "AUTHOR" and hasattr(schema, "AUTHOR_SCHEMA"):
|
||||
author_schema = schema.AUTHOR_SCHEMA.value
|
||||
if author_schema == "SpaceAfterComma":
|
||||
value = value.replace(",", ", ")
|
||||
elif author_schema == "NoSpaceAfterComma":
|
||||
value = value.replace(", ", ",")
|
||||
value = value.replace(" ", " ")
|
||||
if key.upper() == "TITLE" and hasattr(
|
||||
schema,
|
||||
"ENCLOSE_TITLE_IN_QUOTES",
|
||||
):
|
||||
if schema.ENCLOSE_TITLE_IN_QUOTES:
|
||||
value = f'"{value}"'
|
||||
|
||||
arguments.append(f"{api_key}={value}")
|
||||
|
||||
return arguments
|
||||
|
||||
|
||||
class Api:
|
||||
def __init__(self, site: str, url: str, prefix: str):
|
||||
def __init__(
|
||||
self,
|
||||
site: str,
|
||||
url: str,
|
||||
prefix: type[Enum],
|
||||
library_identifier: str,
|
||||
notsupported_args: list[str] | None = None,
|
||||
replace: dict[str, str] | None = None,
|
||||
):
|
||||
self.site = site
|
||||
self.url = url
|
||||
self.prefix = prefix
|
||||
self.replace = replace or {}
|
||||
self.library_identifier = library_identifier
|
||||
self.notsupported_args = notsupported_args or []
|
||||
# Reuse TCP connections across requests for better performance
|
||||
self._session = requests.Session()
|
||||
# Slightly larger connection pool for concurrent calls
|
||||
adapter = HTTPAdapter(pool_connections=10, pool_maxsize=20)
|
||||
self._session.mount("http://", adapter)
|
||||
self._session.mount("https://", adapter)
|
||||
# Rate limiting and retry config
|
||||
self._last_request_time: float = 0.0
|
||||
self._rate_limit_seconds: float = 1.0
|
||||
self._max_retries: int = 5
|
||||
self._overall_timeout_seconds: float = (
|
||||
30.0 # max total time per logical request
|
||||
)
|
||||
|
||||
def close(self):
|
||||
try:
|
||||
@@ -562,39 +563,94 @@ class Api:
|
||||
# Best-effort cleanup
|
||||
self.close()
|
||||
|
||||
def get(self, query_args: Iterable[str]) -> List[Record]:
|
||||
def get(self, query_args: Iterable[str] | str) -> list[Record]:
|
||||
start_time = time.monotonic()
|
||||
# if any query_arg ends with =, remove it
|
||||
if self.site == "DNB":
|
||||
args = [arg for arg in query_args if not arg.startswith("pica.")]
|
||||
if args == []:
|
||||
raise ValueError("DNB queries must include at least one search term")
|
||||
query_args = args
|
||||
# query_args = [f"{self.prefix}{arg}" for arg in query_args]
|
||||
if isinstance(query_args, str):
|
||||
query_args = [query_args]
|
||||
if self.notsupported_args:
|
||||
query_args = [
|
||||
qa
|
||||
for qa in query_args
|
||||
if not any(qa.startswith(na + "=") for na in self.notsupported_args)
|
||||
]
|
||||
query_args = QueryTransformer(
|
||||
api_schema=self.prefix,
|
||||
arguments=query_args,
|
||||
).transform()
|
||||
query = "+and+".join(query_args)
|
||||
query = query.replace(" ", "%20").replace("&", "%26")
|
||||
# query_args = [arg for arg in query_args if not arg.endswith("=")]
|
||||
# query = "+and+".join(query_args)
|
||||
# query = query.replace(" ", "%20").replace("&", "%26")
|
||||
# insert the query into the url url is
|
||||
url = self.url.format(query)
|
||||
for old, new in self.replace.items():
|
||||
query = query.replace(old, new)
|
||||
|
||||
url = self.url.format(query)
|
||||
headers = {
|
||||
"User-Agent": f"{self.site} SRU Client, <alexander.kirchner@ph-freiburg.de>",
|
||||
"Accept": "application/xml",
|
||||
"Accept-Charset": "latin1,utf-8;q=0.7,*;q=0.3",
|
||||
}
|
||||
# Use persistent session and set timeouts to avoid hanging
|
||||
resp = self._session.get(url, headers=headers, timeout=(3.05, 60))
|
||||
if resp.status_code != 200:
|
||||
raise Exception(f"Error fetching data from SWB: {resp.status_code}")
|
||||
# Parse using raw bytes (original behavior) to preserve encoding edge cases
|
||||
sr = parse_search_retrieve_response(resp.content)
|
||||
return sr.records
|
||||
# Use persistent session, enforce 1 req/sec, and retry up to 5 times
|
||||
last_error: Exception | None = None
|
||||
for attempt in range(1, self._max_retries + 1):
|
||||
# Abort if overall timeout exceeded before starting attempt
|
||||
if time.monotonic() - start_time > self._overall_timeout_seconds:
|
||||
last_error = requests.exceptions.Timeout(
|
||||
f"Overall timeout {self._overall_timeout_seconds}s exceeded before attempt {attempt}",
|
||||
)
|
||||
break
|
||||
# Enforce rate limit relative to last request end
|
||||
now = time.monotonic()
|
||||
elapsed = now - self._last_request_time
|
||||
if elapsed < self._rate_limit_seconds:
|
||||
time.sleep(self._rate_limit_seconds - elapsed)
|
||||
|
||||
def getBooks(self, query_args: Iterable[str]) -> List[BookData]:
|
||||
records: List[Record] = self.get(query_args)
|
||||
try:
|
||||
# Per-attempt read timeout capped at remaining overall budget (but at most 30s)
|
||||
remaining = max(
|
||||
0.0,
|
||||
self._overall_timeout_seconds - (time.monotonic() - start_time),
|
||||
)
|
||||
read_timeout = min(30.0, remaining if remaining > 0 else 0.001)
|
||||
resp = self._session.get(
|
||||
url,
|
||||
headers=headers,
|
||||
timeout=(3.05, read_timeout),
|
||||
)
|
||||
self._last_request_time = time.monotonic()
|
||||
if resp.status_code == 200:
|
||||
# Parse using raw bytes (original behavior) to preserve encoding edge cases
|
||||
sr = parse_search_retrieve_response(resp.content)
|
||||
return sr.records
|
||||
last_error = Exception(
|
||||
f"Error fetching data from {self.site}: HTTP {resp.status_code} (attempt {attempt}/{self._max_retries})",
|
||||
)
|
||||
except requests.exceptions.ReadTimeout as e:
|
||||
last_error = e
|
||||
except requests.exceptions.Timeout as e:
|
||||
last_error = e
|
||||
except Exception as e:
|
||||
last_error = e
|
||||
|
||||
# Wait before the next attempt to respect rate limit between retries as well
|
||||
if attempt < self._max_retries:
|
||||
time.sleep(self._rate_limit_seconds)
|
||||
|
||||
# If we exit the loop, all attempts failed
|
||||
raise last_error if last_error else Exception("Unknown request failure")
|
||||
|
||||
def getBooks(self, query_args: Iterable[str] | str) -> list[BookData]:
|
||||
try:
|
||||
records: list[Record] = self.get(query_args)
|
||||
except requests.exceptions.ReadTimeout:
|
||||
# Return a list with a single empty BookData object on read timeout
|
||||
return [BookData()]
|
||||
except requests.exceptions.Timeout:
|
||||
# Overall timeout exceeded
|
||||
return [BookData()]
|
||||
except Exception:
|
||||
# Propagate other errors (could also choose to return empty list)
|
||||
raise
|
||||
# Avoid printing on hot paths; rely on logger if needed
|
||||
books: List[BookData] = []
|
||||
books: list[BookData] = []
|
||||
# extract title from query_args if present
|
||||
title = None
|
||||
for arg in query_args:
|
||||
@@ -602,7 +658,7 @@ class Api:
|
||||
title = arg.split("=")[1]
|
||||
break
|
||||
for rec in records:
|
||||
book = book_from_marc(rec.recordData)
|
||||
book = book_from_marc(rec.recordData, self.library_identifier)
|
||||
books.append(book)
|
||||
if title:
|
||||
books = [
|
||||
@@ -616,10 +672,5 @@ class Api:
|
||||
# Not implemented: depends on catalog front-end; return empty string for now
|
||||
return ""
|
||||
|
||||
|
||||
class SWB(Api):
|
||||
def __init__(self):
|
||||
self.site = SWBData.NAME.value
|
||||
self.url = SWBData.URL.value
|
||||
self.prefix = SWBData.ARGSCHEMA.value
|
||||
super().__init__(self.site, self.url, self.prefix)
|
||||
# def search(self, query_args: Union[Iterable[str], str]):
|
||||
# arguments =
|
||||
|
||||
313
src/bibapi/webrequest.py
Normal file
313
src/bibapi/webrequest.py
Normal file
@@ -0,0 +1,313 @@
|
||||
"""A module to request data from the internal catalogue data."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from enum import Enum
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
# import sleep_and_retry decorator to retry requests
|
||||
from ratelimit import limits, sleep_and_retry
|
||||
|
||||
from ._transformers import (
|
||||
RDS_AVAIL_DATA,
|
||||
RDS_GENERIC_DATA,
|
||||
ARRAYData,
|
||||
BibTeXData,
|
||||
COinSData,
|
||||
RDSData,
|
||||
RISData,
|
||||
)
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .schemas.bookdata import BookData
|
||||
|
||||
API_URL = "https://rds.ibs-bw.de/phfreiburg/opac/RDSIndexrecord/{}/"
|
||||
PPN_URL = "https://rds.ibs-bw.de/phfreiburg/opac/RDSIndex/Search?type0%5B%5D=allfields&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=au&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=ti&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=ct&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=isn&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=ta&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=co&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=py&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=pp&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=pu&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=si&lookfor0%5B%5D={}&join=AND&bool0%5B%5D=AND&type0%5B%5D=zr&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=cc&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND"
|
||||
BASE = "https://rds.ibs-bw.de"
|
||||
TITLE = "RDS_TITLE"
|
||||
SIGNATURE = "RDS_SIGNATURE"
|
||||
EDITION = "RDS_EDITION"
|
||||
ISBN = "RDS_ISBN"
|
||||
AUTHOR = "RDS_PERSON"
|
||||
ALLOWED_IPS = [
|
||||
"193.197.140.245", # PHFR Internal
|
||||
"193.197.140.249", # PHFR Eduroam
|
||||
]
|
||||
HEADERS = {
|
||||
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 \
|
||||
(HTML, like Gecko) Chromes/44.0.2403.157 Safari/537.36",
|
||||
"Accept-Language": "en-US, en;q=0.5",
|
||||
}
|
||||
RATE_LIMIT = 20
|
||||
RATE_PERIOD = 30
|
||||
|
||||
|
||||
class TransformerType(Enum):
|
||||
"""Enum for possible Transformer types."""
|
||||
|
||||
ARRAY = "ARRAY"
|
||||
COinS = "COinS"
|
||||
BibTeX = "BibTeX"
|
||||
RIS = "RIS"
|
||||
RDS = "RDS"
|
||||
|
||||
|
||||
class WebRequest:
|
||||
def __init__(self) -> None:
|
||||
"""Request data from the web, and format it depending on the mode."""
|
||||
self.apparat = None
|
||||
self.use_any = False # use any book that matches the search term
|
||||
self.signature = None
|
||||
self.ppn = None
|
||||
self.data = None
|
||||
self.timeout = 5
|
||||
self.public_ip = None
|
||||
self._can_run()
|
||||
if self.public_ip not in ALLOWED_IPS:
|
||||
e = f"IP {self.public_ip} not allowed to access the requested data"
|
||||
raise PermissionError(e)
|
||||
|
||||
def _can_run(self) -> None:
|
||||
"""Check if requests can be made."""
|
||||
try:
|
||||
# check public IP to see if the requested data can be accessed
|
||||
ip_response = requests.get("https://api.ipify.org", timeout=self.timeout)
|
||||
ip_response.raise_for_status()
|
||||
self.public_ip = ip_response.text
|
||||
except requests.exceptions.RequestException as e:
|
||||
raise ConnectionError("No internet connection") from e
|
||||
|
||||
if self.public_ip is None:
|
||||
raise ConnectionError("No internet connection")
|
||||
|
||||
@property
|
||||
def use_any_book(self):
|
||||
"""Use any book that matches the search term"""
|
||||
self.use_any = True
|
||||
return self
|
||||
|
||||
def set_apparat(self, apparat: int) -> WebRequest:
|
||||
self.apparat = apparat
|
||||
if int(self.apparat) < 10:
|
||||
self.apparat = f"0{self.apparat}"
|
||||
return self
|
||||
|
||||
def get_ppn(self, signature: str) -> WebRequest:
|
||||
self.signature = signature
|
||||
if "+" in signature:
|
||||
signature = signature.replace("+", "%2B")
|
||||
if "doi.org" in signature:
|
||||
signature = signature.split("/")[-1]
|
||||
self.ppn = signature
|
||||
return self
|
||||
|
||||
@sleep_and_retry
|
||||
@limits(calls=RATE_LIMIT, period=RATE_PERIOD)
|
||||
def search_book(self, searchterm: str) -> str:
|
||||
response = requests.get(PPN_URL.format(searchterm), timeout=self.timeout)
|
||||
return response.text
|
||||
|
||||
@sleep_and_retry
|
||||
@limits(calls=RATE_LIMIT, period=RATE_PERIOD)
|
||||
def search_ppn(self, ppn: str) -> str:
|
||||
response = requests.get(API_URL.format(ppn), timeout=self.timeout)
|
||||
return response.text
|
||||
|
||||
def get_book_links(self, searchterm: str) -> list[str]:
|
||||
response: str = self.search_book(searchterm) # type:ignore
|
||||
soup = BeautifulSoup(response, "html.parser")
|
||||
links = soup.find_all("a", class_="title getFull")
|
||||
res: list[str] = []
|
||||
for link in links:
|
||||
res.append(BASE + link["href"])
|
||||
return res
|
||||
|
||||
@sleep_and_retry
|
||||
@limits(calls=RATE_LIMIT, period=RATE_PERIOD)
|
||||
def search(self, link: str) -> str | None:
|
||||
try:
|
||||
response = requests.get(link, timeout=self.timeout)
|
||||
return response.text
|
||||
except requests.exceptions.RequestException:
|
||||
return None
|
||||
|
||||
def get_data(self) -> list[str] | None:
|
||||
links = self.get_book_links(self.ppn)
|
||||
return_data: list[str] = []
|
||||
for link in links:
|
||||
result: str = self.search(link) # type:ignore
|
||||
# in result search for class col-xs-12 rds-dl RDS_LOCATION
|
||||
# if found, return text of href
|
||||
soup = BeautifulSoup(result, "html.parser")
|
||||
locations = soup.find_all("div", class_="col-xs-12 rds-dl RDS_LOCATION")
|
||||
if locations:
|
||||
for location in locations:
|
||||
if "1. OG Semesterapparat" in location.text:
|
||||
pre_tag = soup.find_all("pre")
|
||||
return_data = []
|
||||
if pre_tag:
|
||||
for tag in pre_tag:
|
||||
data = tag.text.strip()
|
||||
return_data.append(data)
|
||||
return return_data
|
||||
return return_data
|
||||
item_location = location.find(
|
||||
"div",
|
||||
class_="col-xs-12 col-md-7 col-lg-8 rds-dl-panel",
|
||||
).text.strip()
|
||||
if self.use_any:
|
||||
pre_tag = soup.find_all("pre")
|
||||
if pre_tag:
|
||||
for tag in pre_tag:
|
||||
data = tag.text.strip()
|
||||
return_data.append(data)
|
||||
return return_data
|
||||
raise ValueError("No <pre> tag found")
|
||||
if f"Semesterapparat-{self.apparat}" in item_location:
|
||||
pre_tag = soup.find_all("pre")
|
||||
return_data = []
|
||||
if pre_tag:
|
||||
for tag in pre_tag:
|
||||
data = tag.text.strip()
|
||||
return_data.append(data)
|
||||
return return_data
|
||||
return return_data
|
||||
|
||||
return return_data
|
||||
|
||||
def get_data_elsa(self) -> list[str] | None:
|
||||
links = self.get_book_links(self.ppn)
|
||||
for link in links:
|
||||
result = self.search(link)
|
||||
# in result search for class col-xs-12 rds-dl RDS_LOCATION
|
||||
# if found, return text of href
|
||||
soup = BeautifulSoup(result, "html.parser")
|
||||
locations = soup.find_all("div", class_="col-xs-12 rds-dl RDS_LOCATION")
|
||||
if locations:
|
||||
for _ in locations:
|
||||
pre_tag = soup.find_all("pre")
|
||||
return_data = []
|
||||
if pre_tag:
|
||||
for tag in pre_tag:
|
||||
data = tag.text.strip()
|
||||
return_data.append(data)
|
||||
return return_data
|
||||
return None
|
||||
|
||||
|
||||
class BibTextTransformer:
|
||||
"""Transforms data from the web into a BibText format.
|
||||
|
||||
Valid Modes are ARRAY, COinS, BibTeX, RIS, RDS
|
||||
Raises:
|
||||
ValueError: Raised if mode is not in valid_modes
|
||||
"""
|
||||
|
||||
valid_modes = [
|
||||
TransformerType.ARRAY,
|
||||
TransformerType.COinS,
|
||||
TransformerType.BibTeX,
|
||||
TransformerType.RIS,
|
||||
TransformerType.RDS,
|
||||
]
|
||||
|
||||
def __init__(self, mode: TransformerType = TransformerType.ARRAY) -> None:
|
||||
self.mode = mode.value
|
||||
self.field = None
|
||||
self.signature = None
|
||||
if mode not in self.valid_modes:
|
||||
raise ValueError(f"Mode {mode} not valid")
|
||||
self.data = None
|
||||
# self.bookdata = BookData(**self.data)
|
||||
|
||||
def use_signature(self, signature: str) -> BibTextTransformer:
|
||||
"""Use the exact signature to search for the book"""
|
||||
self.signature = signature
|
||||
return self
|
||||
|
||||
def get_data(self, data: list[str] | None = None) -> BibTextTransformer:
|
||||
RIS_IDENT = "TY -"
|
||||
ARRAY_IDENT = "[kid]"
|
||||
COinS_IDENT = "ctx_ver"
|
||||
BIBTEX_IDENT = "@book"
|
||||
RDS_IDENT = "RDS ---------------------------------- "
|
||||
|
||||
if data is None:
|
||||
self.data = None
|
||||
return self
|
||||
|
||||
if self.mode == "RIS":
|
||||
for line in data:
|
||||
if RIS_IDENT in line:
|
||||
self.data = line
|
||||
elif self.mode == "ARRAY":
|
||||
for line in data:
|
||||
if ARRAY_IDENT in line:
|
||||
self.data = line
|
||||
elif self.mode == "COinS":
|
||||
for line in data:
|
||||
if COinS_IDENT in line:
|
||||
self.data = line
|
||||
elif self.mode == "BibTeX":
|
||||
for line in data:
|
||||
if BIBTEX_IDENT in line:
|
||||
self.data = line
|
||||
elif self.mode == "RDS":
|
||||
for line in data:
|
||||
if RDS_IDENT in line:
|
||||
self.data = line
|
||||
return self
|
||||
|
||||
def return_data(
|
||||
self,
|
||||
option: Any = None,
|
||||
) -> (
|
||||
BookData
|
||||
| None
|
||||
| RDS_GENERIC_DATA
|
||||
| RDS_AVAIL_DATA
|
||||
| dict[str, RDS_AVAIL_DATA | RDS_GENERIC_DATA]
|
||||
):
|
||||
"""Return Data to caller.
|
||||
|
||||
Args:
|
||||
option (string, optional): Option for RDS as there are two filetypes. Use rds_availability or rds_data. Anything else gives a dict of both responses. Defaults to None.
|
||||
|
||||
Returns:
|
||||
BookData: a dataclass containing data about the book
|
||||
|
||||
"""
|
||||
if self.data is None:
|
||||
return None
|
||||
match self.mode:
|
||||
case "ARRAY":
|
||||
return ARRAYData(self.signature).transform(self.data)
|
||||
case "COinS":
|
||||
return COinSData().transform(self.data)
|
||||
case "BibTeX":
|
||||
return BibTeXData().transform(self.data)
|
||||
case "RIS":
|
||||
return RISData().transform(self.data)
|
||||
case "RDS":
|
||||
return RDSData().transform(self.data).return_data(option)
|
||||
case _:
|
||||
return None
|
||||
|
||||
|
||||
def cover(isbn):
|
||||
test_url = f"https://www.buchhandel.de/cover/{isbn}/{isbn}-cover-m.jpg"
|
||||
data = requests.get(test_url, stream=True)
|
||||
return data.content
|
||||
|
||||
|
||||
def get_content(soup, css_class):
|
||||
return soup.find("div", class_=css_class).text.strip()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
link = "CU 8500 K64"
|
||||
data = WebRequest(71).get_ppn(link).get_data()
|
||||
bib = BibTextTransformer("ARRAY").get_data().return_data()
|
||||
13
test.py
Normal file
13
test.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from src.bibapi import SWB
|
||||
from src.bibapi.sru import PicaSchema, QueryTransformer
|
||||
|
||||
s_title = "TITLE=Java ist auch eine Insel"
|
||||
s_author = "AUTHOR=Ullenboom,Christian"
|
||||
|
||||
arguments = ["PPN=1172719780"]
|
||||
transformed = QueryTransformer(api_schema=PicaSchema, arguments=arguments).transform()
|
||||
print(transformed)
|
||||
|
||||
result = SWB().getBooks(transformed)
|
||||
for book in result:
|
||||
print(book)
|
||||
1
tests/__init__.py
Normal file
1
tests/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
"""Tests for the package."""
|
||||
151
tests/conftest.py
Normal file
151
tests/conftest.py
Normal file
@@ -0,0 +1,151 @@
|
||||
"""Shared pytest fixtures for BibAPI tests."""
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_marc_record_xml() -> str:
|
||||
"""Sample MARC record XML for testing."""
|
||||
return """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<marc:record xmlns:marc="http://www.loc.gov/MARC21/slim">
|
||||
<marc:leader>00000nam a22000001i 4500</marc:leader>
|
||||
<marc:controlfield tag="001">123456789</marc:controlfield>
|
||||
<marc:controlfield tag="005">20230101120000.0</marc:controlfield>
|
||||
<marc:datafield tag="020" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">9783123456789</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="041" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">ger</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="245" ind1="1" ind2="0">
|
||||
<marc:subfield code="a">Test Book Title</marc:subfield>
|
||||
<marc:subfield code="b">A Subtitle</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="250" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">2nd edition</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="264" ind1=" " ind2="1">
|
||||
<marc:subfield code="a">Berlin</marc:subfield>
|
||||
<marc:subfield code="b">Test Publisher</marc:subfield>
|
||||
<marc:subfield code="c">2023</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="300" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">456 pages</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="338" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">Band</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="700" ind1="1" ind2=" ">
|
||||
<marc:subfield code="a">Author, Test</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="924" ind1=" " ind2=" ">
|
||||
<marc:subfield code="9">Frei 129</marc:subfield>
|
||||
<marc:subfield code="g">ABC 123</marc:subfield>
|
||||
<marc:subfield code="b">DE-Frei129</marc:subfield>
|
||||
</marc:datafield>
|
||||
</marc:record>"""
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_sru_response_xml() -> bytes:
|
||||
"""Sample SRU searchRetrieveResponse XML for testing."""
|
||||
return b"""<?xml version="1.0" encoding="UTF-8"?>
|
||||
<zs:searchRetrieveResponse xmlns:zs="http://www.loc.gov/zing/srw/"
|
||||
xmlns:marc="http://www.loc.gov/MARC21/slim">
|
||||
<zs:version>1.1</zs:version>
|
||||
<zs:numberOfRecords>1</zs:numberOfRecords>
|
||||
<zs:records>
|
||||
<zs:record>
|
||||
<zs:recordSchema>marcxml</zs:recordSchema>
|
||||
<zs:recordPacking>xml</zs:recordPacking>
|
||||
<zs:recordData>
|
||||
<marc:record>
|
||||
<marc:leader>00000nam a22</marc:leader>
|
||||
<marc:controlfield tag="001">123456789</marc:controlfield>
|
||||
<marc:datafield tag="020" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">9783123456789</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="041" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">ger</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="245" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">Test Book</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="250" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">1st edition</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="264" ind1=" " ind2="1">
|
||||
<marc:subfield code="b">Publisher</marc:subfield>
|
||||
<marc:subfield code="c">2023</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="300" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">200 pages</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="338" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">Band</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="700" ind1="1" ind2=" ">
|
||||
<marc:subfield code="a">Author, Test</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="924" ind1=" " ind2=" ">
|
||||
<marc:subfield code="b">DE-Frei129</marc:subfield>
|
||||
</marc:datafield>
|
||||
</marc:record>
|
||||
</zs:recordData>
|
||||
<zs:recordPosition>1</zs:recordPosition>
|
||||
</zs:record>
|
||||
</zs:records>
|
||||
<zs:echoedSearchRetrieveRequest>
|
||||
<zs:version>1.1</zs:version>
|
||||
<zs:query>pica.tit=Test</zs:query>
|
||||
<zs:maximumRecords>100</zs:maximumRecords>
|
||||
<zs:recordPacking>xml</zs:recordPacking>
|
||||
<zs:recordSchema>marcxml</zs:recordSchema>
|
||||
</zs:echoedSearchRetrieveRequest>
|
||||
</zs:searchRetrieveResponse>"""
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_catalogue_html() -> str:
|
||||
"""Sample HTML response from catalogue search."""
|
||||
return """<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<a class="title getFull" href="/opac/record/123">Book Title</a>
|
||||
</body>
|
||||
</html>"""
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_catalogue_detail_html() -> str:
|
||||
"""Sample HTML response from catalogue book detail page."""
|
||||
return """<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<div class="headline text">Test Book Title</div>
|
||||
<div class="col-xs-12 col-md-5 col-lg-4 rds-dl-head RDS_PPN"></div>
|
||||
<div class="col-xs-12 col-md-7 col-lg-8 rds-dl-panel">123456789</div>
|
||||
<div class="col-xs-12 col-md-5 col-lg-4 rds-dl-head RDS_EDITION"></div>
|
||||
<div class="col-xs-12 col-md-7 col-lg-8 rds-dl-panel">2nd ed.</div>
|
||||
<div class="col-xs-12 col-md-5 col-lg-4 rds-dl-head RDS_PERSON"></div>
|
||||
<div class="col-xs-12 col-md-7 col-lg-8 rds-dl-panel">
|
||||
<a href="#">Author One</a>
|
||||
<a href="#">Author Two</a>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="rds-dl RDS_SIGNATURE">
|
||||
<div class="rds-dl-panel">ABC 123</div>
|
||||
</div>
|
||||
<div class="rds-dl RDS_STATUS">
|
||||
<div class="rds-dl-panel">Available</div>
|
||||
</div>
|
||||
<div class="rds-dl RDS_LOCATION">
|
||||
<div class="rds-dl-panel">Main Library</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="RDS_ISBN"></div>
|
||||
<div class="col-xs-12 col-md-7 col-lg-8 rds-dl-panel">9783123456789</div>
|
||||
<div class="RDS_SCOPE"></div>
|
||||
<div class="col-xs-12 col-md-7 col-lg-8 rds-dl-panel">300 pages</div>
|
||||
</body>
|
||||
</html>"""
|
||||
309
tests/test_catalogue.py
Normal file
309
tests/test_catalogue.py
Normal file
@@ -0,0 +1,309 @@
|
||||
"""Tests for the Catalogue class, which interacts with the library catalogue."""
|
||||
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
import requests
|
||||
from pytest_mock import MockerFixture
|
||||
|
||||
from bibapi.catalogue import Catalogue
|
||||
|
||||
|
||||
class TestCatalogue:
|
||||
"""Tests for the Catalogue class."""
|
||||
|
||||
def test_catalogue_initialization(self, mocker: MockerFixture):
|
||||
"""Test Catalogue initialization."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
catalogue = Catalogue()
|
||||
assert catalogue.timeout == 15
|
||||
|
||||
def test_catalogue_custom_timeout(self, mocker: MockerFixture):
|
||||
"""Test Catalogue initialization with custom timeout."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
catalogue = Catalogue(timeout=30)
|
||||
assert catalogue.timeout == 30
|
||||
|
||||
def test_check_book_exists(self, mocker: MockerFixture):
|
||||
"""Test the check_book_exists method of the Catalogue class."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
catalogue = Catalogue()
|
||||
|
||||
# Mock the get_book_links method to control its output
|
||||
mocker.patch.object(
|
||||
catalogue,
|
||||
"get_book_links",
|
||||
return_value=["link1", "link2"],
|
||||
)
|
||||
|
||||
# Test with a known existing book
|
||||
existing_book_searchterm = "1693321114"
|
||||
assert catalogue.check_book_exists(existing_book_searchterm) is True
|
||||
|
||||
# Change the mock to return an empty list for non-existing book
|
||||
mocker.patch.object(
|
||||
catalogue,
|
||||
"get_book_links",
|
||||
return_value=[],
|
||||
)
|
||||
|
||||
# Test with a known non-existing book
|
||||
non_existing_book_searchterm = "00000000009"
|
||||
assert catalogue.check_book_exists(non_existing_book_searchterm) is False
|
||||
|
||||
def test_no_connection_raises_error(self, mocker: MockerFixture):
|
||||
"""Test that a ConnectionError is raised with no internet connection."""
|
||||
# Mock the check_connection method to simulate no internet connection
|
||||
mocker.patch.object(
|
||||
Catalogue,
|
||||
"check_connection",
|
||||
return_value=False,
|
||||
)
|
||||
|
||||
with pytest.raises(ConnectionError, match="No internet connection available."):
|
||||
Catalogue()
|
||||
|
||||
def test_check_connection_success(self, mocker: MockerFixture):
|
||||
"""Test check_connection returns True on success."""
|
||||
mock_response = MagicMock()
|
||||
mock_response.status_code = 200
|
||||
mocker.patch("requests.get", return_value=mock_response)
|
||||
|
||||
catalogue = Catalogue.__new__(Catalogue)
|
||||
catalogue.timeout = 15
|
||||
assert catalogue.check_connection() is True
|
||||
|
||||
def test_check_connection_failure(self, mocker: MockerFixture):
|
||||
"""Test check_connection handles request exception."""
|
||||
mocker.patch(
|
||||
"requests.get",
|
||||
side_effect=requests.exceptions.RequestException("Network error"),
|
||||
)
|
||||
|
||||
catalogue = Catalogue.__new__(Catalogue)
|
||||
catalogue.timeout = 15
|
||||
result = catalogue.check_connection()
|
||||
assert result is None # Returns None on exception
|
||||
|
||||
def test_search_book(self, mocker: MockerFixture):
|
||||
"""Test search_book method."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mock_response = MagicMock()
|
||||
mock_response.text = "<html>search results</html>"
|
||||
mocker.patch("requests.get", return_value=mock_response)
|
||||
|
||||
catalogue = Catalogue()
|
||||
result = catalogue.search_book("test search")
|
||||
assert result == "<html>search results</html>"
|
||||
|
||||
def test_search(self, mocker: MockerFixture):
|
||||
"""Test search method."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mock_response = MagicMock()
|
||||
mock_response.text = "<html>detail page</html>"
|
||||
mocker.patch("requests.get", return_value=mock_response)
|
||||
|
||||
catalogue = Catalogue()
|
||||
result = catalogue.search("https://example.com/book/123")
|
||||
assert result == "<html>detail page</html>"
|
||||
|
||||
def test_get_book_links(self, mocker: MockerFixture, mock_catalogue_html):
|
||||
"""Test get_book_links method."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(
|
||||
Catalogue,
|
||||
"search_book",
|
||||
return_value=mock_catalogue_html,
|
||||
)
|
||||
|
||||
catalogue = Catalogue()
|
||||
links = catalogue.get_book_links("test search")
|
||||
|
||||
assert len(links) == 1
|
||||
assert "https://rds.ibs-bw.de/opac/record/123" in links[0]
|
||||
|
||||
def test_in_library_with_ppn(self, mocker: MockerFixture):
|
||||
"""Test in_library method with valid PPN."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(
|
||||
Catalogue,
|
||||
"get_book_links",
|
||||
return_value=["link1"],
|
||||
)
|
||||
|
||||
catalogue = Catalogue()
|
||||
assert catalogue.in_library("123456789") is True
|
||||
|
||||
def test_in_library_without_ppn(self, mocker: MockerFixture):
|
||||
"""Test in_library method with None PPN."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
|
||||
catalogue = Catalogue()
|
||||
assert catalogue.in_library(None) is False
|
||||
|
||||
def test_in_library_not_found(self, mocker: MockerFixture):
|
||||
"""Test in_library method when book not found."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(
|
||||
Catalogue,
|
||||
"get_book_links",
|
||||
return_value=[],
|
||||
)
|
||||
|
||||
catalogue = Catalogue()
|
||||
assert catalogue.in_library("nonexistent") is False
|
||||
|
||||
def test_get_location_none_ppn(self, mocker: MockerFixture):
|
||||
"""Test get_location method with None PPN."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
|
||||
catalogue = Catalogue()
|
||||
assert catalogue.get_location(None) is None
|
||||
|
||||
def test_get_location_not_found(self, mocker: MockerFixture):
|
||||
"""Test get_location when book not found."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(Catalogue, "get_book", return_value=None)
|
||||
|
||||
catalogue = Catalogue()
|
||||
assert catalogue.get_location("123") is None
|
||||
|
||||
def test_get_ppn(self, mocker: MockerFixture):
|
||||
"""Test get_ppn method with valid PPN format."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(
|
||||
Catalogue,
|
||||
"get_book_links",
|
||||
return_value=["https://example.com/opac/record/1234567890"],
|
||||
)
|
||||
mocker.patch.object(Catalogue, "search", return_value="<html></html>")
|
||||
|
||||
catalogue = Catalogue()
|
||||
ppn = catalogue.get_ppn("test")
|
||||
assert ppn == "1234567890"
|
||||
|
||||
def test_get_ppn_with_x(self, mocker: MockerFixture):
|
||||
"""Test get_ppn method with PPN ending in X."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(
|
||||
Catalogue,
|
||||
"get_book_links",
|
||||
return_value=["https://example.com/opac/record/123456789X"],
|
||||
)
|
||||
mocker.patch.object(Catalogue, "search", return_value="<html></html>")
|
||||
|
||||
catalogue = Catalogue()
|
||||
ppn = catalogue.get_ppn("test")
|
||||
assert ppn == "123456789X"
|
||||
|
||||
def test_get_semesterapparat_number(self, mocker: MockerFixture):
|
||||
"""Test get_semesterapparat_number method."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(
|
||||
Catalogue,
|
||||
"get_book_links",
|
||||
return_value=["https://example.com/book"],
|
||||
)
|
||||
|
||||
html = """<html>
|
||||
<div class="col-xs-12 rds-dl RDS_LOCATION">
|
||||
Semesterapparat-42
|
||||
</div>
|
||||
</html>"""
|
||||
mocker.patch.object(Catalogue, "search", return_value=html)
|
||||
|
||||
catalogue = Catalogue()
|
||||
result = catalogue.get_semesterapparat_number("test")
|
||||
assert result == 42
|
||||
|
||||
def test_get_semesterapparat_number_handbibliothek(self, mocker: MockerFixture):
|
||||
"""Test get_semesterapparat_number with Handbibliothek location."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(
|
||||
Catalogue,
|
||||
"get_book_links",
|
||||
return_value=["https://example.com/book"],
|
||||
)
|
||||
|
||||
html = """<html>
|
||||
<div class="col-xs-12 rds-dl RDS_LOCATION">
|
||||
Floor 1
|
||||
|
||||
Handbibliothek-Reference
|
||||
</div>
|
||||
</html>"""
|
||||
mocker.patch.object(Catalogue, "search", return_value=html)
|
||||
|
||||
catalogue = Catalogue()
|
||||
result = catalogue.get_semesterapparat_number("test")
|
||||
assert "Reference" in str(result) or "Handbibliothek" in str(result)
|
||||
|
||||
def test_get_semesterapparat_number_not_found(self, mocker: MockerFixture):
|
||||
"""Test get_semesterapparat_number when not found."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(Catalogue, "get_book_links", return_value=[])
|
||||
|
||||
catalogue = Catalogue()
|
||||
result = catalogue.get_semesterapparat_number("test")
|
||||
assert result == 0
|
||||
|
||||
def test_get_author(self, mocker: MockerFixture):
|
||||
"""Test get_author method."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(
|
||||
Catalogue,
|
||||
"get_book_links",
|
||||
return_value=["https://example.com/book"],
|
||||
)
|
||||
|
||||
html = """<html>
|
||||
<div class="col-xs-12 col-md-5 col-lg-4 rds-dl-head RDS_PERSON"></div>
|
||||
<div class="col-xs-12 col-md-7 col-lg-8 rds-dl-panel">
|
||||
<a href="#">Author One</a>
|
||||
<a href="#">Author Two</a>
|
||||
</div>
|
||||
</html>"""
|
||||
mocker.patch.object(Catalogue, "search", return_value=html)
|
||||
|
||||
catalogue = Catalogue()
|
||||
author = catalogue.get_author("kid:123")
|
||||
assert "Author One" in author
|
||||
assert "Author Two" in author
|
||||
assert "; " in author # Separator
|
||||
|
||||
def test_get_signature(self, mocker: MockerFixture):
|
||||
"""Test get_signature method."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(
|
||||
Catalogue,
|
||||
"get_book_links",
|
||||
return_value=["https://example.com/book"],
|
||||
)
|
||||
|
||||
html = """<html>
|
||||
<div class="panel-body">
|
||||
<div class="rds-dl RDS_SIGNATURE">
|
||||
<div class="rds-dl-panel">ABC 123</div>
|
||||
</div>
|
||||
<div class="rds-dl RDS_STATUS">
|
||||
<div class="rds-dl-panel">Available</div>
|
||||
</div>
|
||||
<div class="rds-dl RDS_LOCATION">
|
||||
<div class="rds-dl-panel">Semesterapparat-1</div>
|
||||
</div>
|
||||
</div>
|
||||
</html>"""
|
||||
mocker.patch.object(Catalogue, "search", return_value=html)
|
||||
|
||||
catalogue = Catalogue()
|
||||
signature = catalogue.get_signature("9783123456789")
|
||||
assert signature == "ABC 123"
|
||||
|
||||
def test_get_signature_not_found(self, mocker: MockerFixture):
|
||||
"""Test get_signature when not found."""
|
||||
mocker.patch.object(Catalogue, "check_connection", return_value=True)
|
||||
mocker.patch.object(Catalogue, "get_book_links", return_value=[])
|
||||
|
||||
catalogue = Catalogue()
|
||||
signature = catalogue.get_signature("nonexistent")
|
||||
assert signature is None
|
||||
112
tests/test_init.py
Normal file
112
tests/test_init.py
Normal file
@@ -0,0 +1,112 @@
|
||||
"""Tests for the __init__.py wrapper classes."""
|
||||
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
import requests
|
||||
|
||||
from bibapi import DNB, HBZ, HEBIS, KOBV, OEVK, SWB
|
||||
from bibapi.schemas.api_types import (
|
||||
ALMASchema,
|
||||
DublinCoreSchema,
|
||||
PicaSchema,
|
||||
)
|
||||
|
||||
|
||||
class TestSWBWrapper:
|
||||
"""Tests for the SWB wrapper class."""
|
||||
|
||||
def test_swb_initialization(self):
|
||||
"""Test SWB initializes with correct config."""
|
||||
api = SWB()
|
||||
assert api.site == "SWB"
|
||||
assert "sru.k10plus.de" in api.url
|
||||
assert api.prefix == PicaSchema
|
||||
assert api.library_identifier == "924$b"
|
||||
api.close()
|
||||
|
||||
@patch.object(requests.Session, "get")
|
||||
def test_swb_getbooks(self, mock_get):
|
||||
"""Test SWB getBooks method."""
|
||||
mock_response = MagicMock()
|
||||
mock_response.status_code = 200
|
||||
mock_response.content = b"""<?xml version="1.0"?>
|
||||
<zs:searchRetrieveResponse xmlns:zs="http://www.loc.gov/zing/srw/">
|
||||
<zs:version>1.1</zs:version>
|
||||
<zs:numberOfRecords>0</zs:numberOfRecords>
|
||||
</zs:searchRetrieveResponse>"""
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
api = SWB()
|
||||
books = api.getBooks(["TITLE=Test"])
|
||||
assert isinstance(books, list)
|
||||
api.close()
|
||||
|
||||
|
||||
class TestDNBWrapper:
|
||||
"""Tests for the DNB wrapper class."""
|
||||
|
||||
def test_dnb_initialization(self):
|
||||
"""Test DNB initializes with correct config.
|
||||
|
||||
Note: DNB class has a bug - it doesn't set library_identifier before
|
||||
calling super().__init__. This test documents the bug.
|
||||
"""
|
||||
# DNB has a bug - library_identifier is not set
|
||||
with pytest.raises(AttributeError, match="library_identifier"):
|
||||
api = DNB()
|
||||
|
||||
|
||||
class TestKOBVWrapper:
|
||||
"""Tests for the KOBV wrapper class."""
|
||||
|
||||
def test_kobv_initialization(self):
|
||||
"""Test KOBV initializes with correct config."""
|
||||
api = KOBV()
|
||||
assert api.site == "KOBV"
|
||||
assert "sru.kobv.de" in api.url
|
||||
assert api.prefix == DublinCoreSchema
|
||||
assert api.library_identifier == "924$b"
|
||||
api.close()
|
||||
|
||||
|
||||
class TestHEBISWrapper:
|
||||
"""Tests for the HEBIS wrapper class."""
|
||||
|
||||
def test_hebis_initialization(self):
|
||||
"""Test HEBIS initializes with correct config."""
|
||||
api = HEBIS()
|
||||
assert api.site == "HEBIS"
|
||||
assert "sru.hebis.de" in api.url
|
||||
assert api.prefix == PicaSchema
|
||||
assert api.library_identifier == "924$b"
|
||||
# HEBIS has specific replace patterns
|
||||
assert " " in api.replace
|
||||
# HEBIS has unsupported args
|
||||
assert "YEAR" in api.notsupported_args
|
||||
api.close()
|
||||
|
||||
|
||||
class TestOEVKWrapper:
|
||||
"""Tests for the OEVK wrapper class."""
|
||||
|
||||
def test_oevk_initialization(self):
|
||||
"""Test OEVK initializes with correct config."""
|
||||
api = OEVK()
|
||||
assert api.site == "OEVK"
|
||||
assert api.prefix == PicaSchema
|
||||
assert api.library_identifier == "924$b"
|
||||
api.close()
|
||||
|
||||
|
||||
class TestHBZWrapper:
|
||||
"""Tests for the HBZ wrapper class."""
|
||||
|
||||
def test_hbz_initialization(self):
|
||||
"""Test HBZ initializes with correct config."""
|
||||
api = HBZ()
|
||||
assert api.site == "HBZ"
|
||||
assert "alma.exlibrisgroup.com" in api.url
|
||||
assert api.prefix == ALMASchema
|
||||
assert api.library_identifier == "852$a"
|
||||
api.close()
|
||||
486
tests/test_marcxml_parser.py
Normal file
486
tests/test_marcxml_parser.py
Normal file
@@ -0,0 +1,486 @@
|
||||
"""Tests for MARCXML parsing functions in sru.py."""
|
||||
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
|
||||
from bibapi.schemas.marcxml import (
|
||||
DataField,
|
||||
SubField,
|
||||
)
|
||||
from bibapi.sru import (
|
||||
_smart_join_title,
|
||||
_text,
|
||||
controlfield_value,
|
||||
datafield_value,
|
||||
datafields_value,
|
||||
find_datafields_with_subfields,
|
||||
first_subfield_value,
|
||||
first_subfield_value_from_fields,
|
||||
iter_datafields,
|
||||
parse_marc_record,
|
||||
parse_search_retrieve_response,
|
||||
subfield_values,
|
||||
subfield_values_from_fields,
|
||||
)
|
||||
|
||||
# --- Fixtures for sample XML data ---
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def minimal_marc_xml() -> str:
|
||||
"""Minimal MARC record XML string."""
|
||||
return """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<marc:record xmlns:marc="http://www.loc.gov/MARC21/slim">
|
||||
<marc:leader>00000nam a22000001i 4500</marc:leader>
|
||||
<marc:controlfield tag="001">PPN12345</marc:controlfield>
|
||||
<marc:controlfield tag="005">20230101120000.0</marc:controlfield>
|
||||
<marc:datafield tag="245" ind1="1" ind2="0">
|
||||
<marc:subfield code="a">Test Title</marc:subfield>
|
||||
<marc:subfield code="b">A Subtitle</marc:subfield>
|
||||
</marc:datafield>
|
||||
</marc:record>"""
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def full_marc_xml() -> str:
|
||||
"""More complete MARC record for testing."""
|
||||
return """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<marc:record xmlns:marc="http://www.loc.gov/MARC21/slim">
|
||||
<marc:leader>00000nam a22000001i 4500</marc:leader>
|
||||
<marc:controlfield tag="001">PPN98765</marc:controlfield>
|
||||
<marc:controlfield tag="005">20231215150000.0</marc:controlfield>
|
||||
<marc:controlfield tag="008">230101s2023 gw 000 0 ger d</marc:controlfield>
|
||||
<marc:datafield tag="020" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">9783123456789</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="020" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">9783987654321</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="041" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">ger</marc:subfield>
|
||||
<marc:subfield code="a">eng</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="245" ind1="1" ind2="0">
|
||||
<marc:subfield code="a">Comprehensive Test Book</marc:subfield>
|
||||
<marc:subfield code="b">With Many Details</marc:subfield>
|
||||
<marc:subfield code="c">by Author Name</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="250" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">3rd edition</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="264" ind1=" " ind2="1">
|
||||
<marc:subfield code="a">Berlin</marc:subfield>
|
||||
<marc:subfield code="b">Test Publisher</marc:subfield>
|
||||
<marc:subfield code="c">2023</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="300" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">456 pages</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="338" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">Band</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="700" ind1="1" ind2=" ">
|
||||
<marc:subfield code="a">Author, First</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="700" ind1="1" ind2=" ">
|
||||
<marc:subfield code="a">Author, Second</marc:subfield>
|
||||
</marc:datafield>
|
||||
<marc:datafield tag="924" ind1=" " ind2=" ">
|
||||
<marc:subfield code="9">Frei 129</marc:subfield>
|
||||
<marc:subfield code="g">ABC 123</marc:subfield>
|
||||
<marc:subfield code="b">DE-Frei129</marc:subfield>
|
||||
</marc:datafield>
|
||||
</marc:record>"""
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sru_response_xml() -> bytes:
|
||||
"""Complete SRU searchRetrieveResponse XML."""
|
||||
return b"""<?xml version="1.0" encoding="UTF-8"?>
|
||||
<zs:searchRetrieveResponse xmlns:zs="http://www.loc.gov/zing/srw/"
|
||||
xmlns:marc="http://www.loc.gov/MARC21/slim">
|
||||
<zs:version>1.1</zs:version>
|
||||
<zs:numberOfRecords>2</zs:numberOfRecords>
|
||||
<zs:records>
|
||||
<zs:record>
|
||||
<zs:recordSchema>marcxml</zs:recordSchema>
|
||||
<zs:recordPacking>xml</zs:recordPacking>
|
||||
<zs:recordData>
|
||||
<marc:record>
|
||||
<marc:leader>00000nam a22</marc:leader>
|
||||
<marc:controlfield tag="001">PPN001</marc:controlfield>
|
||||
<marc:datafield tag="245" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">First Book</marc:subfield>
|
||||
</marc:datafield>
|
||||
</marc:record>
|
||||
</zs:recordData>
|
||||
<zs:recordPosition>1</zs:recordPosition>
|
||||
</zs:record>
|
||||
<zs:record>
|
||||
<zs:recordSchema>marcxml</zs:recordSchema>
|
||||
<zs:recordPacking>xml</zs:recordPacking>
|
||||
<zs:recordData>
|
||||
<marc:record>
|
||||
<marc:leader>00000nam a22</marc:leader>
|
||||
<marc:controlfield tag="001">PPN002</marc:controlfield>
|
||||
<marc:datafield tag="245" ind1=" " ind2=" ">
|
||||
<marc:subfield code="a">Second Book</marc:subfield>
|
||||
</marc:datafield>
|
||||
</marc:record>
|
||||
</zs:recordData>
|
||||
<zs:recordPosition>2</zs:recordPosition>
|
||||
</zs:record>
|
||||
</zs:records>
|
||||
<zs:echoedSearchRetrieveRequest>
|
||||
<zs:version>1.1</zs:version>
|
||||
<zs:query>pica.tit=Test</zs:query>
|
||||
<zs:maximumRecords>100</zs:maximumRecords>
|
||||
<zs:recordPacking>xml</zs:recordPacking>
|
||||
<zs:recordSchema>marcxml</zs:recordSchema>
|
||||
</zs:echoedSearchRetrieveRequest>
|
||||
</zs:searchRetrieveResponse>"""
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sru_response_no_records() -> bytes:
|
||||
"""SRU response with zero records."""
|
||||
return b"""<?xml version="1.0" encoding="UTF-8"?>
|
||||
<zs:searchRetrieveResponse xmlns:zs="http://www.loc.gov/zing/srw/">
|
||||
<zs:version>1.1</zs:version>
|
||||
<zs:numberOfRecords>0</zs:numberOfRecords>
|
||||
</zs:searchRetrieveResponse>"""
|
||||
|
||||
|
||||
# --- Tests for _text helper ---
|
||||
|
||||
|
||||
class TestTextHelper:
|
||||
def test_text_with_element_and_text(self):
|
||||
elem = ET.fromstring("<tag>Hello</tag>")
|
||||
assert _text(elem) == "Hello"
|
||||
|
||||
def test_text_with_element_no_text(self):
|
||||
elem = ET.fromstring("<tag></tag>")
|
||||
assert _text(elem) == ""
|
||||
|
||||
def test_text_with_none(self):
|
||||
assert _text(None) == ""
|
||||
|
||||
def test_text_with_whitespace(self):
|
||||
elem = ET.fromstring("<tag> spaced </tag>")
|
||||
assert _text(elem) == " spaced "
|
||||
|
||||
|
||||
# --- Tests for parse_marc_record ---
|
||||
|
||||
|
||||
class TestParseMarcRecord:
|
||||
def test_parse_minimal_record(self, minimal_marc_xml):
|
||||
root = ET.fromstring(minimal_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
assert record.leader == "00000nam a22000001i 4500"
|
||||
assert len(record.controlfields) == 2
|
||||
assert record.controlfields[0].tag == "001"
|
||||
assert record.controlfields[0].value == "PPN12345"
|
||||
|
||||
def test_parse_datafields(self, minimal_marc_xml):
|
||||
root = ET.fromstring(minimal_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
assert len(record.datafields) == 1
|
||||
df = record.datafields[0]
|
||||
assert df.tag == "245"
|
||||
assert df.ind1 == "1"
|
||||
assert df.ind2 == "0"
|
||||
assert len(df.subfields) == 2
|
||||
assert df.subfields[0].code == "a"
|
||||
assert df.subfields[0].value == "Test Title"
|
||||
|
||||
def test_parse_full_record(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
assert len(record.controlfields) == 3
|
||||
# Check multiple datafields
|
||||
tags = [df.tag for df in record.datafields]
|
||||
assert "020" in tags
|
||||
assert "245" in tags
|
||||
assert "700" in tags
|
||||
assert "924" in tags
|
||||
|
||||
def test_parse_multiple_subfields_same_code(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
# Find 041 field with multiple $a subfields
|
||||
df_041 = next(df for df in record.datafields if df.tag == "041")
|
||||
a_values = [sf.value for sf in df_041.subfields if sf.code == "a"]
|
||||
assert a_values == ["ger", "eng"]
|
||||
|
||||
|
||||
# --- Tests for parse_search_retrieve_response ---
|
||||
|
||||
|
||||
class TestParseSearchRetrieveResponse:
|
||||
def test_parse_response_with_records(self, sru_response_xml):
|
||||
response = parse_search_retrieve_response(sru_response_xml)
|
||||
|
||||
assert response.version == "1.1"
|
||||
assert response.numberOfRecords == 2
|
||||
assert len(response.records) == 2
|
||||
|
||||
def test_parse_response_record_details(self, sru_response_xml):
|
||||
response = parse_search_retrieve_response(sru_response_xml)
|
||||
|
||||
rec1 = response.records[0]
|
||||
assert rec1.recordSchema == "marcxml"
|
||||
assert rec1.recordPacking == "xml"
|
||||
assert rec1.recordPosition == 1
|
||||
assert controlfield_value(rec1.recordData, "001") == "PPN001"
|
||||
|
||||
def test_parse_response_no_records(self, sru_response_no_records):
|
||||
response = parse_search_retrieve_response(sru_response_no_records)
|
||||
|
||||
assert response.version == "1.1"
|
||||
assert response.numberOfRecords == 0
|
||||
assert len(response.records) == 0
|
||||
|
||||
def test_parse_echoed_request(self, sru_response_xml):
|
||||
response = parse_search_retrieve_response(sru_response_xml)
|
||||
|
||||
echoed = response.echoedSearchRetrieveRequest
|
||||
assert echoed is not None
|
||||
assert echoed.version == "1.1"
|
||||
assert echoed.query == "pica.tit=Test"
|
||||
assert echoed.maximumRecords == 100
|
||||
assert echoed.recordSchema == "marcxml"
|
||||
|
||||
def test_parse_response_as_string(self, sru_response_xml):
|
||||
# Should also work with string input
|
||||
response = parse_search_retrieve_response(sru_response_xml.decode("utf-8"))
|
||||
assert response.numberOfRecords == 2
|
||||
|
||||
|
||||
# --- Tests for query helper functions ---
|
||||
|
||||
|
||||
class TestIterDatafields:
|
||||
def test_iter_all_datafields(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
all_fields = list(iter_datafields(record))
|
||||
assert len(all_fields) == len(record.datafields)
|
||||
|
||||
def test_iter_datafields_by_tag(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
fields_020 = list(iter_datafields(record, tag="020"))
|
||||
assert len(fields_020) == 2 # Two ISBN fields
|
||||
|
||||
def test_iter_datafields_by_indicator(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
fields = list(iter_datafields(record, tag="264", ind2="1"))
|
||||
assert len(fields) == 1
|
||||
|
||||
|
||||
class TestSubfieldValues:
|
||||
def test_subfield_values_single(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
values = subfield_values(record, "245", "a")
|
||||
assert values == ["Comprehensive Test Book"]
|
||||
|
||||
def test_subfield_values_multiple(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
# Multiple ISBN values
|
||||
values = subfield_values(record, "020", "a")
|
||||
assert len(values) == 2
|
||||
assert "9783123456789" in values
|
||||
assert "9783987654321" in values
|
||||
|
||||
def test_subfield_values_empty(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
values = subfield_values(record, "999", "x")
|
||||
assert values == []
|
||||
|
||||
|
||||
class TestFirstSubfieldValue:
|
||||
def test_first_subfield_value_found(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
value = first_subfield_value(record, "245", "a")
|
||||
assert value == "Comprehensive Test Book"
|
||||
|
||||
def test_first_subfield_value_not_found(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
value = first_subfield_value(record, "999", "x")
|
||||
assert value is None
|
||||
|
||||
def test_first_subfield_value_with_default(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
value = first_subfield_value(record, "999", "x", default="N/A")
|
||||
assert value == "N/A"
|
||||
|
||||
def test_first_subfield_value_with_indicator(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
value = first_subfield_value(record, "264", "c", ind2="1")
|
||||
assert value == "2023"
|
||||
|
||||
|
||||
class TestControlFieldValue:
|
||||
def test_controlfield_value_found(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
value = controlfield_value(record, "001")
|
||||
assert value == "PPN98765"
|
||||
|
||||
def test_controlfield_value_not_found(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
value = controlfield_value(record, "999")
|
||||
assert value is None
|
||||
|
||||
def test_controlfield_value_with_default(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
value = controlfield_value(record, "999", default="unknown")
|
||||
assert value == "unknown"
|
||||
|
||||
|
||||
class TestFindDatafieldsWithSubfields:
|
||||
def test_find_with_where_all(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
fields = find_datafields_with_subfields(
|
||||
record,
|
||||
"924",
|
||||
where_all={"9": "Frei 129"},
|
||||
)
|
||||
assert len(fields) == 1
|
||||
assert fields[0].tag == "924"
|
||||
|
||||
def test_find_with_where_all_not_found(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
fields = find_datafields_with_subfields(
|
||||
record,
|
||||
"924",
|
||||
where_all={"9": "NonExistent"},
|
||||
)
|
||||
assert len(fields) == 0
|
||||
|
||||
def test_find_with_casefold(self, full_marc_xml):
|
||||
root = ET.fromstring(full_marc_xml)
|
||||
record = parse_marc_record(root)
|
||||
|
||||
fields = find_datafields_with_subfields(
|
||||
record,
|
||||
"924",
|
||||
where_all={"9": "frei 129"}, # lowercase
|
||||
casefold=True,
|
||||
)
|
||||
assert len(fields) == 1
|
||||
|
||||
|
||||
class TestDatafieldValue:
|
||||
def test_datafield_value_found(self):
|
||||
df = DataField(
|
||||
tag="245",
|
||||
subfields=[
|
||||
SubField(code="a", value="Title"),
|
||||
SubField(code="b", value="Subtitle"),
|
||||
],
|
||||
)
|
||||
assert datafield_value(df, "a") == "Title"
|
||||
assert datafield_value(df, "b") == "Subtitle"
|
||||
|
||||
def test_datafield_value_not_found(self):
|
||||
df = DataField(tag="245", subfields=[SubField(code="a", value="Title")])
|
||||
assert datafield_value(df, "z") is None
|
||||
|
||||
def test_datafield_value_with_default(self):
|
||||
df = DataField(tag="245", subfields=[])
|
||||
assert datafield_value(df, "a", default="N/A") == "N/A"
|
||||
|
||||
|
||||
class TestDatafieldsValue:
|
||||
def test_datafields_value_found(self):
|
||||
fields = [
|
||||
DataField(tag="700", subfields=[SubField(code="a", value="Author One")]),
|
||||
DataField(tag="700", subfields=[SubField(code="a", value="Author Two")]),
|
||||
]
|
||||
assert datafields_value(fields, "a") == "Author One"
|
||||
|
||||
def test_datafields_value_empty_list(self):
|
||||
assert datafields_value([], "a") is None
|
||||
|
||||
|
||||
class TestSubfieldValuesFromFields:
|
||||
def test_values_from_multiple_fields(self):
|
||||
fields = [
|
||||
DataField(tag="700", subfields=[SubField(code="a", value="Author One")]),
|
||||
DataField(tag="700", subfields=[SubField(code="a", value="Author Two")]),
|
||||
]
|
||||
values = subfield_values_from_fields(fields, "a")
|
||||
assert values == ["Author One", "Author Two"]
|
||||
|
||||
|
||||
class TestFirstSubfieldValueFromFields:
|
||||
def test_first_value_from_fields(self):
|
||||
fields = [
|
||||
DataField(tag="700", subfields=[SubField(code="a", value="First")]),
|
||||
DataField(tag="700", subfields=[SubField(code="a", value="Second")]),
|
||||
]
|
||||
assert first_subfield_value_from_fields(fields, "a") == "First"
|
||||
|
||||
|
||||
# --- Tests for _smart_join_title ---
|
||||
|
||||
|
||||
class TestSmartJoinTitle:
|
||||
def test_join_with_subtitle(self):
|
||||
result = _smart_join_title("Main Title", "Subtitle")
|
||||
assert result == "Main Title : Subtitle"
|
||||
|
||||
def test_join_without_subtitle(self):
|
||||
result = _smart_join_title("Main Title", None)
|
||||
assert result == "Main Title"
|
||||
|
||||
def test_join_with_empty_subtitle(self):
|
||||
result = _smart_join_title("Main Title", "")
|
||||
assert result == "Main Title"
|
||||
|
||||
def test_join_with_existing_colon(self):
|
||||
result = _smart_join_title("Main Title:", "Subtitle")
|
||||
assert result == "Main Title: Subtitle"
|
||||
|
||||
def test_join_with_existing_semicolon(self):
|
||||
result = _smart_join_title("Main Title;", "More")
|
||||
assert result == "Main Title; More"
|
||||
|
||||
def test_join_strips_whitespace(self):
|
||||
result = _smart_join_title(" Main Title ", " Subtitle ")
|
||||
assert result == "Main Title : Subtitle"
|
||||
244
tests/test_schemas.py
Normal file
244
tests/test_schemas.py
Normal file
@@ -0,0 +1,244 @@
|
||||
"""Tests for schema modules."""
|
||||
|
||||
import json
|
||||
|
||||
import pytest
|
||||
|
||||
from bibapi.schemas.api_types import (
|
||||
ALMASchema,
|
||||
DNBSchema,
|
||||
DublinCoreSchema,
|
||||
HBZSchema,
|
||||
HebisSchema,
|
||||
KOBVSchema,
|
||||
OEVKSchema,
|
||||
PicaSchema,
|
||||
SWBSchema,
|
||||
)
|
||||
from bibapi.schemas.bookdata import BookData
|
||||
from bibapi.schemas.errors import BibAPIError, CatalogueError, NetworkError
|
||||
from bibapi.sru import QueryTransformer
|
||||
|
||||
# --- QueryTransformer tests with different schemas ---
|
||||
|
||||
arguments = [
|
||||
"TITLE=Java ist auch eine Insel",
|
||||
"AUTHOR=Ullenboom, Christian",
|
||||
"YEAR=2020",
|
||||
"PPN=1693321114",
|
||||
]
|
||||
|
||||
|
||||
def test_pica_schema():
|
||||
transformer = QueryTransformer(PicaSchema, arguments)
|
||||
transformed = transformer.transform()
|
||||
assert len(transformed) == 4
|
||||
assert transformed[0].startswith(PicaSchema.TITLE.value)
|
||||
assert transformed[1].startswith(PicaSchema.AUTHOR.value)
|
||||
assert transformed[2].startswith(PicaSchema.YEAR.value)
|
||||
assert transformed[3].startswith(PicaSchema.PPN.value)
|
||||
|
||||
|
||||
def test_alma_schema():
|
||||
transformer = QueryTransformer(ALMASchema, arguments)
|
||||
transformed = transformer.transform()
|
||||
assert len(transformed) == 3 # PPN is not supported
|
||||
assert transformed[0].startswith(ALMASchema.TITLE.value)
|
||||
assert transformed[1].startswith(ALMASchema.AUTHOR.value)
|
||||
assert transformed[2].startswith(ALMASchema.YEAR.value)
|
||||
|
||||
|
||||
def test_dublin_core_schema():
|
||||
transformer = QueryTransformer(DublinCoreSchema, arguments)
|
||||
transformed = transformer.transform()
|
||||
assert len(transformed) == 3 # YEAR is supported, PPN is not
|
||||
assert transformed[0].startswith(DublinCoreSchema.TITLE.value)
|
||||
assert transformed[1].startswith(DublinCoreSchema.AUTHOR.value)
|
||||
assert transformed[2].startswith(DublinCoreSchema.YEAR.value)
|
||||
|
||||
|
||||
# --- API Schema configuration tests ---
|
||||
|
||||
|
||||
class TestApiSchemas:
|
||||
"""Tests for API schema configurations."""
|
||||
|
||||
def test_swb_schema_config(self):
|
||||
"""Test SWB schema configuration."""
|
||||
assert SWBSchema.NAME.value == "SWB"
|
||||
assert "sru.k10plus.de" in SWBSchema.URL.value
|
||||
assert SWBSchema.ARGSCHEMA.value == PicaSchema
|
||||
assert SWBSchema.LIBRARY_NAME_LOCATION_FIELD.value == "924$b"
|
||||
|
||||
def test_dnb_schema_config(self):
|
||||
"""Test DNB schema configuration."""
|
||||
assert DNBSchema.NAME.value == "DNB"
|
||||
assert "services.dnb.de" in DNBSchema.URL.value
|
||||
assert DNBSchema.ARGSCHEMA.value == DublinCoreSchema
|
||||
|
||||
def test_kobv_schema_config(self):
|
||||
"""Test KOBV schema configuration."""
|
||||
assert KOBVSchema.NAME.value == "KOBV"
|
||||
assert "sru.kobv.de" in KOBVSchema.URL.value
|
||||
assert KOBVSchema.ARGSCHEMA.value == DublinCoreSchema
|
||||
|
||||
def test_hebis_schema_config(self):
|
||||
"""Test HEBIS schema configuration."""
|
||||
assert HebisSchema.NAME.value == "HEBIS"
|
||||
assert "sru.hebis.de" in HebisSchema.URL.value
|
||||
assert HebisSchema.ARGSCHEMA.value == PicaSchema
|
||||
# HEBIS has specific character replacements
|
||||
assert " " in HebisSchema.REPLACE.value
|
||||
|
||||
def test_oevk_schema_config(self):
|
||||
"""Test OEVK schema configuration."""
|
||||
assert OEVKSchema.NAME.value == "OEVK"
|
||||
assert OEVKSchema.ARGSCHEMA.value == PicaSchema
|
||||
|
||||
def test_hbz_schema_config(self):
|
||||
"""Test HBZ schema configuration."""
|
||||
assert HBZSchema.NAME.value == "HBZ"
|
||||
assert HBZSchema.ARGSCHEMA.value == ALMASchema
|
||||
assert HBZSchema.LIBRARY_NAME_LOCATION_FIELD.value == "852$a"
|
||||
# HBZ doesn't support PPN
|
||||
assert "PPN" in HBZSchema.NOTSUPPORTEDARGS.value
|
||||
|
||||
|
||||
# --- BookData tests ---
|
||||
|
||||
|
||||
class TestBookData:
|
||||
"""Tests for the BookData class."""
|
||||
|
||||
def test_bookdata_creation_defaults(self):
|
||||
"""Test BookData creation with defaults."""
|
||||
book = BookData()
|
||||
assert book.ppn is None
|
||||
assert book.title is None
|
||||
assert book.in_apparat is False
|
||||
assert book.in_library is False
|
||||
|
||||
def test_bookdata_creation_with_values(self):
|
||||
"""Test BookData creation with values."""
|
||||
book = BookData(
|
||||
ppn="123456",
|
||||
title="Test Book",
|
||||
signature="ABC 123",
|
||||
year=2023,
|
||||
isbn=["9783123456789"],
|
||||
)
|
||||
assert book.ppn == "123456"
|
||||
assert book.title == "Test Book"
|
||||
assert book.signature == "ABC 123"
|
||||
assert book.year == "2023" # Converted to string without non-digits
|
||||
assert book.in_library is True # Because signature exists
|
||||
|
||||
def test_bookdata_post_init_year_cleaning(self):
|
||||
"""Test that year is cleaned of non-digits."""
|
||||
book = BookData(year="2023 [erschienen]")
|
||||
assert book.year == "2023"
|
||||
|
||||
def test_bookdata_post_init_language_normalization(self):
|
||||
"""Test language list normalization."""
|
||||
book = BookData(language=["ger", "eng", " fra "])
|
||||
assert book.language == "ger,eng,fra"
|
||||
|
||||
def test_bookdata_post_init_library_location(self):
|
||||
"""Test library_location is converted to string."""
|
||||
book = BookData(library_location=123)
|
||||
assert book.library_location == "123"
|
||||
|
||||
def test_bookdata_from_dict(self):
|
||||
"""Test BookData.from_dict method."""
|
||||
book = BookData()
|
||||
data = {"ppn": "123", "title": "Test", "year": "2023"}
|
||||
book.from_dict(data)
|
||||
assert book.ppn == "123"
|
||||
assert book.title == "Test"
|
||||
|
||||
def test_bookdata_merge(self):
|
||||
"""Test BookData.merge method."""
|
||||
book1 = BookData(ppn="123", title="Book 1")
|
||||
book2 = BookData(title="Book 2", author="Author", isbn=["978123"])
|
||||
|
||||
book1.merge(book2)
|
||||
assert book1.ppn == "123" # Original value preserved
|
||||
assert book1.title == "Book 1" # Original value preserved (not None)
|
||||
assert book1.author == "Author" # Merged from book2
|
||||
assert "978123" in book1.isbn # Merged list
|
||||
|
||||
def test_bookdata_merge_lists(self):
|
||||
"""Test BookData.merge with list merging."""
|
||||
book1 = BookData(isbn=["978123"])
|
||||
book2 = BookData(isbn=["978456", "978123"]) # Has duplicate
|
||||
|
||||
book1.merge(book2)
|
||||
# Should have both ISBNs but no duplicates
|
||||
assert len(book1.isbn) == 2
|
||||
assert "978123" in book1.isbn
|
||||
assert "978456" in book1.isbn
|
||||
|
||||
def test_bookdata_to_dict(self):
|
||||
"""Test BookData.to_dict property."""
|
||||
book = BookData(ppn="123", title="Test Book")
|
||||
json_str = book.to_dict
|
||||
data = json.loads(json_str)
|
||||
assert data["ppn"] == "123"
|
||||
assert data["title"] == "Test Book"
|
||||
assert "old_book" not in data # Should be removed
|
||||
|
||||
def test_bookdata_from_string(self):
|
||||
"""Test BookData.from_string method."""
|
||||
json_str = '{"ppn": "123", "title": "Test"}'
|
||||
book = BookData().from_string(json_str)
|
||||
assert book.ppn == "123"
|
||||
assert book.title == "Test"
|
||||
|
||||
def test_bookdata_edition_number(self):
|
||||
"""Test BookData.edition_number property."""
|
||||
book = BookData(edition="3rd edition")
|
||||
assert book.edition_number == 3
|
||||
|
||||
book2 = BookData(edition="First edition")
|
||||
assert book2.edition_number == 0 # No digit found
|
||||
|
||||
book3 = BookData(edition=None)
|
||||
assert book3.edition_number == 0
|
||||
|
||||
def test_bookdata_get_book_type(self):
|
||||
"""Test BookData.get_book_type method."""
|
||||
book = BookData(media_type="print", pages="Online Resource")
|
||||
assert book.get_book_type() == "eBook"
|
||||
|
||||
book2 = BookData(media_type="print", pages="300 pages")
|
||||
assert book2.get_book_type() == "Druckausgabe"
|
||||
|
||||
|
||||
# --- Error classes tests ---
|
||||
|
||||
|
||||
class TestErrors:
|
||||
"""Tests for error classes."""
|
||||
|
||||
def test_bibapi_error(self):
|
||||
"""Test BibAPIError exception."""
|
||||
with pytest.raises(BibAPIError):
|
||||
raise BibAPIError("Test error")
|
||||
|
||||
def test_catalogue_error(self):
|
||||
"""Test CatalogueError exception."""
|
||||
with pytest.raises(CatalogueError):
|
||||
raise CatalogueError("Catalogue error")
|
||||
|
||||
# Should also be a BibAPIError
|
||||
with pytest.raises(BibAPIError):
|
||||
raise CatalogueError("Catalogue error")
|
||||
|
||||
def test_network_error(self):
|
||||
"""Test NetworkError exception."""
|
||||
with pytest.raises(NetworkError):
|
||||
raise NetworkError("Network error")
|
||||
|
||||
# Should also be a BibAPIError
|
||||
with pytest.raises(BibAPIError):
|
||||
raise NetworkError("Network error")
|
||||
388
tests/test_sru.py
Normal file
388
tests/test_sru.py
Normal file
@@ -0,0 +1,388 @@
|
||||
"""Comprehensive tests for the SRU module."""
|
||||
|
||||
import xml.etree.ElementTree as ET
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
import requests
|
||||
|
||||
from bibapi.schemas.api_types import ALMASchema, DublinCoreSchema, PicaSchema
|
||||
from bibapi.schemas.bookdata import BookData
|
||||
from bibapi.sru import (
|
||||
Api,
|
||||
QueryTransformer,
|
||||
book_from_marc,
|
||||
find_newer_edition,
|
||||
parse_marc_record,
|
||||
)
|
||||
from src.bibapi import SWB
|
||||
|
||||
# --- Integration test (requires network) ---
|
||||
|
||||
|
||||
def test_swb_schema() -> None:
|
||||
"""Integration test that requires network access."""
|
||||
result = SWB().getBooks(["TITLE=Java ist auch eine Insel", "LIBRARY=20735"])
|
||||
assert len(result) == 1
|
||||
assert result[0].title == "Java ist auch eine Insel"
|
||||
|
||||
|
||||
# --- Api class tests ---
|
||||
|
||||
|
||||
class TestApiClass:
|
||||
"""Tests for the Api class."""
|
||||
|
||||
def test_api_initialization(self):
|
||||
"""Test Api class initialization."""
|
||||
api = Api(
|
||||
site="TestSite",
|
||||
url="https://example.com/sru?query={}",
|
||||
prefix=PicaSchema,
|
||||
library_identifier="924$b",
|
||||
)
|
||||
assert api.site == "TestSite"
|
||||
assert api.url == "https://example.com/sru?query={}"
|
||||
assert api.prefix == PicaSchema
|
||||
assert api.library_identifier == "924$b"
|
||||
assert api._rate_limit_seconds == 1.0
|
||||
assert api._max_retries == 5
|
||||
assert api._overall_timeout_seconds == 30.0
|
||||
api.close()
|
||||
|
||||
def test_api_with_notsupported_args(self):
|
||||
"""Test Api initialization with unsupported arguments."""
|
||||
api = Api(
|
||||
site="TestSite",
|
||||
url="https://example.com/sru?query={}",
|
||||
prefix=PicaSchema,
|
||||
library_identifier="924$b",
|
||||
notsupported_args=["YEAR", "PPN"],
|
||||
)
|
||||
assert "YEAR" in api.notsupported_args
|
||||
assert "PPN" in api.notsupported_args
|
||||
api.close()
|
||||
|
||||
def test_api_with_replace_dict(self):
|
||||
"""Test Api initialization with replace dictionary."""
|
||||
api = Api(
|
||||
site="TestSite",
|
||||
url="https://example.com/sru?query={}",
|
||||
prefix=PicaSchema,
|
||||
library_identifier="924$b",
|
||||
replace={" ": "+", "&": "%26"},
|
||||
)
|
||||
assert api.replace == {" ": "+", "&": "%26"}
|
||||
api.close()
|
||||
|
||||
@patch.object(requests.Session, "get")
|
||||
def test_api_get_success(self, mock_get, sample_sru_response_xml):
|
||||
"""Test successful API get request."""
|
||||
mock_response = MagicMock()
|
||||
mock_response.status_code = 200
|
||||
mock_response.content = sample_sru_response_xml
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
api = Api(
|
||||
site="TestSite",
|
||||
url="https://example.com/sru?query={}",
|
||||
prefix=PicaSchema,
|
||||
library_identifier="924$b",
|
||||
)
|
||||
records = api.get(["title=Test"])
|
||||
assert len(records) == 1
|
||||
api.close()
|
||||
|
||||
@patch.object(requests.Session, "get")
|
||||
def test_api_get_with_string_query(self, mock_get, sample_sru_response_xml):
|
||||
"""Test API get with string query (not list)."""
|
||||
mock_response = MagicMock()
|
||||
mock_response.status_code = 200
|
||||
mock_response.content = sample_sru_response_xml
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
api = Api(
|
||||
site="TestSite",
|
||||
url="https://example.com/sru?query={}",
|
||||
prefix=PicaSchema,
|
||||
library_identifier="924$b",
|
||||
)
|
||||
records = api.get("title=Test")
|
||||
assert len(records) == 1
|
||||
api.close()
|
||||
|
||||
@patch.object(requests.Session, "get")
|
||||
def test_api_get_filters_notsupported_args(self, mock_get, sample_sru_response_xml):
|
||||
"""Test that unsupported args are filtered out."""
|
||||
mock_response = MagicMock()
|
||||
mock_response.status_code = 200
|
||||
mock_response.content = sample_sru_response_xml
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
api = Api(
|
||||
site="TestSite",
|
||||
url="https://example.com/sru?query={}",
|
||||
prefix=PicaSchema,
|
||||
library_identifier="924$b",
|
||||
notsupported_args=["YEAR"],
|
||||
)
|
||||
# YEAR should be filtered out
|
||||
records = api.get(["title=Test", "YEAR=2023"])
|
||||
assert len(records) == 1
|
||||
api.close()
|
||||
|
||||
@patch.object(requests.Session, "get")
|
||||
def test_api_get_http_error_retries(self, mock_get):
|
||||
"""Test that API retries on HTTP errors."""
|
||||
mock_response = MagicMock()
|
||||
mock_response.status_code = 500
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
api = Api(
|
||||
site="TestSite",
|
||||
url="https://example.com/sru?query={}",
|
||||
prefix=PicaSchema,
|
||||
library_identifier="924$b",
|
||||
)
|
||||
api._max_retries = 2
|
||||
api._rate_limit_seconds = 0.01 # Speed up test
|
||||
api._overall_timeout_seconds = 5.0
|
||||
|
||||
with pytest.raises(Exception, match="HTTP 500"):
|
||||
api.get(["title=Test"])
|
||||
api.close()
|
||||
|
||||
@patch.object(requests.Session, "get")
|
||||
def test_api_get_timeout_returns_empty_bookdata(self, mock_get):
|
||||
"""Test that timeout returns empty BookData list."""
|
||||
mock_get.side_effect = requests.exceptions.ReadTimeout("Timeout")
|
||||
|
||||
api = Api(
|
||||
site="TestSite",
|
||||
url="https://example.com/sru?query={}",
|
||||
prefix=PicaSchema,
|
||||
library_identifier="924$b",
|
||||
)
|
||||
api._max_retries = 1
|
||||
api._rate_limit_seconds = 0.01
|
||||
|
||||
books = api.getBooks(["title=Test"])
|
||||
assert len(books) == 1
|
||||
assert books[0].ppn is None # Empty BookData
|
||||
api.close()
|
||||
|
||||
@patch.object(requests.Session, "get")
|
||||
def test_api_getbooks_filters_by_title(self, mock_get, sample_sru_response_xml):
|
||||
"""Test that getBooks filters results by title prefix."""
|
||||
mock_response = MagicMock()
|
||||
mock_response.status_code = 200
|
||||
mock_response.content = sample_sru_response_xml
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
api = Api(
|
||||
site="TestSite",
|
||||
url="https://example.com/sru?query={}",
|
||||
prefix=PicaSchema,
|
||||
library_identifier="924$b",
|
||||
)
|
||||
# Title in sample is "Test Book" - filtering for "Test" should match
|
||||
books = api.getBooks(["pica.tit=Test"])
|
||||
assert len(books) == 1
|
||||
|
||||
# Filtering for "NonExistent" should not match
|
||||
books = api.getBooks(["pica.tit=NonExistent"])
|
||||
assert len(books) == 0
|
||||
api.close()
|
||||
|
||||
def test_api_close(self):
|
||||
"""Test Api close method."""
|
||||
api = Api(
|
||||
site="TestSite",
|
||||
url="https://example.com/sru?query={}",
|
||||
prefix=PicaSchema,
|
||||
library_identifier="924$b",
|
||||
)
|
||||
# Should not raise
|
||||
api.close()
|
||||
api.close() # Double close should be safe
|
||||
|
||||
|
||||
# --- QueryTransformer tests ---
|
||||
|
||||
|
||||
class TestQueryTransformer:
|
||||
"""Tests for the QueryTransformer class."""
|
||||
|
||||
def test_transform_pica_schema(self):
|
||||
"""Test transformation with PicaSchema."""
|
||||
args = ["TITLE=Test Book", "AUTHOR=Smith, John"]
|
||||
transformer = QueryTransformer(PicaSchema, args)
|
||||
result = transformer.transform()
|
||||
|
||||
assert len(result) == 2
|
||||
# Check that pica.tit is in the result
|
||||
assert any(r.startswith("pica.tit=") for r in result)
|
||||
# Author should have comma without space
|
||||
assert any(r.startswith("pica.per=") for r in result)
|
||||
|
||||
def test_transform_alma_schema(self):
|
||||
"""Test transformation with ALMASchema."""
|
||||
args = ["TITLE=Test Book", "AUTHOR=Smith, John"]
|
||||
transformer = QueryTransformer(ALMASchema, args)
|
||||
result = transformer.transform()
|
||||
|
||||
assert len(result) == 2
|
||||
# Title should be enclosed in quotes
|
||||
assert any('alma.title="Test Book"' in r for r in result)
|
||||
|
||||
def test_transform_dublin_core_schema(self):
|
||||
"""Test transformation with DublinCoreSchema."""
|
||||
args = ["TITLE=Test Book", "AUTHOR=Smith,John"]
|
||||
transformer = QueryTransformer(DublinCoreSchema, args)
|
||||
result = transformer.transform()
|
||||
|
||||
assert len(result) == 2
|
||||
# Check that dc.title is in the result
|
||||
assert any(r.startswith("dc.title=") for r in result)
|
||||
# Author should have space after comma
|
||||
assert any(r.startswith("dc.creator=") for r in result)
|
||||
|
||||
def test_transform_string_input(self):
|
||||
"""Test transformation with string input instead of list."""
|
||||
transformer = QueryTransformer(PicaSchema, "TITLE=Test Book")
|
||||
result = transformer.transform()
|
||||
assert len(result) == 1
|
||||
|
||||
def test_transform_drops_empty_values(self):
|
||||
"""Test that empty values are dropped when drop_empty is True."""
|
||||
args = ["TITLE=Test Book", "AUTHOR="]
|
||||
transformer = QueryTransformer(PicaSchema, args)
|
||||
result = transformer.transform()
|
||||
assert len(result) == 1
|
||||
|
||||
def test_transform_invalid_format_ignored(self):
|
||||
"""Test that arguments without = are ignored."""
|
||||
args = ["TITLE=Test Book", "InvalidArg", "AUTHOR=Smith"]
|
||||
transformer = QueryTransformer(PicaSchema, args)
|
||||
result = transformer.transform()
|
||||
assert len(result) == 2
|
||||
|
||||
def test_transform_unknown_key_ignored(self):
|
||||
"""Test that unknown keys are ignored."""
|
||||
args = ["TITLE=Test Book", "UNKNOWNKEY=value"]
|
||||
transformer = QueryTransformer(PicaSchema, args)
|
||||
result = transformer.transform()
|
||||
assert len(result) == 1
|
||||
|
||||
|
||||
# --- book_from_marc tests ---
|
||||
|
||||
|
||||
class TestBookFromMarc:
|
||||
"""Tests for the book_from_marc function."""
|
||||
|
||||
def test_book_from_marc_basic(self, sample_marc_record_xml):
|
||||
"""Test basic book extraction from MARC record."""
|
||||
root = ET.fromstring(sample_marc_record_xml)
|
||||
record = parse_marc_record(root)
|
||||
book = book_from_marc(record, "924$b")
|
||||
|
||||
assert book.ppn == "123456789"
|
||||
assert book.title == "Test Book Title"
|
||||
assert book.edition == "2nd edition"
|
||||
assert book.year == "2023"
|
||||
assert book.publisher == "Test Publisher"
|
||||
assert "9783123456789" in book.isbn
|
||||
assert book.pages == "456 pages"
|
||||
assert book.media_type == "Band"
|
||||
assert book.author == "Author, Test"
|
||||
|
||||
def test_book_from_marc_signature(self, sample_marc_record_xml):
|
||||
"""Test signature extraction from MARC record with Frei 129."""
|
||||
root = ET.fromstring(sample_marc_record_xml)
|
||||
record = parse_marc_record(root)
|
||||
book = book_from_marc(record, "924$b")
|
||||
|
||||
# Signature should be from 924 where $9 == "Frei 129" -> $g
|
||||
assert book.signature == "ABC 123"
|
||||
|
||||
def test_book_from_marc_libraries(self, sample_marc_record_xml):
|
||||
"""Test library extraction from MARC record."""
|
||||
root = ET.fromstring(sample_marc_record_xml)
|
||||
record = parse_marc_record(root)
|
||||
book = book_from_marc(record, "924$b")
|
||||
|
||||
assert "DE-Frei129" in book.libraries
|
||||
|
||||
|
||||
# --- find_newer_edition tests ---
|
||||
|
||||
|
||||
class TestFindNewerEdition:
|
||||
"""Tests for the find_newer_edition function."""
|
||||
|
||||
def test_find_newer_edition_by_year(self):
|
||||
"""Test finding newer edition by year."""
|
||||
swb = BookData(ppn="1", year=2020, edition="1st edition")
|
||||
dnb = [
|
||||
BookData(ppn="2", year=2023, edition="3rd edition"),
|
||||
BookData(ppn="3", year=2019, edition="1st edition"),
|
||||
]
|
||||
result = find_newer_edition(swb, dnb)
|
||||
assert result is not None
|
||||
assert len(result) == 1
|
||||
# Year is stored as string after post_init
|
||||
assert result[0].year == "2023"
|
||||
|
||||
def test_find_newer_edition_by_edition_number(self):
|
||||
"""Test finding newer edition by edition number."""
|
||||
swb = BookData(ppn="1", year=2020, edition="1st edition")
|
||||
dnb = [
|
||||
BookData(ppn="2", year=2020, edition="3rd edition"),
|
||||
]
|
||||
result = find_newer_edition(swb, dnb)
|
||||
assert result is not None
|
||||
assert len(result) == 1
|
||||
assert result[0].edition_number == 3
|
||||
|
||||
def test_find_newer_edition_none_found(self):
|
||||
"""Test when no newer edition exists."""
|
||||
swb = BookData(ppn="1", year=2023, edition="5th edition")
|
||||
dnb = [
|
||||
BookData(ppn="2", year=2020, edition="1st edition"),
|
||||
BookData(ppn="3", year=2019, edition="2nd edition"),
|
||||
]
|
||||
result = find_newer_edition(swb, dnb)
|
||||
assert result is None
|
||||
|
||||
def test_find_newer_edition_empty_list(self):
|
||||
"""Test with empty DNB result list."""
|
||||
swb = BookData(ppn="1", year=2020)
|
||||
result = find_newer_edition(swb, [])
|
||||
assert result is None
|
||||
|
||||
def test_find_newer_edition_prefers_matching_signature(self):
|
||||
"""Test that matching signature is preferred."""
|
||||
swb = BookData(ppn="1", year=2020, signature="ABC 123")
|
||||
dnb = [
|
||||
BookData(ppn="2", year=2023, signature="ABC 123"),
|
||||
BookData(ppn="3", year=2023, signature="XYZ 789"),
|
||||
]
|
||||
result = find_newer_edition(swb, dnb)
|
||||
assert result is not None
|
||||
assert len(result) == 1
|
||||
# Should prefer matching signature (first one) but XYZ 789 differs
|
||||
# so it's filtered out. Result should be the matching one.
|
||||
|
||||
def test_find_newer_edition_deduplicates_by_ppn(self):
|
||||
"""Test that results are deduplicated by PPN."""
|
||||
swb = BookData(ppn="1", year=2020)
|
||||
dnb = [
|
||||
BookData(ppn="2", year=2023, signature="ABC"),
|
||||
BookData(ppn="2", year=2023), # Duplicate PPN, no signature
|
||||
]
|
||||
result = find_newer_edition(swb, dnb)
|
||||
assert result is not None
|
||||
assert len(result) == 1
|
||||
# Should prefer the one with signature
|
||||
assert result[0].signature == "ABC"
|
||||
375
tests/test_transformers.py
Normal file
375
tests/test_transformers.py
Normal file
@@ -0,0 +1,375 @@
|
||||
"""Tests for the _transformers module."""
|
||||
|
||||
from src.bibapi._transformers import (
|
||||
RDS_AVAIL_DATA,
|
||||
RDS_DATA,
|
||||
RDS_GENERIC_DATA,
|
||||
ARRAYData,
|
||||
BibTeXData,
|
||||
COinSData,
|
||||
DictToTable,
|
||||
Item,
|
||||
RISData,
|
||||
)
|
||||
from src.bibapi.schemas.bookdata import BookData
|
||||
|
||||
# --- Item dataclass tests ---
|
||||
|
||||
|
||||
class TestItem:
|
||||
"""Tests for the Item dataclass."""
|
||||
|
||||
def test_item_creation_defaults(self):
|
||||
"""Test Item creation with defaults."""
|
||||
item = Item()
|
||||
assert item.superlocation == ""
|
||||
assert item.status == ""
|
||||
assert item.availability == ""
|
||||
|
||||
def test_item_creation_with_values(self):
|
||||
"""Test Item creation with values."""
|
||||
item = Item(
|
||||
superlocation="Main Library",
|
||||
status="available",
|
||||
callnumber="ABC 123",
|
||||
)
|
||||
assert item.superlocation == "Main Library"
|
||||
assert item.status == "available"
|
||||
assert item.callnumber == "ABC 123"
|
||||
|
||||
def test_item_from_dict(self):
|
||||
"""Test Item.from_dict method."""
|
||||
item = Item()
|
||||
data = {
|
||||
"items": [
|
||||
{
|
||||
"status": "available",
|
||||
"callnumber": "ABC 123",
|
||||
"location": "Floor 1",
|
||||
},
|
||||
],
|
||||
}
|
||||
result = item.from_dict(data)
|
||||
assert result.status == "available"
|
||||
assert result.callnumber == "ABC 123"
|
||||
assert result.location == "Floor 1"
|
||||
|
||||
|
||||
# --- RDS_DATA dataclass tests ---
|
||||
|
||||
|
||||
class TestRDSData:
|
||||
"""Tests for the RDS_DATA dataclass."""
|
||||
|
||||
def test_rds_data_creation_defaults(self):
|
||||
"""Test RDS_DATA creation with defaults."""
|
||||
rds = RDS_DATA()
|
||||
assert rds.RDS_SIGNATURE == ""
|
||||
assert rds.RDS_STATUS == ""
|
||||
assert rds.RDS_LOCATION == ""
|
||||
|
||||
def test_rds_data_import_from_dict(self):
|
||||
"""Test RDS_DATA.import_from_dict method."""
|
||||
rds = RDS_DATA()
|
||||
data = {
|
||||
"RDS_SIGNATURE": "ABC 123",
|
||||
"RDS_STATUS": "available",
|
||||
"RDS_LOCATION": "Floor 1",
|
||||
}
|
||||
result = rds.import_from_dict(data)
|
||||
assert result.RDS_SIGNATURE == "ABC 123"
|
||||
assert result.RDS_STATUS == "available"
|
||||
assert result.RDS_LOCATION == "Floor 1"
|
||||
|
||||
|
||||
# --- RDS_AVAIL_DATA dataclass tests ---
|
||||
|
||||
|
||||
class TestRDSAvailData:
|
||||
"""Tests for the RDS_AVAIL_DATA dataclass."""
|
||||
|
||||
def test_rds_avail_data_creation_defaults(self):
|
||||
"""Test RDS_AVAIL_DATA creation with defaults."""
|
||||
rds = RDS_AVAIL_DATA()
|
||||
assert rds.library_sigil == ""
|
||||
assert rds.items == []
|
||||
|
||||
def test_rds_avail_data_import_from_dict(self):
|
||||
"""Test RDS_AVAIL_DATA.import_from_dict method."""
|
||||
rds = RDS_AVAIL_DATA()
|
||||
json_data = (
|
||||
'{"DE-Frei129": {"Location1": {"items": [{"status": "available"}]}}}'
|
||||
)
|
||||
result = rds.import_from_dict(json_data)
|
||||
assert result.library_sigil == "DE-Frei129"
|
||||
assert len(result.items) == 1
|
||||
|
||||
|
||||
# --- RDS_GENERIC_DATA dataclass tests ---
|
||||
|
||||
|
||||
class TestRDSGenericData:
|
||||
"""Tests for the RDS_GENERIC_DATA dataclass."""
|
||||
|
||||
def test_rds_generic_data_creation_defaults(self):
|
||||
"""Test RDS_GENERIC_DATA creation with defaults."""
|
||||
rds = RDS_GENERIC_DATA()
|
||||
assert rds.LibrarySigil == ""
|
||||
assert rds.RDS_DATA == []
|
||||
|
||||
def test_rds_generic_data_import_from_dict(self):
|
||||
"""Test RDS_GENERIC_DATA.import_from_dict method."""
|
||||
rds = RDS_GENERIC_DATA()
|
||||
json_data = '{"DE-Frei129": [{"RDS_SIGNATURE": "ABC 123"}]}'
|
||||
result = rds.import_from_dict(json_data)
|
||||
assert result.LibrarySigil == "DE-Frei129"
|
||||
assert len(result.RDS_DATA) == 1
|
||||
|
||||
|
||||
# --- ARRAYData tests ---
|
||||
|
||||
|
||||
class TestARRAYData:
|
||||
"""Tests for the ARRAYData transformer."""
|
||||
|
||||
def test_array_data_transform(self):
|
||||
"""Test ARRAYData transform method."""
|
||||
sample_data = """
|
||||
[kid] => 123456789
|
||||
[ti_long] => Array
|
||||
(
|
||||
[0] => Test Book Title
|
||||
)
|
||||
[isbn] => Array
|
||||
(
|
||||
[0] => 9783123456789
|
||||
)
|
||||
[la_facet] => Array
|
||||
(
|
||||
[0] => German
|
||||
)
|
||||
[pu] => Array
|
||||
(
|
||||
[0] => Test Publisher
|
||||
)
|
||||
[py_display] => Array
|
||||
(
|
||||
[0] => 2023
|
||||
)
|
||||
[umfang] => Array
|
||||
(
|
||||
[0] => 300 pages
|
||||
)
|
||||
"""
|
||||
transformer = ARRAYData()
|
||||
result = transformer.transform(sample_data)
|
||||
|
||||
assert isinstance(result, BookData)
|
||||
assert result.ppn == "123456789"
|
||||
|
||||
def test_array_data_with_signature(self):
|
||||
"""Test ARRAYData with predefined signature."""
|
||||
sample_data = "[kid] => 123456789"
|
||||
transformer = ARRAYData(signature="ABC 123")
|
||||
result = transformer.transform(sample_data)
|
||||
|
||||
assert isinstance(result, BookData)
|
||||
|
||||
|
||||
# --- COinSData tests ---
|
||||
|
||||
|
||||
class TestCOinSData:
|
||||
"""Tests for the COinSData transformer."""
|
||||
|
||||
def test_coins_data_transform(self):
|
||||
"""Test COinSData transform method."""
|
||||
# Note: COinS format uses & separators, last field shouldn't have trailing &
|
||||
sample_data = (
|
||||
"ctx_ver=Z39.88-2004&"
|
||||
"rft_id=info:sid/test?kid=123456&"
|
||||
"rft.btitle=Test Bookrft&" # btitle ends parsing at next 'rft'
|
||||
"rft.aulast=Smithrft&"
|
||||
"rft.aufirst=Johnrft&"
|
||||
"rft.edition=2ndrft&"
|
||||
"rft.isbn=9783123456789rft&"
|
||||
"rft.pub=Publisherrft&"
|
||||
"rft.date=2023rft&"
|
||||
"rft.tpages=300"
|
||||
)
|
||||
transformer = COinSData()
|
||||
result = transformer.transform(sample_data)
|
||||
|
||||
assert isinstance(result, BookData)
|
||||
# The transformer splits on 'rft' after the field value
|
||||
assert "Test Book" in result.title
|
||||
assert "Smith" in result.author
|
||||
|
||||
|
||||
# --- RISData tests ---
|
||||
|
||||
|
||||
class TestRISData:
|
||||
"""Tests for the RISData transformer."""
|
||||
|
||||
def test_ris_data_transform(self):
|
||||
"""Test RISData transform method."""
|
||||
sample_data = """TY - BOOK
|
||||
TI - Test Book Title
|
||||
AU - Smith, John
|
||||
ET - 2nd edition
|
||||
CN - ABC 123
|
||||
SN - 9783123456789
|
||||
LA - English
|
||||
PB - Test Publisher
|
||||
PY - 2023
|
||||
SP - 300
|
||||
DP - https://example.com/book?kid=123456
|
||||
ER -"""
|
||||
transformer = RISData()
|
||||
result = transformer.transform(sample_data)
|
||||
|
||||
assert isinstance(result, BookData)
|
||||
assert result.title == "Test Book Title"
|
||||
assert result.signature == "ABC 123"
|
||||
assert result.edition == "2nd edition"
|
||||
assert result.year == "2023"
|
||||
|
||||
|
||||
# --- BibTeXData tests ---
|
||||
|
||||
|
||||
class TestBibTeXData:
|
||||
"""Tests for the BibTeXData transformer."""
|
||||
|
||||
def test_bibtex_data_transform(self):
|
||||
"""Test BibTeXData transform method."""
|
||||
sample_data = """@book{test2023,
|
||||
title = {Test Book Title},
|
||||
author = {Smith, John and Doe, Jane},
|
||||
edition = {2nd},
|
||||
isbn = {9783123456789},
|
||||
language = {English},
|
||||
publisher = {Test Publisher},
|
||||
year = {2023},
|
||||
pages = {300},
|
||||
bestand = {ABC 123}
|
||||
}"""
|
||||
transformer = BibTeXData()
|
||||
result = transformer.transform(sample_data)
|
||||
|
||||
assert isinstance(result, BookData)
|
||||
assert result.title == "Test Book Title"
|
||||
# BibTeX transformer joins with ; and removes commas
|
||||
assert "Smith John" in result.author
|
||||
assert "Doe Jane" in result.author
|
||||
assert result.signature == "ABC 123"
|
||||
|
||||
|
||||
# --- DictToTable tests ---
|
||||
|
||||
|
||||
class TestDictToTable:
|
||||
"""Tests for the DictToTable transformer."""
|
||||
|
||||
def test_dict_to_table_book_mode(self):
|
||||
"""Test DictToTable with book mode."""
|
||||
data = {
|
||||
"mode": "book",
|
||||
"book_author": "Smith, John",
|
||||
"book_signature": "ABC 123",
|
||||
"book_place": "Berlin",
|
||||
"book_year": "2023",
|
||||
"book_title": "Test Book",
|
||||
"book_edition": "2nd",
|
||||
"book_pages": "300",
|
||||
"book_publisher": "Publisher",
|
||||
"book_isbn": "9783123456789",
|
||||
}
|
||||
transformer = DictToTable()
|
||||
result = transformer.transform(data)
|
||||
|
||||
assert result["type"] == "book"
|
||||
assert result["work_author"] == "Smith, John"
|
||||
assert result["signature"] == "ABC 123"
|
||||
assert result["year"] == "2023"
|
||||
|
||||
def test_dict_to_table_hg_mode(self):
|
||||
"""Test DictToTable with hg (editor) mode."""
|
||||
data = {
|
||||
"mode": "hg",
|
||||
"hg_author": "Chapter Author",
|
||||
"hg_editor": "Editor Name",
|
||||
"hg_year": "2023",
|
||||
"hg_title": "Collection Title",
|
||||
"hg_publisher": "Publisher",
|
||||
"hg_place": "Berlin",
|
||||
"hg_edition": "1st",
|
||||
"hg_chaptertitle": "Chapter Title",
|
||||
"hg_pages": "50-75",
|
||||
"hg_signature": "ABC 123",
|
||||
"hg_isbn": "9783123456789",
|
||||
}
|
||||
transformer = DictToTable()
|
||||
result = transformer.transform(data)
|
||||
|
||||
assert result["type"] == "hg"
|
||||
assert result["section_author"] == "Chapter Author"
|
||||
assert result["work_author"] == "Editor Name"
|
||||
assert result["chapter_title"] == "Chapter Title"
|
||||
|
||||
def test_dict_to_table_zs_mode(self):
|
||||
"""Test DictToTable with zs (journal) mode."""
|
||||
data = {
|
||||
"mode": "zs",
|
||||
"zs_author": "Article Author",
|
||||
"zs_chapter_title": "Article Title",
|
||||
"zs_place": "Berlin",
|
||||
"zs_issue": "Vol. 5, No. 2",
|
||||
"zs_pages": "100-120",
|
||||
"zs_publisher": "Publisher",
|
||||
"zs_isbn": "1234-5678",
|
||||
"zs_year": "2023",
|
||||
"zs_signature": "PER 123",
|
||||
"zs_title": "Journal Name",
|
||||
}
|
||||
transformer = DictToTable()
|
||||
result = transformer.transform(data)
|
||||
|
||||
assert result["type"] == "zs"
|
||||
assert result["section_author"] == "Article Author"
|
||||
assert result["chapter_title"] == "Article Title"
|
||||
assert result["issue"] == "Vol. 5, No. 2"
|
||||
|
||||
def test_dict_to_table_reset(self):
|
||||
"""Test DictToTable reset method."""
|
||||
transformer = DictToTable()
|
||||
transformer.work_author = "Test"
|
||||
transformer.year = "2023"
|
||||
|
||||
transformer.reset()
|
||||
|
||||
assert transformer.work_author is None
|
||||
assert transformer.year is None
|
||||
|
||||
def test_dict_to_table_make_result_excludes_none(self):
|
||||
"""Test that makeResult excludes None values."""
|
||||
transformer = DictToTable()
|
||||
transformer.work_author = "Test Author"
|
||||
transformer.year = "2023"
|
||||
# Leave others as None
|
||||
|
||||
result = transformer.makeResult()
|
||||
|
||||
assert "work_author" in result
|
||||
assert "year" in result
|
||||
assert "section_author" not in result # Should be excluded
|
||||
assert "pages" not in result # Should be excluded
|
||||
|
||||
def test_dict_to_table_invalid_mode(self):
|
||||
"""Test DictToTable with invalid mode returns None."""
|
||||
data = {"mode": "invalid"}
|
||||
transformer = DictToTable()
|
||||
result = transformer.transform(data)
|
||||
|
||||
assert result is None
|
||||
309
tests/test_webrequest.py
Normal file
309
tests/test_webrequest.py
Normal file
@@ -0,0 +1,309 @@
|
||||
"""Tests for the webrequest module."""
|
||||
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
import requests
|
||||
|
||||
from src.bibapi.webrequest import (
|
||||
ALLOWED_IPS,
|
||||
BibTextTransformer,
|
||||
TransformerType,
|
||||
WebRequest,
|
||||
cover,
|
||||
get_content,
|
||||
)
|
||||
|
||||
|
||||
class TestTransformerType:
|
||||
"""Tests for TransformerType enum."""
|
||||
|
||||
def test_transformer_type_values(self):
|
||||
"""Test TransformerType enum values."""
|
||||
assert TransformerType.ARRAY.value == "ARRAY"
|
||||
assert TransformerType.COinS.value == "COinS"
|
||||
assert TransformerType.BibTeX.value == "BibTeX"
|
||||
assert TransformerType.RIS.value == "RIS"
|
||||
assert TransformerType.RDS.value == "RDS"
|
||||
|
||||
|
||||
class TestWebRequest:
|
||||
"""Tests for WebRequest class."""
|
||||
|
||||
def test_webrequest_init_not_allowed_ip(self):
|
||||
"""Test WebRequest raises PermissionError for non-allowed IP."""
|
||||
with patch("requests.get") as mock_get:
|
||||
mock_response = MagicMock()
|
||||
mock_response.text = "192.168.1.1" # Not in ALLOWED_IPS
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
with pytest.raises(PermissionError, match="not allowed"):
|
||||
WebRequest()
|
||||
|
||||
def test_webrequest_init_allowed_ip(self):
|
||||
"""Test WebRequest initializes successfully with allowed IP."""
|
||||
with patch("requests.get") as mock_get:
|
||||
mock_response = MagicMock()
|
||||
mock_response.text = ALLOWED_IPS[0] # Use first allowed IP
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
wr = WebRequest()
|
||||
assert wr.public_ip == ALLOWED_IPS[0]
|
||||
assert wr.timeout == 5
|
||||
assert wr.use_any is False
|
||||
|
||||
def test_webrequest_no_connection(self):
|
||||
"""Test WebRequest raises ConnectionError when no internet."""
|
||||
with patch("requests.get") as mock_get:
|
||||
mock_get.side_effect = requests.exceptions.RequestException("No connection")
|
||||
|
||||
with pytest.raises(ConnectionError, match="No internet connection"):
|
||||
WebRequest()
|
||||
|
||||
def test_webrequest_use_any_book(self):
|
||||
"""Test use_any_book property."""
|
||||
with patch("requests.get") as mock_get:
|
||||
mock_response = MagicMock()
|
||||
mock_response.text = ALLOWED_IPS[0]
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
wr = WebRequest()
|
||||
result = wr.use_any_book
|
||||
assert result.use_any is True
|
||||
|
||||
def test_webrequest_set_apparat(self):
|
||||
"""Test set_apparat method."""
|
||||
with patch("requests.get") as mock_get:
|
||||
mock_response = MagicMock()
|
||||
mock_response.text = ALLOWED_IPS[0]
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
wr = WebRequest()
|
||||
result = wr.set_apparat(5)
|
||||
assert result.apparat == "05" # Padded with 0
|
||||
|
||||
result = wr.set_apparat(15)
|
||||
assert result.apparat == 15 # Not padded
|
||||
|
||||
def test_webrequest_get_ppn(self):
|
||||
"""Test get_ppn method."""
|
||||
with patch("requests.get") as mock_get:
|
||||
mock_response = MagicMock()
|
||||
mock_response.text = ALLOWED_IPS[0]
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
wr = WebRequest()
|
||||
|
||||
# Normal signature
|
||||
result = wr.get_ppn("ABC 123")
|
||||
assert result.ppn == "ABC 123"
|
||||
assert result.signature == "ABC 123"
|
||||
|
||||
# Signature with +
|
||||
result = wr.get_ppn("ABC+123")
|
||||
assert result.ppn == "ABC%2B123"
|
||||
|
||||
# DOI
|
||||
result = wr.get_ppn("https://doi.org/10.1234/test")
|
||||
assert result.ppn == "test"
|
||||
|
||||
def test_webrequest_search_book(self):
|
||||
"""Test search_book method."""
|
||||
with patch("requests.get") as mock_get:
|
||||
# First call for IP check
|
||||
ip_response = MagicMock()
|
||||
ip_response.text = ALLOWED_IPS[0]
|
||||
|
||||
# Second call for actual search
|
||||
search_response = MagicMock()
|
||||
search_response.text = "<html>results</html>"
|
||||
|
||||
mock_get.side_effect = [ip_response, search_response]
|
||||
|
||||
wr = WebRequest()
|
||||
result = wr.search_book("test search")
|
||||
assert result == "<html>results</html>"
|
||||
|
||||
def test_webrequest_search_ppn(self):
|
||||
"""Test search_ppn method."""
|
||||
with patch("requests.get") as mock_get:
|
||||
ip_response = MagicMock()
|
||||
ip_response.text = ALLOWED_IPS[0]
|
||||
|
||||
ppn_response = MagicMock()
|
||||
ppn_response.text = "<html>ppn result</html>"
|
||||
|
||||
mock_get.side_effect = [ip_response, ppn_response]
|
||||
|
||||
wr = WebRequest()
|
||||
result = wr.search_ppn("123456")
|
||||
assert result == "<html>ppn result</html>"
|
||||
|
||||
def test_webrequest_search(self):
|
||||
"""Test search method."""
|
||||
with patch("requests.get") as mock_get:
|
||||
ip_response = MagicMock()
|
||||
ip_response.text = ALLOWED_IPS[0]
|
||||
|
||||
search_response = MagicMock()
|
||||
search_response.text = "<html>detail page</html>"
|
||||
|
||||
mock_get.side_effect = [ip_response, search_response]
|
||||
|
||||
wr = WebRequest()
|
||||
result = wr.search("https://example.com/book")
|
||||
assert result == "<html>detail page</html>"
|
||||
|
||||
def test_webrequest_search_error(self):
|
||||
"""Test search method handles errors."""
|
||||
with patch("requests.get") as mock_get:
|
||||
ip_response = MagicMock()
|
||||
ip_response.text = ALLOWED_IPS[0]
|
||||
|
||||
mock_get.side_effect = [ip_response, requests.exceptions.RequestException()]
|
||||
|
||||
wr = WebRequest()
|
||||
result = wr.search("https://example.com/book")
|
||||
assert result is None
|
||||
|
||||
def test_webrequest_get_book_links(self):
|
||||
"""Test get_book_links method."""
|
||||
html = """<html>
|
||||
<a class="title getFull" href="/opac/book/123">Book 1</a>
|
||||
<a class="title getFull" href="/opac/book/456">Book 2</a>
|
||||
</html>"""
|
||||
|
||||
with patch("requests.get") as mock_get:
|
||||
ip_response = MagicMock()
|
||||
ip_response.text = ALLOWED_IPS[0]
|
||||
|
||||
search_response = MagicMock()
|
||||
search_response.text = html
|
||||
|
||||
mock_get.side_effect = [ip_response, search_response]
|
||||
|
||||
wr = WebRequest()
|
||||
wr.ppn = "test"
|
||||
links = wr.get_book_links("test")
|
||||
|
||||
assert len(links) == 2
|
||||
assert "https://rds.ibs-bw.de/opac/book/123" in links[0]
|
||||
|
||||
|
||||
class TestBibTextTransformer:
|
||||
"""Tests for BibTextTransformer class."""
|
||||
|
||||
def test_bibtexttransformer_init_valid_mode(self):
|
||||
"""Test BibTextTransformer initialization with valid mode."""
|
||||
bt = BibTextTransformer(TransformerType.ARRAY)
|
||||
assert bt.mode == "ARRAY"
|
||||
|
||||
def test_bibtexttransformer_init_default_mode(self):
|
||||
"""Test BibTextTransformer uses ARRAY as default mode."""
|
||||
bt = BibTextTransformer()
|
||||
assert bt.mode == "ARRAY"
|
||||
|
||||
def test_bibtexttransformer_invalid_mode(self):
|
||||
"""Test BibTextTransformer raises error for invalid mode."""
|
||||
|
||||
# Create a fake invalid mode
|
||||
class FakeMode:
|
||||
value = "INVALID"
|
||||
|
||||
with pytest.raises(ValueError, match="not valid"):
|
||||
BibTextTransformer(FakeMode())
|
||||
|
||||
def test_bibtexttransformer_use_signature(self):
|
||||
"""Test use_signature method."""
|
||||
bt = BibTextTransformer()
|
||||
result = bt.use_signature("ABC 123")
|
||||
assert result.signature == "ABC 123"
|
||||
|
||||
def test_bibtexttransformer_get_data_none(self):
|
||||
"""Test get_data with None input."""
|
||||
bt = BibTextTransformer()
|
||||
result = bt.get_data(None)
|
||||
assert result.data is None
|
||||
|
||||
def test_bibtexttransformer_get_data_ris(self):
|
||||
"""Test get_data with RIS format."""
|
||||
bt = BibTextTransformer(TransformerType.RIS)
|
||||
data = ["Some data", "TY - BOOK\nTI - Test"]
|
||||
result = bt.get_data(data)
|
||||
assert "TY -" in result.data
|
||||
|
||||
def test_bibtexttransformer_get_data_array(self):
|
||||
"""Test get_data with ARRAY format."""
|
||||
bt = BibTextTransformer(TransformerType.ARRAY)
|
||||
data = ["Some data", "[kid] => 123456"]
|
||||
result = bt.get_data(data)
|
||||
assert "[kid]" in result.data
|
||||
|
||||
def test_bibtexttransformer_get_data_coins(self):
|
||||
"""Test get_data with COinS format."""
|
||||
bt = BibTextTransformer(TransformerType.COinS)
|
||||
data = ["Some data", "ctx_ver=Z39.88"]
|
||||
result = bt.get_data(data)
|
||||
assert "ctx_ver" in result.data
|
||||
|
||||
def test_bibtexttransformer_get_data_bibtex(self):
|
||||
"""Test get_data with BibTeX format."""
|
||||
bt = BibTextTransformer(TransformerType.BibTeX)
|
||||
data = ["Some data", "@book{test2023,"]
|
||||
result = bt.get_data(data)
|
||||
assert "@book" in result.data
|
||||
|
||||
def test_bibtexttransformer_get_data_rds(self):
|
||||
"""Test get_data with RDS format."""
|
||||
bt = BibTextTransformer(TransformerType.RDS)
|
||||
data = ["Some data", "RDS ---------------------------------- test"]
|
||||
result = bt.get_data(data)
|
||||
assert "RDS" in result.data
|
||||
|
||||
def test_bibtexttransformer_return_data_none(self):
|
||||
"""Test return_data when data is None."""
|
||||
bt = BibTextTransformer()
|
||||
bt.get_data(None)
|
||||
result = bt.return_data()
|
||||
assert result is None
|
||||
|
||||
|
||||
class TestCoverFunction:
|
||||
"""Tests for the cover function."""
|
||||
|
||||
def test_cover_returns_content(self):
|
||||
"""Test cover function returns image content."""
|
||||
with patch("requests.get") as mock_get:
|
||||
mock_response = MagicMock()
|
||||
mock_response.content = b"fake_image_content"
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
result = cover("9783123456789")
|
||||
assert result == b"fake_image_content"
|
||||
|
||||
def test_cover_url_format(self):
|
||||
"""Test cover function calls correct URL."""
|
||||
with patch("requests.get") as mock_get:
|
||||
mock_response = MagicMock()
|
||||
mock_response.content = b""
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
cover("9783123456789")
|
||||
|
||||
called_url = mock_get.call_args[0][0]
|
||||
assert "9783123456789" in called_url
|
||||
assert "buchhandel.de/cover" in called_url
|
||||
|
||||
|
||||
class TestGetContentFunction:
|
||||
"""Tests for the get_content function."""
|
||||
|
||||
def test_get_content(self):
|
||||
"""Test get_content extracts text from div."""
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
html = '<html><div class="test-class"> Content Here </div></html>'
|
||||
soup = BeautifulSoup(html, "html.parser")
|
||||
|
||||
result = get_content(soup, "test-class")
|
||||
assert result == "Content Here"
|
||||
703
testset.txt
Normal file
703
testset.txt
Normal file
@@ -0,0 +1,703 @@
|
||||
PPN EPN Erscheinungsjahr_1100 ISBN_2000 1.Verfasser_3000 Primärkörperschaft_3100 Sekundärkörperschaft_3110 Titel_4000 Titel+Zusatz_4000 Gesamttitel_MBW_4160 Ausgabebezeichnung_4020 Erscheinungsort_4030 Verlag_4030 Signatur_7100 Signatur+Standort_7100 Bibliotheksstandort Bibliothekssigel
|
||||
1618696807 3218599636 2001 3-407-22807-4 "Holowenko, Henryk ; ID: gnd/121378829" Das Aufmerksamkeitsdefizit-Syndrom (ADS) Das Aufmerksamkeitsdefizit-Syndrom (ADS) : wie Zappelkindern geholfen werden kann 4. Aufl. Weinheim [u.a.] Beltz Didaktische Mediothek Handbibliothek "DE-Frei129; DE-1941"
|
||||
1606967541 3125058139 2000 3-89312-061-0 "Gieth, Hans-Jürgen$cvan der *1951-* ; ID: gnd/115766022" Geschichte verstehen lernen Geschichte verstehen lernen : Persönlichkeiten, Ereignisse, Strukturen, Entwicklungen 1. Aufl. Lichtenau AOL Verlag HB Geschichte Handbibliothek DE-Frei129
|
||||
1174205962 2425244581 2001 "Wizadora ; [Themenheft]" [Stuttgart] SWR SDM Handbibliothek DE-Frei129
|
||||
1172719780 2421549728 2001 3-12-585030-4 "Snap! / Hamm, Wolf *1974-* ; ID: gnd/133072215 ; 3, [Schulerbuch]" 1. Aufl., [Nachdr.] - 2001. "Stuttgart; München; Düsseldorf; Leipzig" Klett SDM Handbibliothek DE-Frei129
|
||||
1190638576 2459762828 1998 3-12-546435-8 Für Klasse 7 .. Für Klasse 7 .. "Learning English - Red line new. - [Ausgabe für Baden-Württemberg, Schleswig-Holstein, Mecklenburg-Vorpommern und Sachsen-Anhalt] ; 3, Workbook" 1. Aufl., [Nachdr.]. "Stuttgart; Leipzig" Klett SDM Handbibliothek DE-Frei129
|
||||
1151574554 2368372490 1998 3-12-996672-2 "Learning English - Red line new. - [Ausgabe für Baden-Württemberg, Schleswig-Holstein, Mecklenburg-Vorpommern und Sachsen-Anhalt] ; 4, Bildfolien" "Stuttgart; Leipzig" Klett SDM Handbibliothek DE-Frei129
|
||||
1150196971 2365552293 1998 3-12-546423-4 "Learning English - Red line new. - [Ausgabe für Baden-Württemberg, Schleswig-Holstein, Mecklenburg-Vorpommern und Sachsen-Anhalt] ; 2, Begleitbuch fur den Unterricht" 1. Aufl., [Nachdr.] - 1998. "Stuttgart; Leipzig" Klett SDM Handbibliothek DE-Frei129
|
||||
1132420024 2316335446 1996 3-12-546471-4 Serie A Serie A "Learning English - Red line new. - [Ausgabe für Baden-Württemberg, Schleswig-Holstein, Mecklenburg-Vorpommern und Sachsen-Anhalt] ; 1, Bildfolien" "Stuttgart; Leipzig" Klett SDM Handbibliothek DE-Frei129
|
||||
1129038416 2305111010 1996 3-12-585320-6 Kontrollaufgaben Kontrollaufgaben "Let's go ; Für Klasse 7 ; 3" 1. Aufl., 4.[Dr.] - 1996. Stuttgart Klett SDM Handbibliothek DE-Frei129
|
||||
1128312751 2302762886 1996 3-12-585321-4 Kontrollaufgaben, Ausg. mit Lösungen und Lehrerhinweisen Kontrollaufgaben, Ausg. mit Lösungen und Lehrerhinweisen "Let's go ; Für Klasse 7 ; 3, Lehrerheft" 1. Aufl., 3. Stuttgart Klett SDM Handbibliothek DE-Frei129
|
||||
1128312689 2302762746 1996 3-12-585221-8 Kontrollaufgaben, Ausg. mit Lösungen und Lehrerhinweisen Kontrollaufgaben, Ausg. mit Lösungen und Lehrerhinweisen "Let's go ; Für Klasse 6 ; 2, Lehrerheft" 1. Aufl., 3. Dr. Stuttgart Klett SDM Handbibliothek DE-Frei129
|
||||
1128312549 2302762339 1996 3-12-585121-1 Kontrollaufgaben, Ausgb. mit Lösungen und Lehrerhinweisen Kontrollaufgaben, Ausgb. mit Lösungen und Lehrerhinweisen "Let's go ; Für Klasse 5 ; 1, Lehrerheft" 1. Aufl., 2. Dr., 1994. Stuttgart Klett SDM Handbibliothek DE-Frei129
|
||||
1128310414 2302756290 1996 3-12-585120-3 Kontrollaufgaben Kontrollaufgaben "Let's go ; Für Klasse 5 ; 1" 1. Aufl., 4. [Dr.] - 1996. 39 S.. Stuttgart Klett SDM Handbibliothek DE-Frei129
|
||||
1129040399 2305116748 1995 3-12-585420-2 Kontrollaufgaben Kontrollaufgaben "Let's go ; Für Klasse 8 ; 4" 1. Aufl., 3. [Dr.] - 1995. Stuttgart Klett SDM Handbibliothek DE-Frei129
|
||||
1128310546 2302756630 1995 3-12-585220-X Kontrollaufgaben Kontrollaufgaben "Let's go ; Für Klasse 6 ; 2" 1. Aufl., 3. [Dr.] - 1995. Stuttgart Klett SDM Handbibliothek DE-Frei129
|
||||
1140921622 2340572630 1998 3-12-199521-9 "Das Zahlenbuch. - Ziffern in Schulausgangsschrift, Rechtschreibreform ; 2, Ubungsheft" 1. Aufl., 2. [Dr.], Rechtschreibreform. "Leipzig; Stuttgart" Klett-Grundschulverl. Handbibliothek DE-Frei129
|
||||
662045653 3183422638 2005 "978-0-521-45922-8; 978-0-521-45305-9; 978-3-12-533922-4; 0-521-45922-2; 0-521-45305-4; 3-12-533922-7" "Lock, Graham ; ID: gnd/1164518690" Functional English grammar Functional English grammar : an introduction for second language teachers [Nachdr.] "Cambridge; New York, NY; Melbourne; [Stuttgart]" "Cambridge University Press; [Klett]" HD 196 L813 HD 196 L813 Handbibliothek-Büro Hutz "DE-46; DE-Frei129"
|
||||
1669179974 3497555401 1996 3-86121-070-3 "Temel Türkçe ; 13" "Oberhausen; Hückelhoven" "Ortado?u; Anadolu" Büro Kalkavan-Aydin Büro Kalkavan-Aydin Handbibliothek-Büro Kalkavan-Aydin DE-Frei129
|
||||
1669179850 3497555711 1996 3-86121-056-8 "Temel Türkçe ; 12" "Oberhausen; Hückelhoven" "Ortado?u; Anadolu" Büro Kalkavan-Aydin Büro Kalkavan-Aydin Handbibliothek-Büro Kalkavan-Aydin DE-Frei129
|
||||
166914965X 3497605816 1996 3-86121-055-X "Temel Türkçe ; 11" "Oberhausen; Hückelhoven" "Ortado?u; Anadolu" Büro Kalkavan-Aydin Büro Kalkavan-Aydin Handbibliothek-Büro Kalkavan-Aydin DE-Frei129
|
||||
1669146111 3497608289 1996 "Temel Türkçe ; 9, Çal??ma Kitabi" "Oberhausen; Hückelhoven" "Ortado?u; Anadolu" Büro Kalkavan-Aydin Büro Kalkavan-Aydin Handbibliothek-Büro Kalkavan-Aydin DE-Frei129
|
||||
1670089088 3497554774 1993 3-925206-07-8 "Temel Türkçe ; [Arbeitsbuch]" Oberhausen Ortado?u Büro Kalkavan-Aydin Büro Kalkavan-Aydin Handbibliothek-Büro Kalkavan-Aydin DE-Frei129
|
||||
1669149358 3497607282 1993 3-925206-70-1 "Temel Türkçe ; 10" "Oberhausen; Hückelhoven" "Ortado?u; Anadolu" Büro Kalkavan-Aydin Büro Kalkavan-Aydin Handbibliothek-Büro Kalkavan-Aydin DE-Frei129
|
||||
166913959X 3497609374 1993 3-925206-16-7 "Temel Türkçe ; 8, Calisma Kitabi" "Oberhausen; Hückelhoven" "Ortado?u; Anadolu" Büro Kalkavan-Aydin Büro Kalkavan-Aydin Handbibliothek-Büro Kalkavan-Aydin DE-Frei129
|
||||
1669138828 3497552089 1993 "Temel Türkçe ; 8" "Oberhausen; Hückelhoven" "Ortado?u; Anadolu" Büro Kalkavan-Aydin Büro Kalkavan-Aydin Handbibliothek-Büro Kalkavan-Aydin DE-Frei129
|
||||
1669135144 3497552437 1993 "Temel Türkçe ; 7, Çal??ma Kitab?" "Oberhausen; Hückelhoven" "Ortado?u; Anadolu" Büro Kalkavan-Aydin Büro Kalkavan-Aydin Handbibliothek-Büro Kalkavan-Aydin DE-Frei129
|
||||
1669149463 3497606561 1992 3-925206-71-X "Temel Türkçe ; 10, Çal??ma Kitab?" "Oberhausen; Hückelhoven" "Ortado?u; Anadolu" Büro Kalkavan-Aydin Büro Kalkavan-Aydin Handbibliothek-Büro Kalkavan-Aydin DE-Frei129
|
||||
84068505X 3497553093 1985 3-925206-10-8 "Temel Türkçe ; 6, [Schülerbd.]" "Oberhausen; Hückelhoven" "Ortado?u; Anadolu" Büro Kalkavan-Aydin Büro Kalkavan-Aydin Handbibliothek-Büro Kalkavan-Aydin "DE-Bs78; DE-Frei129"
|
||||
1613980906 3179876735 1998 3-507-10580-2 Biologie "Biologie : Lehrbuch fuer die Oberstufe; Gesamtband" 21., neu bearb. Aufl. Stuttgart Metzler WB 4062 L744 (21) WB 4062 L744 (21) Handbibliothek-Büro Küchler DE-Frei129
|
||||
1559745770 2971898237 2007 3-507-10580-2 Gesamtband Gesamtband "Biologie ; (gesa.2004,7)" 21., neubearb. Aufl., 7. Dr. Stuttgart Metzler WB 4072 B615 (21) WB 4072 B615 (21) Handbibliothek-Büro Küchler DE-Frei129
|
||||
1560717467 2973666627 1978 Holz, H. M. Was man von der Fluoreszenz-Mikroskopie wissen sollte Was man von der Fluoreszenz-Mikroskopie wissen sollte 3. neubearbeitete Auflage Oberkochen Zeiss WC 2900 H762 (3) WC 2900 H762 (3) Handbibliothek-Büro Küchler DE-Frei129
|
||||
1560723440 2973674859 1974 Möldner, K. Präparationsverfahren für die Transmissions-Elektronenmikroskopie Präparationsverfahren für die Transmissions-Elektronenmikroskopie Oberkochen Zeiss WC 2900 M693 WC 2900 M693 Handbibliothek-Büro Küchler DE-Frei129
|
||||
375667008 3085568301 1998 3-440-07529-X Der neue Kosmos-Tier- und Pflanzenführer Der neue Kosmos-Tier- und Pflanzenführer 3. Aufl. Stuttgart Franckh-Kosmos WI 7315 S854 (3) WI 7315 S854 (3) Handbibliothek-HB Biologie "DE-15-292; DE-Frei129"
|
||||
1184141002 2448281971 2004 3-12-772404-7 Elektrizität, Wasser, Akustik, Mechanik, Wärme, Luft. Lehrerband. Hin- weise zur Versuchsdurchführung, Lernziele, Zusatzinformationen u. Lösungen Elektrizität, Wasser, Akustik, Mechanik, Wärme, Luft. Lehrerband. Hin- weise zur Versuchsdurchführung, Lernziele, Zusatzinformationen u. Lösungen "Natur phänomenal ; 1/2, Lehrerband" 1. Aufl., [Nachdr.]. "Stuttgart; Düsseldorf; Leipzig" Klett TB 4073 G389 L -1/2 TB 4073 G389 L -1/2 Handbibliothek-HB Chemie DE-Frei129
|
||||
118605039X 2452121975 1986 Schäfer, Hildegard Die Bildwortserie zur Lautagnosieprüfung und zur Schulung des phonetische Gehörs Die Bildwortserie zur Lautagnosieprüfung und zur Schulung des phonetische Gehörs Weinheim [u.a.] Beltz CT 2400 S294 CT 2400 S294 Handbibliothek-HB Deutsch "DE-15-292; DE-Frei129"
|
||||
1503485471 2845624158 1986 Finkbeiner, Siegfried Minifatz - Wortbausteine und Satzsymbole Minifatz - Wortbausteine und Satzsymbole Baiersbronn-Schönmünzach Minifatz-Lehrmittel GB 2980 I M664 GB 2980 I M664 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1153338203 2373257548 1963 "Kern, Artur *1902-1988* ; ID: gnd/11872195X" bim bam beier bim bam beier : ein Sprachbüchlein für das 2. Schuljahr 12. Aufl. Freiburg Herder GB 2980 I R594 -2(12) GB 2980 I R594 -2(12) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1153231409 2372935879 1960 "Kern, Artur *1902-1988* ; ID: gnd/11872195X" Ri-ra-rumpelstiez Ri-ra-rumpelstiez : ein ganzheitliches Sprachbüchlein für das 3. Schuljahr 6. Aufl. Freiburg [u.a.] Herder GB 2980 I R594 -3(6) GB 2980 I R594 -3(6) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1153231204 2372935356 1969 Boeke, Werner Lehrerheft zu Ri-ra-rumpelstiez Lehrerheft zu Ri-ra-rumpelstiez : ein Sprachbüchlein für das 3. Schuljahr 7. Aufl. Freiburg Herder [u.a.] GB 2980 I R594 L -3(7) GB 2980 I R594 L -3(7) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157279260 238413745X 1969 5. Schuljahr 5. Schuljahr "Deutsches Sprachbuch ; 1, [Hauptbd.]" Karlsruhe Braun GB 2980 II R554 -1 GB 2980 II R554 -1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1503704424 2846190062 1974 Querschnitt Querschnitt Material für gezieltes Rechtschreib-Training (MGR) "Weinheim; Basel" Beltz GB 2982 M947 GB 2982 M947 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154434192 2376382327 1989 3-619-24300-X "Wie ist das mit der Rechtschreibung? ; 2" 3. Aufl. Offenburg Mildenberger GB 2982 W542 -2(3) GB 2982 W542 -2(3) Handbibliothek-HB Deutsch "DE-15; DE-Frei129"
|
||||
1154434605 2376383439 1982 "Wie ist das mit der Rechtschreibung?. - [Ausg. Baden-Württemberg] ; 2" Lehrerheft mit Lösungen - 1. Aufl. Offenburg Mildenberger GB 2982 W542 W9 -2 GB 2982 W542 W9 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1609474929 314505791X 1981 3-451-17514-2 Leichter lesen lernen Leichter lesen lernen : e. neuer Weg zur akust. u. opt. Analyse 3. Aufl. , Schreibschriftausgabe Freiburg im Breisgau Herder GB 2984 K39 (3) GB 2984 K39 (3) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1610023501 3148758722 1990 3-89111-052-9 "Sengstmann, Ingelore *1949-* ; ID: gnd/1145771769" Aufsatzunterricht Orientierungsstufe Aufsatzunterricht Orientierungsstufe 3. Aufl. Lichtenau AOL-Verl. GB 2986 S476 (3) GB 2986 S476 (3) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615186352 3189997616 2008 "3-619-14180-0; 978-3-619-14180-7" Wetter, Edmund Schlag auf, schau nach! "Schlag auf, schau nach! : Wörterbuch für die Grundschule in 11 Teilen; [das überarbeitete Wörterbuch mit der neuen Rechtschreibung 2006]" 4. Aufl. Offenburg Mildenberger GB 2990 W542 (4) GB 2990 W542 (4) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1355689511 2577305850 2007 978-3-619-14182-1 2. Schuljahr 2. Schuljahr "Arbeitsheft zum Wörterbuch 'Schlag auf, schau nach' ; 1" 1. Aufl., [Nachdr.] Offenburg Mildenberger GB 2990 W542 A -1 GB 2990 W542 A -1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1355689783 2578728828 2007 978-3-619-14183-8 3. und 4. Schuljahr 3. und 4. Schuljahr "Arbeitsheft zum Wörterbuch 'Schlag auf, schau nach' ; 2" Offenburg Mildenberger GB 2990 W542 A -2 GB 2990 W542 A -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1504209419 2847037101 1975 Wort-Bild-Karten Wort-Bild-Karten Gut lesen - richtig schreiben Offenburg Mildenberger GB 3000 I G983 Z GB 3000 I G983 Z Handbibliothek-HB Deutsch DE-Frei129
|
||||
150370033X 2846183457 1970 "Kern, Artur *1902-1988* ; ID: gnd/11872195X" Wir lernen lesen "Wir lernen lesen : Arbeitskarten für die Hand des Kindes; das neue Fibelwerk. Lesetechnischer Lehrgang" Freiburg i.Br. Herder GB 3000 I K39 Z GB 3000 I K39 Z Handbibliothek-HB Deutsch DE-Frei129
|
||||
1153403951 2373452774 1982 3-451-18443-5 2. Schuljahr 2. Schuljahr "Leserunde ; 2" 3. Aufl. Freiburg im Breisgau Herder GB 3000 I R941 -2(3) GB 3000 I R941 -2(3) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1160381577 3550148062 1971 3-7650-3111-9 Bausteine zu Deutsches Lesebuch für Gymnasien, (5. Schuljahr) Bausteine zu Deutsches Lesebuch für Gymnasien, (5. Schuljahr) "Deutsches Lesebuch für Gymnasien ; 1, Lehrerhandbuch" Karlsruhe Braun GB 3000 II D486 L -1 GB 3000 II D486 L -1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1160381739 2844070582 1972 3-7650-3112-7 Bausteine zu Deutsches Lesebuch für Gymnasien, (6. Schuljahr) Bausteine zu Deutsches Lesebuch für Gymnasien, (6. Schuljahr) "Deutsches Lesebuch für Gymnasien ; 2, Lehrerhandbuch" Karlsruhe Braun GB 3000 II D486 L -2 GB 3000 II D486 L -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1351407643 2572669064 1978 3-451-14699-1 "Deutsche Sprache ; 9, [Hauptbd.]" 2. Aufl. Freiburg im Breisgau Herder MA 07/988 MA 07/988 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1351406922 2572667649 1978 3-451-17726-9 "Deutsche Sprache ; 6" 2. Aufl. Freiburg im Breisgau Herder MA 07/991 MA 07/991 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1417185317 2683061307 1978 3-451-17808-7 "Wir sprechen, wir schreiben, wir lesen. - Neuausg. ; 2, Sprachbuch" 3. Aufl. Freiburg Herder MA 11/1544 MA 11/1544 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1417186135 2683062990 1979 3-451-17819-2 "Wir sprechen, wir schreiben, wir lesen. - Neuausg. ; 4, Sprachbuch" Freiburg Herder MA 11/1547 MA 11/1547 Handbibliothek-HB Deutsch DE-Frei129
|
||||
226662578 3190740593 1992 3-12-306340-2 "Clasen, Thomas *1968-* ; ID: gnd/12278409X" Die Prinzessin und der Mond Die Prinzessin und der Mond : Theatertips für die Schule 1. Aufl., 2. [Dr.] Stuttgart [u.a.] Klett-Schulbuchverl. AP 69200 C614 AP 69200 C614 Handbibliothek-HB Deutsch "DE-9; DE-Fl3; DE-Frei129"
|
||||
307233154 3185113853 1994 3-12-306290-2 "Lehmann, Herbert *1957-* ; ID: gnd/121546098" Das spielende Klassenzimmer Das spielende Klassenzimmer : Anregungen zum Theatermachen 1. Aufl., [5. Dr.] Stuttgart [u.a.] Klett-Schulbuchverl. AP 69250 L523 AP 69250 L523 Handbibliothek-HB Deutsch "DE-9; DE-Luen4; DE-Frei129"
|
||||
237990474 3185104986 1995 3-12-306300-3 Maute, Gabriele Märchenspiele - märchenhafte Wirklichkeit Märchenspiele - märchenhafte Wirklichkeit 1. Aufl., [Nachdr.] Stuttgart Klett-Schulbuchverl. AP 69250 M459 AP 69250 M459 Handbibliothek-HB Deutsch "DE-18; DE-Luen4; DE-Frei129"
|
||||
1323542701 2508102202 2005 3-7627-2653-1 Das bärenstarke Arbeitsheft Das bärenstarke Arbeitsheft "Das Sprachbuch. - Ausgabe D [Neuausgabe für alle Bundesländer] ; 3, Arbeitsheft mit CD-ROM" 1. Aufl. "München; Düsseldorf; Stuttgart" Bayerischer Schulbuch-Verlag Deu O 210: 92 A,3 CROM Deu O 210: 92 A,3 CROM Handbibliothek-HB Deutsch DE-Frei129
|
||||
1183513747 2507121505 2005 3-486-15083-9 "Leseschule. - Ausg. D, Neubearb. [für alle Bundesländer außer Bayern] ; 3, Arbeitsheft" 1. Aufl. "München; Düsseldorf; Stuttgart" Oldenbourg Deu O 510: 9 A,3 Deu O 510: 9 A,3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
019765029 3296776737 1991 3-12-924401-8 "Krause, Gudrun *1960-* ; ID: gnd/172196116" Unterrichtsmodelle für das dritte Schuljahr Unterrichtsmodelle für das dritte Schuljahr 2. Aufl. "Stuttgart; Dresden" Klett DP 3100 K91 (2) DP 3100 K91 (2) Handbibliothek-HB Deutsch "DE-46; DE-3; DE-3; DE-Ma9; DE-700; DE-Fl3; DE-Au3; DE-14; DE-15; DE-Ch1; DE-Frei129"
|
||||
1610233166 3150418216 1995 3-12-260960-6 "Fühmann, Franz *1922-1984* ; ID: gnd/118536672" Das Nibelungenlied Das Nibelungenlied 1. Aufl., 12. Dr. Stuttgart Klett ED 5230 F953 ED 5230 F953 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504182"
|
||||
1621538524 3240871777 2005 3-473-37819-4 Die schönsten Zaubertricks für Kinder Die schönsten Zaubertricks für Kinder [Nachdr.] Ravensburg Ravensburger Buchverl. ED 5430 M621 ED 5430 M621 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1606427563 3120347108 1995 3-12-352050-1 "$PSophocles *ca. 497/496 v. Chr.-406 v. Chr.* ; ID: gnd/118615688" Antigone Antigone : mit Materialien 1. Aufl., 2. [Dr.] "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. FH 22975 A629 FH 22975 A629 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1625618344 3262788252 1986 3-12-349000-9 Perspektiven Perspektiven : Grundlagen zum Verstehen und Verfassen von Texten im Deutschunterricht der Sekundarstufe II 1. Aufl., 9. Dr. Stuttgart Klett GB 2926 H553 GB 2926 H553 Handbibliothek-HB Deutsch "DE-291-306; DE-15; DE-Frei129; DE-B478"
|
||||
161449293X 3183998106 1992 3-12-359800-4 Formen des Gesprächs im Drama "Formen des Gesprächs im Drama : ein Kurs im Deutschunterricht auf der Oberstufe; Begleitmaterial zu einer Sendereihe des Süddeutschen Rundfunks" 1. Aufl., 9. Dr. Stuttgart Klett GB 2952 B422 GB 2952 B422 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1112447768 224447240X 1991 ([ca. 1991]) ([ca. 1991]) "Spaß an Sprache ; 2" Rangendingen Lipura-Verl.-Ges. GB 2954 L948 -2 GB 2954 L948 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
183084470 3095665342 1994 3-12-306350-X "Fritzsche, Joachim *1943-* ; ID: gnd/1145390307" Schreibwerkstatt "Schreibwerkstatt : Geschichten und Gedichte ; Schreibaufgaben, -übungen, -spiele" 1. Aufl., [Nachdr.] "Stuttgart; Leipzig [u.a.]" Klett Schulbuchverl. GB 2964 F919 GB 2964 F919 Handbibliothek-HB Deutsch "DE-547; DE-547; DE-3; DE-Luen4; DE-Fl3; DE-Frei129; DE-Lg1"
|
||||
1154763951 237731516X 1999 3-12-213458-6 "Sicher zum Aufsatz ; [Mit lateinischer Ausgangsschrift] ; 3, Arbeitsh." 1. Aufl., [Nachdr.], Rechtschreibreform. Stuttgart Klett GB 2964 S565 A -3 GB 2964 S565 A -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154764273 2377316026 1998 3-12-213459-4 "Sicher zum Aufsatz ; [Mit lateinischer Ausgangsschrift] ; 4, Arbeitsh." 1. Aufl., [Nachdr.], Rechtschreibreform. Stuttgart Klett GB 2964 S565 A -4 GB 2964 S565 A -4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
070492123 3126134815 1998 3-12-311200-4 "Waldmann, Günter *1926-2020* ; ID: gnd/137625804" Erzählen Erzählen : eine Einführung in kreatives Schreiben und produktives Verstehen von traditionellen und modernen Erzählformen 1. Aufl., [Nachdr.] Stuttgart [u.a.] Klett Schulbuchverl. GB 2964 W164 GB 2964 W164 Handbibliothek-HB Deutsch "DE-Hil2; DE-Frei129; DE-Tue128"
|
||||
1606723928 3122858754 2009 978-3-12-554615-8 "Bundesverband Alphabetisierung und Grundbildung ; ID: gnd/10155702-4" Arbeit und Beruf Arbeit und Beruf 1. Aufl. [Nachdr.] Stuttgart [u.a.] Klett GB 2968 H587 GB 2968 H587 Handbibliothek-HB Deutsch "DE-15; DE-Frei129"
|
||||
159102308 318553378X 1992 3-12-399010-9 Gedichte in ihrer Epoche Gedichte in ihrer Epoche 1. Aufl., [4. Dr.] Stuttgart Klett GB 2976 D797 GB 2976 D797 Handbibliothek-HB Deutsch "DE-27; DE-Va1; DE-Va1; DE-Frei129"
|
||||
626710049 3151058442 1988 3-12-350250-3 "Kabisch, Eva-Maria *1941-2021* ; ID: gnd/108049124" Interpretation wiederholen und üben Interpretation wiederholen und üben : ein Arbeitsheft für den Deutschunterricht der Sekundarstufe II 1. Aufl., [Nachdr.] Stuttgart Klett GB 2976 K11 GB 2976 K11 Handbibliothek-HB Deutsch "DE-Au3; DE-Frei129"
|
||||
1610338707 3151058779 1994 3-12-350250-3 "Kabisch, Eva-Maria *1941-2021* ; ID: gnd/108049124" Interpretation - wiederholen und üben Interpretation - wiederholen und üben : ein Arbeitsheft für den Deutschunterricht der Sekundarstufe II 1. Aufl., 7. [Dr.] Stuttgart [u.a.] Klett, Schulbuchverl. GB 2976 K11 (7) GB 2976 K11 (7) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154974081 2377876730 1995 3-12-347700-2 "Produktives Verstehen von Literatur ; [Hauptbd.]" 1. Aufl., 3. [Dr.] - 1995. Stuttgart Klett GB 2976 K83 GB 2976 K83 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614546215 3184445658 1993 3-12-927483-9 Lutz, Rosemarie Stundenblätter Fabeln Stundenblätter Fabeln : Grund- und Aufbauprogramme für die Klassen 5 - 10 5. Aufl. "Stuttgart; Dresden" Klett GB 2976 L975 (5) GB 2976 L975 (5) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1323541942 2508100676 2005 3-7627-0066-4 Bibu Bär geht in die Wörterschule Bibu Bär geht in die Wörterschule "Das Sprachbuch. - Ausgabe D [Neuausgabe für alle Bundesländer] ; 1/2, Wortkarten zum Grundwortschatz mit Texten und Reimen" 1. Aufl. "München; Düsseldorf; Stuttgart" Bayerischer Schulbuch-Verlag GB 2980 I D229 Z -1/2 GB 2980 I D229 Z -1/2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
132354299X 2508102776 2005 3-7627-0068-0 Bibu Bär geht in die Wörterschule Bibu Bär geht in die Wörterschule : lateinische Ausgangsschrift "Das Sprachbuch. - Ausgabe D [Neuausgabe für alle Bundesländer] ; 3, Wortkarten zum Grundwortschatz mit Texten und Reimen" 1. Aufl. "München; Düsseldorf; Stuttgart" Bayerischer Schulbuch-Verlag GB 2980 I D229 Z -3 GB 2980 I D229 Z -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
116342613X 2398225461 1998 3-12-211229-9 "Sprachfuchs - II. - Baden-Württemberg ; Lehrerband ; 2, Lehrerband" [Nachdr.] - 1998. "Stuttgart; Leipzig" Klett GB 2980 I L524 -2 GB 2980 I L524 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1163426547 2398226417 2000 3-12-211329-5 [Nachdr.] - 2000 [Nachdr.] - 2000 "Sprachfuchs - II. - Baden-Württemberg ; Lehrerband ; 3, Lehrerbd." "Stuttgart; Leipzig" Klett GB 2980 I L524 -3 GB 2980 I L524 -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1153064294 2621903576 1979 3-12-238330-6 "Wortwechsel ; 3, Lehrerheft" 1. Aufl. Stuttgart Klett GB 2980 I W935 L -3/1 GB 2980 I W935 L -3/1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157357687 2384365916 1977 3-12-321600-4 5. Schuljahr 5. Schuljahr "Sprachbuch. - A/B-Ausg. ; 5, [Hauptbd.]" 1. Aufl., [Nachdr.] - 1977. Stuttgart Klett GB 2980 II A115 -5 GB 2980 II A115 -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157390897 2384451790 1976 3-12-324100-9 Lehrervorwort Lehrervorwort "Sprachbuch. - A/B-Ausg. ; 8,L" 1. Aufl., [Nachdr.] - 1976.. Stuttgart Klett GB 2980 II A115 L -8/3 GB 2980 II A115 L -8/3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
115739065X 2384451057 1977 3-12-323400-2 Übungsheft Grammatik, Anhang: Zusammenfassung der Grammatik Übungsheft Grammatik, Anhang: Zusammenfassung der Grammatik "Sprachbuch. - A/B-Ausg. ; 7,Ubungsh." 1. Aufl., [Nachdr.]. Stuttgart Klett GB 2980 II A115 Z -7/1 GB 2980 II A115 Z -7/1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155438108 237914365X 1979 3-12-362000-X 1. Aufl., [Nachdr.] - 1979 1. Aufl., [Nachdr.] - 1979 "Sprachbuch. - Grundausgabe ; 6. Schulj." Stuttgart Klett GB 2980 II B422 -6 GB 2980 II B422 -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1161372326 2395362964 2000 3-12-316800-X 1. Aufl., [Nachdr.] 1. Aufl., [Nachdr.] "Geradeaus. - Ausgabe für Baden-Württemberg ; 8, [Hauptband]" "Stuttgart; Leipzig" Klett-Schulbuchverl. GB 2980 II G354 -8 GB 2980 II G354 -8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1164334018 2400189528 2000 3-12-316900-6 Erarb. von Angelika Endell .. Erarb. von Angelika Endell .. "Geradeaus. - [Grundausgabe] ; 9, [Hauptbd.]" 1. Aufl. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GB 2980 II G354 -9 GB 2980 II G354 -9 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1165019752 2402107022 1999 3-12-316730-5 "Geradeaus. - [Grundausgabe] ; 7, Lehrerband" 1. Aufl. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GB 2980 II G354 L -7 GB 2980 II G354 L -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1117700003 2265000132 1992 3-12-350313-5 Lehrerband Lehrerband "Schriftstücke ; (lehr)" 1. Aufl., 2. [Dr.] - 1992. Stuttgart Klett GB 2980 II H473 L GB 2980 II H473 L Handbibliothek-HB Deutsch "DE-15; DE-Frei129"
|
||||
1155543920 2379444129 1978 3-12-363400-0 Übungsheft Grammatik. Anhang: Zusammenfassung der Grammatik Übungsheft Grammatik. Anhang: Zusammenfassung der Grammatik "Sprachbuch. - [Ausg.] C ; 7" 1. Aufl., [Nachdr.] - 1978.. Stuttgart Klett GB 2980 II I35 A -7/1 GB 2980 II I35 A -7/1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155544080 2379444447 1980 3-12-363500-7 Übungsheft Rechtschreibung und Zeichensetzung Übungsheft Rechtschreibung und Zeichensetzung "Sprachbuch. - [Ausg.] C ; 7" 7. Schuljahr - 1. Aufl., [Nachdr.] - 1980.. Stuttgart Klett GB 2980 II I35 A -7/2 GB 2980 II I35 A -7/2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155438752 2379145318 1977 3-12-321000-6 5. Schuljahr 5. Schuljahr "Sprachbuch ; a5" 1. Aufl., [Nachdr.] - 1977. Stuttgart Klett GB 2980 II K15 -5 GB 2980 II K15 -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155440099 2379148880 1977 3-12-322000-1 6. Schuljahr 6. Schuljahr "Sprachbuch ; a6" 1. Aufl., [Nachdr.] - 1977. Stuttgart Klett GB 2980 II K15 -6 GB 2980 II K15 -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155439856 2379148422 1980 3-12-321500-8 Übungsheft Rechtschreibung und Zeichensetzung Übungsheft Rechtschreibung und Zeichensetzung "Sprachbuch ; 5,Uebh." 1. Aufl., [Nachdr.] - 1980. Stuttgart Klett GB 2980 II K15 A -5/2 GB 2980 II K15 A -5/2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155440218 2379149437 19XX 3-12-322400-7 Übungsheft Grammatik Übungsheft Grammatik "Sprachbuch ; 6,Uebh." 1. Aufl., [Nachdr.] - 1978. Stuttgart Klett GB 2980 II K15 A -6/1 GB 2980 II K15 A -6/1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155440277 237914950X 1980 3-12-322500-3 Übungsheft Rechtschreibung und Zeichensetzung Übungsheft Rechtschreibung und Zeichensetzung "Sprachbuch ; 6,Uebh." [Nachdr.] - 1980. Stuttgart Klett GB 2980 II K15 A -6/2 GB 2980 II K15 A -6/2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
115766671X 2385308029 1965 5. Schuljahr 5. Schuljahr "Lebendige Muttersprache. - Ausg. B ; 1" 4. Aufl., 8. [Druck]. Stuttgart Klett GB 2980 II M993 -1(4) GB 2980 II M993 -1(4) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157666981 2385308479 1965 6. Schuljahr 6. Schuljahr "Lebendige Muttersprache. - Ausg. B ; 2, [Hauptbd.]" 4. Aufl., 9. [Druck]. Stuttgart Klett GB 2980 II M993 -2(4) GB 2980 II M993 -2(4) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157667368 2385309289 1965 7. Schuljahr 7. Schuljahr "Lebendige Muttersprache. - Ausg. B ; 3" 3. Aufl., 7. [Druck]. Stuttgart Klett GB 2980 II M993 -3(3) GB 2980 II M993 -3(3) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157668550 2385311925 1978 3-12-024000-1 8. Schuljahr 8. Schuljahr "Lebendige Muttersprache. - Ausg. B ; 4" 3. Aufl., [Nachdruck]. Stuttgart Klett GB 2980 II M993 -4(3) GB 2980 II M993 -4(3) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157668801 2385312328 1977 3-12-025000-7 9. Schuljahr 9. Schuljahr "Lebendige Muttersprache. - Ausg. B ; 5" 2. Aufl., 18. [Druck]. Stuttgart Klett GB 2980 II M993 -5(2) GB 2980 II M993 -5(2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157667821 2385310082 1972 3-12-023300-5 Lehrerheft - 1. Aufl., 4. [Druck] Lehrerheft - 1. Aufl., 4. [Druck] "Lebendige Muttersprache. - Ausg. B ; 3-4" Stuttgart Klett GB 2980 II M993 L -3/4 GB 2980 II M993 L -3/4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
115798357X 2386187373 1976 3-12-330000-5 "Deutsche Spracherziehung. Ausgabe B ; 1" 8. Aufl., 19. [Dr.]. Stuttgart Klett GB 2980 II R148 -1(8) GB 2980 II R148 -1(8) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158033958 2386336271 1974 3-12-332000-6 "Deutsche Spracherziehung. Ausgabe B ; 3" 6. Aufl., 19. [Dr.]. Stuttgart Klett GB 2980 II R148 -3(6) GB 2980 II R148 -3(6) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158035055 238633953X 1976 3-12-333000-1 5. Aufl., 17. [Dr.] 5. Aufl., 17. [Dr.] "Deutsche Spracherziehung. Ausgabe B ; 4" Stuttgart Klett GB 2980 II R148 -4(5) GB 2980 II R148 -4(5) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157983588 238618739X 1975 3-12-330300-4 "Deutsche Spracherziehung. Ausgabe B ; 1, Lehrerheft" 1. Aufl., 5. Dr. Stuttgart Klett GB 2980 II R148 L -1 GB 2980 II R148 L -1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158035314 2386340082 1971 3-12-334400-2 Mittelstufe, Sprachbertachtung Mittelstufe, Sprachbertachtung "Deutsche Spracherziehung. Ausgabe B ; 4-6, Lehrerheft" 1. [Aufl.], 4. [Dr.]. Stuttgart Klett GB 2980 II R148 L -4/6/1 GB 2980 II R148 L -4/6/1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158037791 3525649371 1985 3-12-313670-1 "Sprachschlüssel. - Baden-Württemberg ; Ausgabe A ; Ausgabe A ; 6, [Hauptbd.]" 1. Aufl., 2. [Dr.]. Stuttgart Klett GB 2980 II S 766 B4 -6 GB 2980 II S 766 B4 -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155360435 2378906447 1993 3-12-320310-7 "Sprachbegleiter ; 1, [Hauptbd.]" Fallsetzung nach Präposition - 1. Aufl., [Nachdr.] - 1993.. Stuttgart Klett GB 2980 II S571 -1 GB 2980 II S571 -1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155362330 2378910762 1992 3-12-320320-4 "Sprachbegleiter ; 2, [Hauptbd.]" Fallsetzung von Objekten und Appositionen - 1. Aufl., [Nachdr.] - 1992.. Stuttgart Klett GB 2980 II S571 -2 GB 2980 II S571 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155362969 2378912374 1992 3-12-320330-1 "Sprachbegleiter ; Heft 3, Der Konjunktiv. Schwache und starke Verben ; 3, [Hauptbd.]" 1. Aufl., [Nachdr.] - 1992.. Stuttgart Klett GB 2980 II S571 -3 GB 2980 II S571 -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155364198 2378916434 1993 3-12-320340-9 "Sprachbegleiter ; Heft 4, Zeit- und Besitzverhältnisse ; 4, [Hauptbd.]" 1. Aufl., [Nachdr.] - 1993.. Stuttgart Klett GB 2980 II S571 -4 GB 2980 II S571 -4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155360672 2378906919 1994 3-12-320311-5 "Sprachbegleiter ; 1, Losungen" Fallsetzung nach Präposition - 1. Aufl., [Nachdr.] - 1994.. Stuttgart Klett GB 2980 II S571 L -1 GB 2980 II S571 L -1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155362632 2378911602 1993 3-12-320321-2 "Sprachbegleiter ; 2, Losungen" Fallsetzung von Objekten und Appositionen - 1. Aufl., [Nachdr.]. Stuttgart Klett GB 2980 II S571 L -2 GB 2980 II S571 L -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155364309 2378916604 1991 3-12-320341-7 "Sprachbegleiter ; Heft 4, Zeit- und Besitzverhältnisse ; 4, Losungen" 1. Aufl., [Nachdr.] - 1991.. Stuttgart Klett GB 2980 II S571 L -4 GB 2980 II S571 L -4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
115803735X 238634780X 1988 3-12-313576-4 Zu Rechtschreibung und Grammatik Zu Rechtschreibung und Grammatik "Sprachschlüssel. - Baden-Württemberg ; Ausgabe A ; Ausgabe A ; 5, Ubungsh." [Nachdr.] - 1988. Stuttgart Klett GB 2980 II S766 A -5 GB 2980 II S766 A -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158110707 2386563162 1991 3-12-313770-8 "Sprachschlüssel. - Baden-Württemberg ; Ausgabe A ; 7, [Hauptbd.]" 1. Aufl., 3. [Dr.]. Stuttgart Klett GB 2980 II S944 -7 GB 2980 II S944 -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158112122 238656598X 1991 3-12-313776-7 Zu Rechtschreibung, Zeichensetzung, Wortbildung und Grammatik Zu Rechtschreibung, Zeichensetzung, Wortbildung und Grammatik "Sprachschlüssel. - Baden-Württemberg ; Ausgabe A ; 7, Ubungsh." [Nachdr.] - 1991.. Stuttgart Klett GB 2980 II S944 A -7 GB 2980 II S944 A -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158113188 2386568954 1991 3-12-313773-2 "Sprachschlüssel. - Baden-Württemberg ; Ausgabe A ; 7, Lehrerbd." 1. Aufl., [Nachdr.] - 1991.. Stuttgart Klett GB 2980 II S944 L -7/1 GB 2980 II S944 L -7/1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157669883 2385315815 1972 3-12-021200-8 "Lebendige Muttersprache. - Ausg. B für vierstufige Realschule ; 1" 1. Aufl., 7. [Druck]. Stuttgart Klett GB 2980 II V665 -1 GB 2980 II V665 -1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157670067 2385316188 1972 3-12-022200-3 "Lebendige Muttersprache. - Ausg. B für vierstufige Realschule ; 2" 1. Aufl., 7. [Druck]. Stuttgart Klett GB 2980 II V665 -2 GB 2980 II V665 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157670296 2385316927 1973 3-12-023200-9 "Lebendige Muttersprache. - Ausg. B für vierstufige Realschule ; 3" 3. Aufl., 7. [Druck]. Stuttgart Klett GB 2980 II V665 -3(3) GB 2980 II V665 -3(3) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157670385 2385317087 1973 3-12-024200-4 "Lebendige Muttersprache. - Ausg. B für vierstufige Realschule ; 4" 2. Aufl., 6. [Druck]. Stuttgart Klett GB 2980 II V665 -4(2) GB 2980 II V665 -4(2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157670180 2385316641 1971 3-12-023230-0 "Lebendige Muttersprache. - Ausg. B für vierstufige Realschule ; 3-4" 2. Aufl., 2. [Druck]. Stuttgart Klett GB 2980 II V665 L -3/4(2) GB 2980 II V665 L -3/4(2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158197772 2386799514 1995 3-12-803200-9 "Alltagsszenen ; [Hauptbd.]" 1. Aufl., 10. Dr. Stuttgart Klett GB 2980 III A442 GB 2980 III A442 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158196733 3538635137 1982 3-12-768500-9 31 Kapitel Deutsch für Erwachsene 31 Kapitel Deutsch für Erwachsene "Situationen ; [Hauptbd.]" 1. Aufl., 5. Dr Stuttgart Klett GB 2980 III S623 GB 2980 III S623 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155284755 2378690509 1993 3-12-803300-5 "Verständigung ; [Hauptbd.]" 1. Aufl., 8. [Dr.]. Stuttgart Klett GB 2980 III V565 GB 2980 III V565 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155284844 2378690681 1992 3-12-803390-0 "Verständigung ; Lehrerbd" 1. Aufl., 2. [Dr.]. Stuttgart Klett GB 2980 III V565 L GB 2980 III V565 L Handbibliothek-HB Deutsch DE-Frei129
|
||||
115615491X 2381074120 1994 3-12-803600-4 "Deutsch vor Ort ; [Hauptbd.]" 1. Aufl., 2. [Dr.]. "Stuttgart; Dresden" Klett-Verl. für Wissen u. Bildung GB 2980 III V953 GB 2980 III V953 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1156155096 2381074392 1995 3-12-803690-X "Deutsch vor Ort ; Lehrerbd." 1. Aufl., 2. [Dr.]. "Stuttgart; Dresden" Klett-Verl. für Wissen u. Bildung GB 2980 III V953 L GB 2980 III V953 L Handbibliothek-HB Deutsch DE-Frei129
|
||||
1153151642 2372691414 19XX 4. Schuljahr 4. Schuljahr "Spreche und schreibe ich richtig? ; 4 [Schulerband]" Stuttgart Klett GB 2980 S378 -4 GB 2980 S378 -4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155269306 2378648766 19XX 6. Schuljahr 6. Schuljahr "Spreche und schreibe ich richtig? ; 6 [Schulerband]" Stuttgart Klett GB 2980 S378 -6 GB 2980 S378 -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155269497 2378649738 19XX 7. Schuljahr 7. Schuljahr "Spreche und schreibe ich richtig? ; 7 [Schulerband]" Stuttgart Klett GB 2980 S378 -7 GB 2980 S378 -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155269764 2378650418 1970 9. Schuljahr 9. Schuljahr "Spreche und schreibe ich richtig? ; 9 [Schulerband]" 1. Aufl., 7. [Dr.]. Stuttgart Klett GB 2980 S378 -9 GB 2980 S378 -9 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155653262 2379766835 1990 3-12-313000-2 Ausgabe C - 1. Aufl., [Nachdr.] - 1990. Ausgabe C - 1. Aufl., [Nachdr.] - 1990. "Sprachschlüssel. - [Grundausgabe und Ausgabe C für Baden-Württemberg] ; C10,Sprachbuch" Stuttgart Klett GB 2980 S766 -10 GB 2980 S766 -10 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155645979 2691398145 1991 3-12-311570-4 Grundausgabe - 1. Aufl., [Nachdr.] - 1991. Grundausgabe - 1. Aufl., [Nachdr.] - 1991. "Sprachschlüssel. - [Grundausgabe und Ausgabe C für Baden-Württemberg] ; 5,Sprachbuch" Stuttgart Klett GB 2980 S766 -5 GB 2980 S766 -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155652886 2379766177 1988 3-12-311970-X Ausgabe C - 1. Aufl Ausgabe C - 1. Aufl "Sprachschlüssel. - [Grundausgabe und Ausgabe C für Baden-Württemberg] ; C9,Sprachbuch" Stuttgart Klett GB 2980 S766 -9 GB 2980 S766 -9 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155647033 237975165X 1990 Grundausgabe - 1. Aufl Grundausgabe - 1. Aufl "Sprachschlüssel. - [Grundausgabe und Ausgabe C für Baden-Württemberg] ; 5,Arbeitsheft" Stuttgart Klett GB 2980 S766 A -5 GB 2980 S766 A -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155648676 2379755752 1990 3-12-311660-3 Grundausgabe - 1. Aufl Grundausgabe - 1. Aufl "Sprachschlüssel. - [Grundausgabe und Ausgabe C für Baden-Württemberg] ; 6,Arbeitsheft" Stuttgart Klett GB 2980 S766 A -6 GB 2980 S766 A -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155651618 2379763712 1992 3-12-311860-6 Ausgabe C - 1. Aufl Ausgabe C - 1. Aufl "Sprachschlüssel. - [Grundausgabe und Ausgabe C für Baden-Württemberg] ; C8,Arbeitsheft" Stuttgart Klett GB 2980 S766 A -8 GB 2980 S766 A -8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155653203 2379766754 1991 3-12-311960-2 Ausgabe C - 1. Aufl Ausgabe C - 1. Aufl "Sprachschlüssel. - [Grundausgabe und Ausgabe C für Baden-Württemberg] ; C9,Arbeitsheft" Stuttgart Klett GB 2980 S766 A -9 GB 2980 S766 A -9 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155653114 2379766622 1992 3-12-311920-3 Ausgabe C - 1. Aufl Ausgabe C - 1. Aufl "Sprachschlüssel. - [Grundausgabe und Ausgabe C für Baden-Württemberg] ; C9,Differenzierungsheft" Stuttgart Klett GB 2980 S766 Z -9 GB 2980 S766 Z -9 Handbibliothek-HB Deutsch DE-Frei129
|
||||
110551174X 2215966602 1993 3-12-219100-8 "Sicher zur Rechtschreibung ; 5, Arbeitsh." 2. Aufl., 7. [Dr.] - 1993. Stuttgart Klett GB 2982 G747 -5(2) GB 2982 G747 -5(2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
113920260X 2336063115 1997 3-12-219280-2 "Sicher zur Rechtschreibung ; 6, Arbeitsh." 3. Aufl. Stuttgart Klett GB 2982 G747 -6(3) GB 2982 G747 -6(3) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614313997 3182547828 1997 3-12-320670-X "Häcker, Roland *1900-* ; ID: gnd/172149495" Neue Schreibung leicht gelernt Neue Schreibung leicht gelernt : Arbeitsheft zur Rechtschreibreform 1. Aufl., [Nachdr.] "Stuttgart; Leipzig [u.a.]" Klett GB 2982 H133 GB 2982 H133 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1331154286 2525800745 1993 "Materialpaket Rechtschreiben ; Folien" Stuttgart Klett-Schulbuchverl. GB 2982 H185 Z GB 2982 H185 Z Handbibliothek-HB Deutsch DE-Frei129
|
||||
1153151758 2372691716 1969 2. Schuljahr 2. Schuljahr "Spreche und schreibe ich richtig?. - Ausgabe B und C ; 2, [Schulerbd.]" 1. Aufl. Stuttgart Klett GB 2982 R537 -2 GB 2982 R537 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
112125473X 2278404598 1971 3-12-248300-9 3. Schuljahr 3. Schuljahr "Spreche und schreibe ich richtig?. - Ausgabe B und C ; 3, [Schulerbd.]" 1. Aufl. Stuttgart Klett GB 2982 R537 -3 GB 2982 R537 -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155270401 2378652062 1972 3-12-248500-1 5. Schuljahr 5. Schuljahr "Spreche und schreibe ich richtig?. - Ausgabe B und C ; 5, [Schulerbd.]" 2. Aufl., 9. [Dr.]. Stuttgart Klett GB 2982 R537 -5(2) GB 2982 R537 -5(2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
112160580X 2279626543 1972 3-12-248600-8 6. Schuljahr 6. Schuljahr "Spreche und schreibe ich richtig?. - Ausgabe B und C ; 6, [Schulerbd.]" 2. Aufl., 8. [Dr.]. Stuttgart Klett GB 2982 R537 -6(2) GB 2982 R537 -6(2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1121606326 2279628635 1971 3-12-243700-7 7. Schuljahr 7. Schuljahr "Spreche und schreibe ich richtig?. - Ausgabe B und C ; 7, [Schulerbd.]" 1. Aufl., 6. [Dr.]. Stuttgart Klett GB 2982 R537 -7 GB 2982 R537 -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1121606563 2279629232 1972 3-12-243800-3 8. Schuljahr 8. Schuljahr "Spreche und schreibe ich richtig?. - Ausgabe B und C ; 8, [Schulerbd.]" 1. Aufl., 5. [Dr.]. Stuttgart Klett GB 2982 R537 -8 GB 2982 R537 -8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155273443 2378660065 1974 3-12-248590-7 5. Schuljahr 5. Schuljahr "Spreche und schreibe ich richtig?. - Ausgabe B und C ; 5, Lehrerband" 1. Aufl., 2. [Dr.]. Stuttgart Klett GB 2982 R537 L -5 GB 2982 R537 L -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155273516 2378660251 1974 3-12-248690-3 6. Schuljahr 6. Schuljahr "Spreche und schreibe ich richtig?. - Ausgabe B und C ; 6, Lehrerband" 1. Aufl., 2. [Dr.]. Stuttgart Klett GB 2982 R537 L -6 GB 2982 R537 L -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155270274 2378651759 1973 3-12-248510-9 für die Hauptschule, 5. Schuljahr für die Hauptschule, 5. Schuljahr "Spreche und schreibe ich richtig?. - Ausgabe B und C ; 5, Erganzungsheft" 2. Aufl., 6. [Dr.]. Stuttgart Klett GB 2982 R537 Z -5(2) GB 2982 R537 Z -5(2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155273494 2378660227 1972 3-12-248610-5 für die Hauptschule, 6. Schuljahr für die Hauptschule, 6. Schuljahr "Spreche und schreibe ich richtig?. - Ausgabe B und C ; 6, Erganzungsheft" 1. Aufl., 4. [Dr.]. Stuttgart Klett GB 2982 R537 Z -6 GB 2982 R537 Z -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1155273621 2378660650 1972 3-12-243810-0 für die Hauptschule, 8. Schuljahr für die Hauptschule, 8. Schuljahr "Spreche und schreibe ich richtig?. - Ausgabe B und C ; 8, Erganzungsheft" 1. Aufl., 3. [Dr.]. Stuttgart Klett GB 2982 R537 Z -8 GB 2982 R537 Z -8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1503763854 2846280444 1981 3-12-216300-4 3. Schuljahr 3. Schuljahr : Arbeitsblätter zum Rechtschreiben "Mein Rechtschreibbegleiter ; 3, Arbei." 1. Aufl. Stuttgart Klett GB 2982 S571 -3 GB 2982 S571 -3 Handbibliothek-HB Deutsch "DE-H155; DE-Frei129"
|
||||
1154381811 2376229138 1994 3-12-217120-1 5./6. Schuljahr 5./6. Schuljahr "Mein Rechtschreibbegleiter ; 1" 1. Aufl., [Nachdr.] Stuttgart Klett GB 2982 S571 -5/6/1 GB 2982 S571 -5/6/1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154381919 2376229332 1984 3-12-217220-8 5./6. Schuljahr - 1. Aufl., [Nachdr.] - 1984 5./6. Schuljahr - 1. Aufl., [Nachdr.] - 1984 "Mein Rechtschreibbegleiter ; 2" Stuttgart Klett GB 2982 S571 -5/6/2 GB 2982 S571 -5/6/2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154381927 2376229359 1983 3-12-217320-4 5./6. Schuljahr - 1. Aufl., [Nachdr.] - 1983 5./6. Schuljahr - 1. Aufl., [Nachdr.] - 1983 "Mein Rechtschreibbegleiter ; 3" Stuttgart Klett GB 2982 S571 -5/6/3 GB 2982 S571 -5/6/3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
115439977X 2376282195 1984 3-12-217400-6 7./9. Schuljahr - 1. Aufl., [Nachdr.] - 1984 7./9. Schuljahr - 1. Aufl., [Nachdr.] - 1984 "Mein Rechtschreibbegleiter ; 1" Stuttgart Klett GB 2982 S571 -7/9/1 GB 2982 S571 -7/9/1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154399923 237628242X 1984 3-12-217500-2 7./9. Schuljahr - 1. Aufl., [Nachdr.] - 1984 7./9. Schuljahr - 1. Aufl., [Nachdr.] - 1984 "Mein Rechtschreibbegleiter ; 2" Stuttgart Klett GB 2982 S571 -7/9/2 GB 2982 S571 -7/9/2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1161885668 239679678X 2000 3-12-216121-4 "Der neue Rechtschreibbegleiter ; [Mit lateinischer Ausgangsschrift] ; 2, [Hauptbd.]" 1. Aufl., [Nachdr.], Rechtschreibreform. "Stuttgart; Leipzig" Klett GB 2982 S571 R2 -2 GB 2982 S571 R2 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1161885803 2396797042 2000 3-12-216132-X "Der neue Rechtschreibbegleiter ; Mit vereinfachter Ausgangsschrift ; 3, [Hauptbd.]" 1. Aufl., [Nachdr.] - Rechtschreibreform. "Stuttgart; Leipzig" Klett GB 2982 S571 R2 -3 GB 2982 S571 R2 -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154477746 2376502179 1995 3-12-217250-X "Der neue Rechtschreibbegleiter ; [Mit lateinischer Ausgangsschrift] ; 5, [Hauptbd.]" 1. Aufl., 5. [Dr.] - 1995. "Stuttgart; Leipzig" Klett GB 2982 S571 R2 -5 GB 2982 S571 R2 -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154478246 2376504708 1994 3-12-217350-6 "Der neue Rechtschreibbegleiter ; [Mit lateinischer Ausgangsschrift] ; 6, [Hauptbd.]" 1. Aufl., 2. [Dr.] - 1994. "Stuttgart; Leipzig" Klett GB 2982 S571 R2 -6 GB 2982 S571 R2 -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154478696 2376506255 1993 3-12-217351-4 Mit Lösungen Mit Lösungen "Der neue Rechtschreibbegleiter ; [Mit lateinischer Ausgangsschrift] ; 6, Lehrerh." 1. Aufl., 2. [Dr.] - 1993. "Stuttgart; Leipzig" Klett GB 2982 S571 R2 L-6 GB 2982 S571 R2 L-6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157612520 2385151553 1993 3-12-350273-2 "Grundkurs Rhetorik ; Lehrerheft" 1. Aufl., [Nachdr.] - 1993. Stuttgart Klett GB 2984 G661 L GB 2984 G661 L Handbibliothek-HB Deutsch DE-Frei129
|
||||
1147066248 2621880916 19XX 3-927538-67-1 Ein Leselehrgang auf synthetisch-methodenintegrierender Grundlage Ein Leselehrgang auf synthetisch-methodenintegrierender Grundlage "Der Lesebär ; [Hauptbd.]" Reutlingen Herbert GB 2984 K79 -1 GB 2984 K79 -1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1147067481 2356798390 19XX 3-927538-75-2 Differenzierende Texte zum Leselehrgang. Schulschrift N Differenzierende Texte zum Leselehrgang. Schulschrift N "Der Lesebär ; [Diff]" Reutlingen Herbert GB 2984 K79 -2 GB 2984 K79 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154431622 2376376017 1987 3-12-212121-2 2. Schuljahr 2. Schuljahr "Sicher zum Grundwortschatz ; mit lateinischer Ausgangsschrift ; 2, Arbeitsheft" 1. Aufl., 4. [Dr.]. "Stuttgart; Leipzig" Klett GB 2990 G747 -2 GB 2990 G747 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154432521 2376377501 1987 3-12-212150-6 4. Schuljahr 4. Schuljahr "Sicher zum Grundwortschatz ; mit lateinischer Ausgangsschrift ; 4, Arbeitsheft" 1. Aufl., 3. [Dr.]. "Stuttgart; Leipzig" Klett GB 2990 G747 -4 GB 2990 G747 -4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154785149 2377372856 1999 3-12-212102-6 "Sicher zum Grundwortschatz. - [Rechtschreibreform] ; Mit lateinischer Ausgangsschrift ; 2, Arbeitsheft" 1. Aufl., [Nachdr.] - 1999. "Stuttgart; Leipzig" Klett GB 2990 G747 S5 -2 GB 2990 G747 S5 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154784983 237737266X 1999 3-12-212103-4 "Sicher zum Grundwortschatz. - [Rechtschreibreform] ; Mit lateinischer Ausgangsschrift ; 3, Arbeitsheft" 1. Aufl., [Nachdr.] - 1999. "Stuttgart; Leipzig" Klett GB 2990 G747 S5 -3 GB 2990 G747 S5 -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154783863 2377370268 1999 3-12-212104-2 "Sicher zum Grundwortschatz. - [Rechtschreibreform] ; Mit lateinischer Ausgangsschrift ; 4, Arbeitsheft" 1. Aufl., [Nachdr.] - 1999. "Stuttgart; Leipzig" Klett GB 2990 G747 S5 -4 GB 2990 G747 S5 -4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154537323 2376678986 1982 3-12-769900-X "Fidibus - Kleines deutsches Wörterbuch ; 3/4" 1. Aufl., 2. [Dr.] - 1982.. Stuttgart Klett GB 2990 K13 -3/4 GB 2990 K13 -3/4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154430138 2376371953 1987 3-12-212100-X 1. Aufl., [Nachdr.] - 1987. 1. Aufl., [Nachdr.] - 1987. "Wie schlag ich nach? ; 2" Stuttgart Klett GB 2990 S355 -2 GB 2990 S355 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154430472 2376372747 1989 3-12-212100-X 1. Aufl., [Nachdr.] - 1989. 1. Aufl., [Nachdr.] - 1989. "Wie schlag ich nach? ; 2" Stuttgart Klett GB 2990 S355 -2(N) GB 2990 S355 -2(N) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154429679 2376370876 1986 3-12-212200-6 2. Aufl 2. Aufl "Wie schlag ich nach? ; 3/4" Stuttgart Klett GB 2990 S355 -3/4(2) GB 2990 S355 -3/4(2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1322931291 2507120932 2004 3-486-15102-9 "Leseschule. - Ausg. D, Neubearb. [für alle Bundesländer außer Bayern] ; 2, ExtraKlasse Rechtschreib-Geschichten" 1. Aufl. "München; Düsseldorf; Stuttgart" Oldenbourg GB 2996 I L628 Z -2(N) GB 2996 I L628 Z -2(N) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1322931755 2507122196 2005 3-486-15103-7 "Leseschule. - Ausg. D, Neubearb. [für alle Bundesländer außer Bayern] ; 3, ExtraKlasse Rechtschreib-Geschichten" 1. Aufl. "München; Düsseldorf; Stuttgart" Oldenbourg GB 2996 I L628 Z -3(N) GB 2996 I L628 Z -3(N) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1322931895 2507122471 2006 3-486-15104-5 "Leseschule. - Ausg. D, Neubearb. [für alle Bundesländer außer Bayern] ; 4, ExtraKlasse Rechtschreib-Geschichten" 1. Aufl. "München; Düsseldorf; Stuttgart" Oldenbourg GB 2996 I L628 Z -4(N) GB 2996 I L628 Z -4(N) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1153337266 2373253925 1995 3-12-211701-0 "Sprach-Sach-Mach-Buch ; 2, [Arbeitsh.]" 1. Aufl., 2. [Dr.] - 1995. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GB 2996 I S121 -2 GB 2996 I S121 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1329860365 2520220112 2005 3-486-10217-6 Arbeitsheft für das 7. Schuljahr Arbeitsheft für das 7. Schuljahr "DeutschProfi. - Ausgabe A ; 3, Arbeitsheft" 1. Aufl., unveränd. Nachdr "München; Düsseldorf; Stuttgart" Oldenbourg GB 2996 II D755 A -3 GB 2996 II D755 A -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1327046342 2516158181 2005 3-12-314231-0 Arbeitsheft für das 5. Schuljahr Arbeitsheft für das 5. Schuljahr "deutsch.werk. - Realschule ; 1, Arbeitsh." 1. Aufl. "Leipzig; Stuttgart; Düsseldorf" Klett GB 2996 II W488 A -1 GB 2996 II W488 A -1 Handbibliothek-HB Deutsch "DE-291-306; DE-Frei129"
|
||||
1330507509 2524411796 2006 "3-12-314232-9; 978-3-12-314232-1" Arbeitsheft für das 6. Schuljahr Arbeitsheft für das 6. Schuljahr "deutsch.werk. - Realschule ; 2, Arbeitsh." 1. Aufl., [Nachdr.] "Leipzig; Stuttgart; Düsseldorf" Klett GB 2996 II W488 A -2 GB 2996 II W488 A -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
115494588X 2377799418 1993 3-12-347420-8 Aufklärung, Sturm und Drang Aufklärung, Sturm und Drang "Geschichte der deutschen Literatur ; 1" 1. Aufl., Nachdr. Stuttgart Klett GB 2998 G389 -1 GB 2998 G389 -1 Handbibliothek-HB Deutsch "DE-291-306; DE-Frei129"
|
||||
1325363820 251229658X 1995 3-12-347430-5 Klassik, Romantik Klassik, Romantik "Geschichte der deutschen Literatur ; 2" 1. Aufl., [Nachdr.] Stuttgart Klett GB 2998 G389 -2 GB 2998 G389 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1118617290 2268426580 1993 3-12-347430-5 Klassik, Romantik Klassik, Romantik "Geschichte der deutschen Literatur ; 2" 1. Aufl., 7. Dr. Stuttgart Klett GB 2998 G389 -2 GB 2998 G389 -2 Handbibliothek-HB Deutsch "DE-291-306; DE-15; DE-Frei129"
|
||||
1114769061 2253665606 1994 3-12-347440-2 Biedermeier - Vormärz, Bürgerlicher Realismus Biedermeier - Vormärz, Bürgerlicher Realismus "Geschichte der deutschen Literatur ; 3" 1. Aufl., 5. [Dr.] Stuttgart Klett GB 2998 G389 -3 GB 2998 G389 -3 Handbibliothek-HB Deutsch "DE-15; DE-Frei129; DE-59"
|
||||
1109066333 2230450956 1993 3-12-347450-X Vom Naturalismus zum Expressionismus, Literatur des Kaiserreichs Vom Naturalismus zum Expressionismus, Literatur des Kaiserreichs "Geschichte der deutschen Literatur ; 4" 1. Aufl., 5. Dr. Stuttgart Klett GB 2998 G389 -4 GB 2998 G389 -4 Handbibliothek-HB Deutsch "DE-291-306; DE-14; DE-15; DE-Frei129"
|
||||
1322492409 2506014705 1995 3-12-347460-7 Von der Weimarer Republik bis 1945 Von der Weimarer Republik bis 1945 "Geschichte der deutschen Literatur ; 5" Stuttgart Klett GB 2998 G389 -5 GB 2998 G389 -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1118617495 2268427048 1993 3-12-347460-7 Von der Weimarer Republik bis 1945 Von der Weimarer Republik bis 1945 "Geschichte der deutschen Literatur ; 5" 1. Aufl,5. Dr. Stuttgart Klett GB 2998 G389 -5 GB 2998 G389 -5 Handbibliothek-HB Deutsch "DE-291-306; DE-15; DE-Frei129"
|
||||
111258174X 2245008200 1993 3-12-347470-4 Von 1945 bis zur Gegenwart Von 1945 bis zur Gegenwart "Geschichte der deutschen Literatur ; 6" Stuttgart Klett GB 2998 G389 -6 GB 2998 G389 -6 Handbibliothek-HB Deutsch "DE-291-306; DE-14; DE-15; DE-Frei129"
|
||||
1154152871 2375562313 1994 3-12-250900-8 Auf analytisch-synthetischer Grundlage Auf analytisch-synthetischer Grundlage "Der ABC-Fuchs ; Leselehrwerk" 1. Aufl., 5. [Dr.] - 1994. "Stuttgart; Leipzig" Klett-Schulbuchverl. GB 3000 I A134 GB 3000 I A134 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154152944 2375562410 1994 3-12-250920-2 Von Franz-Josef Wolf Von Franz-Josef Wolf "Der ABC-Fuchs ; Schreiblehrgang ; Druckschrift" 1. Aufl., 2. [Dr.] - 1994. "Stuttgart; Leipzig" Klett-Schulbuchverl. GB 3000 I A134 Z GB 3000 I A134 Z Handbibliothek-HB Deutsch DE-Frei129
|
||||
115415291X 2375562372 1993 3-12-250930-X Von Alfred Hafner Von Alfred Hafner "Der ABC-Fuchs ; Schreiblehrgang ; Lateinische Ausgangsschrift" 1. Aufl., 2. [Dr.] - 1993. "Stuttgart; Leipzig" Klett-Schulbuchverl. GB 3000 I A134 Z1 GB 3000 I A134 Z1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1564523551 2984583426 2008 978-3-403-04972-2 Mein Tagebuch Mein Tagebuch Die Auer-Fibel. - [Ausg. für] Baden-Württemberg 1. Auflage "Stuttgart; Leipzig" Klett GB 3000 I A257 Z2 GB 3000 I A257 Z2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
137987128X 2608437621 2006 978-3-12-230271-9 Anton, das kleine Gespenst Anton, das kleine Gespenst : Lustige Gespenstergeschichten nach Buchstabenkanon (ab N n) "Frohes Lernen. - [Allgemeine Ausg., Neuentwicklung] ; Leseheft 1" 1. Aufl. "Stuttgart; Leipzig" Klett GB 3000 I F928 Z -1 GB 3000 I F928 Z -1 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504128"
|
||||
1379871379 2608437842 2006 978-3-12-230272-6 Anton, das kleine Gespenst Anton, das kleine Gespenst : Lustige Gespenstergeschichten nach Buchstabenkanon (ab N n) "Frohes Lernen. - [Allgemeine Ausg., Neuentwicklung] ; Leseheft 2" 1. Aufl., Vereinfachte Ausg. "Stuttgart; Leipzig" Klett GB 3000 I F928 Z -2 GB 3000 I F928 Z -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
137987145X 2608437974 2006 978-3-12-230273-3 Antongeschichten Antongeschichten "Frohes Lernen. - [Allgemeine Ausg., Neuentwicklung] ; Leseheft 3" 1. Aufl. "Stuttgart; Leipzig" Klett GB 3000 I F928 Z -3 GB 3000 I F928 Z -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1379871522 2608438164 2006 978-3-12-230274-0 Ami und Mia Ami und Mia "Frohes Lernen. - [Allgemeine Ausg., Neuentwicklung] ; Leseheft 4" 1. Aufl. "Stuttgart; Leipzig" Klett GB 3000 I F928 Z -4 GB 3000 I F928 Z -4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1379871859 2608438342 2006 978-3-12-230275-7 Ami und Mia Ami und Mia "Frohes Lernen. - [Allgemeine Ausg., Neuentwicklung] ; Leseheft 5" 1. Aufl., Vereinfachte Ausg. "Stuttgart; Leipzig" Klett GB 3000 I F928 Z -5 GB 3000 I F928 Z -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1379871964 2608438520 2006 978-3-12-230276-4 Das war bestimmt wieder Mimi Das war bestimmt wieder Mimi "Frohes Lernen. - [Allgemeine Ausg., Neuentwicklung] ; Leseheft 6" 1. Aufl. "Stuttgart; Leipzig" Klett GB 3000 I F928 Z -6 GB 3000 I F928 Z -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1382187610 2612627227 2009 978-3-12-300223-6 1. Schuljahr, 1. Leseheft = Schwierigkeitsgrad 1 1. Schuljahr, 1. Leseheft = Schwierigkeitsgrad 1 "Piri - Leseheft ; 1, Leseh. 1" 1. Aufl. "Leipzig; [Stuttgart]" Klett-Grundschulverl. GB 3000 I H472 -1/1 GB 3000 I H472 -1/1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1382187742 2612627685 2009 978-3-12-300223-6 1. Schuljahr, 1. Leseheft = Schwierigkeitsgrad 1 1. Schuljahr, 1. Leseheft = Schwierigkeitsgrad 1 "Piri - Leseheft ; 1, Leseh. 2" 1. Aufl. "Leipzig; [Stuttgart]" Klett-Grundschulverl. GB 3000 I H472 -1/2 GB 3000 I H472 -1/2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1382187971 2612628002 2009 978-3-12-300223-6 1. Schuljahr, 1. Leseheft = Schwierigkeitsgrad 1 1. Schuljahr, 1. Leseheft = Schwierigkeitsgrad 1 "Piri - Leseheft ; 1, Leseh. 3" 1. Aufl. "Leipzig; [Stuttgart]" Klett-Grundschulverl. GB 3000 I H472 -1/3 GB 3000 I H472 -1/3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1324479507 251020890X 2004 3-12-250820-6 "Die Kunterbunt-Fibel. - Rechtschreibreform ; Vereinfachte Ausgangsschrift ; Schreiblehrgang" 1. Aufl., [Nachdr.] "Stuttgart; Leipzig" Klett GB 3000 I K23 Z GB 3000 I K23 Z Handbibliothek-HB Deutsch DE-Frei129
|
||||
1322531846 2506116753 2002 3-12-250800-1 1. Aufl., [Nachdr.] 1. Aufl., [Nachdr.] "Die Kunterbunt-Fibel. - Rechtschreibreform ; [Schulerbd.]" "Stuttgart; Leipzig" Klett GB 3000 I K95 GB 3000 I K95 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1129092429 2305287070 1996 3-12-250730-7 "Die Kunterbunt-Fibel ; Schreiblehrgang, Lateinische Ausgangsschrift" 1. Aufl., 4. [Dr.] - 1996. "Stuttgart; Leipzig" Klett GB 3000 I K96 Z GB 3000 I K96 Z Handbibliothek-HB Deutsch DE-Frei129
|
||||
1153375354 2621906125 1975 3-12-262100-2 "Lesebuch ; 2" 1. Aufl., [7. Dr.]. Stuttgart Klett GB 3000 I L454 -2 GB 3000 I L454 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1153398044 2373436353 1975 3-12-263100-8 "Lesebuch ; 3" 1. Aufl., [4. Dr.]. Stuttgart Klett GB 3000 I L454 -3 GB 3000 I L454 -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1379854598 2608380050 2009 978-3-12-300206-9 Silbenspiele Silbenspiele "Piri - Silbenfibel ; 1, Silbenspiele" 1. Aufl., [Nachdr.] "Stuttgart; [Leipzig]" Klett GB 3000 I P668 Z1 GB 3000 I P668 Z1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1153429438 2373524759 1977 "3-12-237300-9; 3-12-237350-5" "Der Lesespiegel ; 3, Lesebuch" 1. Aufl. Stuttgart Klett GB 3000 I S755 -3 GB 3000 I S755 -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154103870 2375409388 1987 3-12-250610-6 "Unsere Fibel ; Ubungen" 1. Aufl., 2. [Dr.] - 1987. Stuttgart Klett GB 3000 I U23 A GB 3000 I U23 A Handbibliothek-HB Deutsch DE-Frei129
|
||||
1154103854 2375409337 1987 3-12-250600-9 (Druckschrift) (Druckschrift) "Unsere Fibel ; Schulerbd." 1. Aufl., 2. [Dr.] - 1987. Stuttgart Klett GB 3000 I U59 B2 GB 3000 I U59 B2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1503497003 284591332X 1981 3-476-50152-3 Textteil Textteil "Wir lesen alles ; Textteil" 2. neub. Ausg. Druckschriftausgabe Stuttgart Metzler GB 3000 I W798 (2) GB 3000 I W798 (2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1503497259 2845913885 1981 3-476-50152-3 Arbeitsteil Arbeitsteil "Wir lesen alles ; Arbeitsteil" Druckschriftausgabe Stuttgart Metzler GB 3000 I W798 A GB 3000 I W798 A Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157234240 2384011073 2000 3-12-250212-7 "Das Zauberalphabet ; Ubungen" 1. Aufl., [Nachdr.] - 2000. "Leipzig; Stuttgart; Düsseldorf" Klett GB 3000 I Z39 A GB 3000 I Z39 A Handbibliothek-HB Deutsch DE-Frei129
|
||||
115631545X 2381542035 1980 3-12-265100-9 5. Schuljahr 5. Schuljahr "Lesebuch. - Süddeutsche Ausgabe, C (Hauptschule) ; 5" 1. Aufl., 10. [Dr.] - 1980. Stuttgart Klett GB 3000 II A521 -5 GB 3000 II A521 -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157020852 238343583X 1976 3-12-017200-6 "Lesebuch ; 6" 1. Aufl., 5. [Druck]. Stuttgart Klett GB 3000 II B889 -6 GB 3000 II B889 -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157020925 2383435953 1979 "3-12-017300-2; 3-12-017310-X" "Lesebuch ; 7" 1. Aufl., 8. [Druck]. Stuttgart Klett GB 3000 II B889 -7 GB 3000 II B889 -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157021018 2383436143 1981 "3-12-017400-9; 3-12-017410-6" "Lesebuch ; 8" 1. Aufl., 10. [Druck]. Stuttgart Klett GB 3000 II B889 -8 GB 3000 II B889 -8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
115702081X 354916145X 1977 3-12-017130-1 "Lesebuch ; 5, Lehrerheft" 1. Aufl., 7. [Dr.]. Stuttgart Klett GB 3000 II B889 L -5 GB 3000 II B889 L -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1123025851 2284630634 1977 3-12-017230-8 "Lesebuch ; 6, Lehrerheft" 1. Aufl., 6. [Dr.]. Stuttgart Klett GB 3000 II B889 L -6 GB 3000 II B889 L -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157020976 2383436062 1974 3-12-017330-4 "Lesebuch ; 7, Lehrerheft" 1. Aufl., 4. [Druck]. Stuttgart Klett GB 3000 II B889 L -7 GB 3000 II B889 L -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157021034 2383436178 1973 3-12-017430-0 "Lesebuch ; 8, Lehrerheft" 1. Aufl., 3. [Druck]. Stuttgart Klett GB 3000 II B889 L -8 GB 3000 II B889 L -8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157021115 238343633X 1978 3-12-017530-7 "Lesebuch ; 9/10, Lehrerheft" 1. Aufl., 4. [Druck]. Stuttgart Klett GB 3000 II B889 L -9/10 GB 3000 II B889 L -9/10 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1503257274 2845136714 1974 3-572-01007-1 Hrsg. von Malte Dahrendorf ... Hrsg. von Malte Dahrendorf ... "Drucksachen ; 7, [Hauptbd.]" [1. Aulf.] Stuttgart Metzler GB 3000 II D794 -7 GB 3000 II D794 -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157043291 2383490520 1974 3-572-01028-4 Erarb. von Ursula Beul .. Erarb. von Ursula Beul .. "Drucksachen ; 8, [Hauptbd.]" [1. Aufl.], 2. [Dr.] - 1974.. Stuttgart Metzler GB 3000 II D794 -8 GB 3000 II D794 -8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157043321 2383490571 1974 3-572-01029-2 Erarb. von Uwe Duske .. Erarb. von Uwe Duske .. "Drucksachen ; 9, [Hauptbd.]" [1. Aufl.], 2. [Dr.] - 1974.. Stuttgart Metzler GB 3000 II D794 -9 GB 3000 II D794 -9 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157043232 2383490458 1974 3-572-02027-1 "Drucksachen ; 7, Lehrerhandbuch" [1. Aufl.], 2. [Dr.] - 1974. Stuttgart Metzler GB 3000 II D794 L -7 GB 3000 II D794 L -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1109190069 2230960814 1992 3-12-347600-6 "Europäische Nachbarn ; [Hauptbd.]" 1. Aufl., 2. [Dr.] - 1992. "Stuttgart; Leipzig" Klett Schulbuchverl. GB 3000 II E89 GB 3000 II E89 Handbibliothek-HB Deutsch "DE-14; DE-Frei129"
|
||||
1157108938 2383664839 1975 3-12-347000-8 Oberstufe Lyrik Oberstufe Lyrik "Lesebuch ; 11" 1. Aufl., [Nachdr.] - 1975. Stuttgart Klett GB 3000 II F828 -11 GB 3000 II F828 -11 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157108725 2383664405 1977 3-12-346300-1 10. Schuljahr, Lehrerheft 10. Schuljahr, Lehrerheft "Lesebuch ; 10" 1. Aufl., 7. [Dr.]. Stuttgart Klett GB 3000 II F828 L -10 GB 3000 II F828 L -10 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157088864 2383615234 1972 5. Schuljahr, Lehrerheft 5. Schuljahr, Lehrerheft "Lesebuch ; 5" 1. Aufl., 6. [Dr.]. Stuttgart Klett GB 3000 II F828 L -5 GB 3000 II F828 L -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157089062 2383616036 1972 3-12-342300-X 6. Schuljahr, Lehrerheft 6. Schuljahr, Lehrerheft "Lesebuch ; 6" 1. Aufl., 6. Dr. Stuttgart Klett GB 3000 II F828 L -6 GB 3000 II F828 L -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157089097 2383616184 1975 3-12-342300-X 6. Schuljahr, Lehrerheft 6. Schuljahr, Lehrerheft "Lesebuch ; 6" 1. Aufl., 8. Dr. Stuttgart Klett GB 3000 II F828 L -6(N) GB 3000 II F828 L -6(N) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1121289932 2278537164 1971 3-12-343300-5 7. Schuljahr, Lehrerheft 7. Schuljahr, Lehrerheft "Lesebuch ; 7" 1. Aufl., 5. [Dr.]. Stuttgart Klett GB 3000 II F828 L -7 GB 3000 II F828 L -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157089178 2383616443 1975 3-12-343300-5 7. Schuljahr, Lehrerheft 7. Schuljahr, Lehrerheft "Lesebuch ; 7" 1. Aufl., 7. [Dr.]. Stuttgart Klett GB 3000 II F828 L -7(N) GB 3000 II F828 L -7(N) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157089313 2383616834 1977 3-12-344300-0 8. Schuljahr, Lehrerheft 8. Schuljahr, Lehrerheft "Lesebuch ; 8" 1. Aufl., [8. Dr.]. Stuttgart Klett GB 3000 II F828 L -8 GB 3000 II F828 L -8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1156760399 2382751800 1986 3-12-301520-3 Arbeitsvorschläge für Schüler Arbeitsvorschläge für Schüler "Lesezeichen ; Grundausgabe und C für Hauptschulen, Gesamtschulen ; 5" 1. Aufl., 2. Dr. Stuttgart Klett GB 3000 II L686 A -5 GB 3000 II L686 A -5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1156760488 2382751924 1986 3-12-301620-X Arbeitsvorschläge für Schüler Arbeitsvorschläge für Schüler "Lesezeichen ; Grundausgabe und C für Hauptschulen, Gesamtschulen ; 6" 1. Aufl., 2. Dr. Stuttgart Klett GB 3000 II L686 A -6 GB 3000 II L686 A -6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157134831 238372730X 1988 3-12-305720-8 "Lesezeichen ; Für Realschulen und Gymnasien in Baden-Württemberg ; 7" Arbeitsvorschläge zum Lesebuch - 1. Auflage, [Nachdr.] - 1988. Stuttgart Klett GB 3000 II L686 A1 -7 GB 3000 II L686 A1 -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157154093 2383773182 1990 3-12-304030-5 Lesebuch, Lehrerband Lesebuch, Lehrerband "Lesezeichen ; Für Gymnasien und Realschulen ; 10" 1. Aufl., [Nachdr.] Stuttgart Klett GB 3000 II L686 L -10 GB 3000 II L686 L -10 Handbibliothek-HB Deutsch "DE-15; DE-Frei129"
|
||||
1157461891 2384667440 1988 3-12-303830-0 "Lesezeichen ; Für Realschulen und Gymnasien in Baden-Württemberg ; 8" Lehrerband - 1. Auflage, [Nachdr.] - 1988. Stuttgart Klett GB 3000 II L686 L -8 GB 3000 II L686 L -8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
115715235X 2383769738 1990 3-12-303930-7 "Lesezeichen ; Für Realschulen und Gymnasien in Baden-Württemberg ; 9" Lehrerband - 1. Auflage, [Nachdr.] - 1990. Stuttgart Klett GB 3000 II L686 L -9 GB 3000 II L686 L -9 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1151786640 2621898661 1997 3-12-308620-8 "Unterwegs. - Ausgabe BW ; 6, [Hauptbd.]" 2. Aufl., [Nachdr.] - 1997. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GB 3000 II U61 -6(2) GB 3000 II U61 -6(2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1132618819 2316992870 1997 "3-12-308800-6; 3-12-308810-3; 3-12-308810-3" "Unterwegs ; 8, [Hauptbd.]" 2. Aufl., Rechtschreibreform, [Nachdr.] "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GB 3000 II U61 -8(2) GB 3000 II U61 -8(2) Handbibliothek-HB Deutsch "DE-15; DE-Frei129"
|
||||
1151787590 2368991034 1998 3-12-308730-1 "Unterwegs ; 7, Lehrerh." 1. Aufl., [Nachdr.],[Rechtschreibreform]. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GB 3000 II U61 L -7 GB 3000 II U61 L -7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1156317797 2381547649 1981 "3-12-268400-4; 3-12-268410-1" 1. Aufl., 2. Dr 1. Aufl., 2. Dr "Lesestücke ; 8, [Hauptbd.]" Stuttgart Klett GB 3000 L628 -8 GB 3000 L628 -8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
115631786X 2381547835 1982 "3-12-269400-X; 3-12-269410-7" 1. Aufl., 3. Dr 1. Aufl., 3. Dr "Lesestücke ; 9, [Hauptbd.]" Stuttgart Klett GB 3000 L628 -9 GB 3000 L628 -9 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1156317770 2381547568 1982 3-12-267490-4 Literarische, didaktische und methodische Analysen Literarische, didaktische und methodische Analysen "Lesestücke ; 7, Lehrerband" 1. Aufl., 2. [Dr.] - 1982. Stuttgart Klett GB 3000 L628 L -7/1 GB 3000 L628 L -7/1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159261148 2389747108 1994 3-12-261520-7 "Allein, verlassen, verloren ; Buch" 1. Aufl., 6. [Dr.]. - 1994. Stuttgart Klett GB 3002 A423 GB 3002 A423 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615409394 3191937307 1994 3-12-261780-3 'Am Anfang müssen Geigen sein' 'Am Anfang müssen Geigen sein' : sieben Geschichten zum Thema 'erste Liebe' 1. Aufl., 5. [Dr.] Stuttgart [u.a.] Klett-Schulbuchverl. GB 3002 A478 GB 3002 A478 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158703406 2388173973 1994 3-12-261390-5 "Jede Minute haut einer ab ; [Hauptbd.]" 1. Aufl., [Nachdr.] - 1994. Stuttgart Klett GB 3002 A544 GB 3002 A544 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615258167 3190611467 1994 3-12-261680-7 'Zeiger des Schicksals' 'Zeiger des Schicksals' : 14 Kurzgeschichten 1. Aufl., 6. [Dr.] Stuttgart Klett GB 3002 B858 GB 3002 B858 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159319944 2389916651 1995 3-12-261120-1 "Texte zum Thema Mensch und Tier ; [Hauptbd.]" 1. Aufl., 7. Dr. Stuttgart Klett GB 3002 B981 GB 3002 B981 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159320748 2389919731 1993 3-12-260810-3 "Für Kinder verboten ; [Hauptbd.]" 1. Aufl., 6. [Dr.] - 1993. Stuttgart Klett GB 3002 D235 GB 3002 D235 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614978689 318813987X 1994 3-12-261670-X "Holmås, Stig *1946-* ; ID: gnd/138742464" Donnersohn Donnersohn : mit Materialien 1. Aufl., [Nachdr.] Stuttgart Klett GB 3002 D686 GB 3002 D686 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615329668 3191208577 1992 3-12-261460-X Es lebe der Sport ...?! Es lebe der Sport ...?! : Texte zu einem beliebten Thema 1. Aufl., 3. [Dr.] Stuttgart [u.a.] Klett GB 3002 E85 GB 3002 E85 Handbibliothek-HB Deutsch DE-Frei129
|
||||
269540830 3191982108 1993 3-12-351780-2 Romantik, Lyrik Romantik, Lyrik : mit Materialien 1. Aufl., 4. Dr. Stuttgart [u.a.] Klett Schulbuchverl. GB 3002 E94 GB 3002 E94 Handbibliothek-HB Deutsch "DE-547; DE-Frei129"
|
||||
184661455 3191986960 1994 3-12-351570-2 Alltagslyrik und Neue Subjektivität Alltagslyrik und Neue Subjektivität : mit Materialien 1. Aufl., 3. Dr. Stuttgart [u.a.] Klett Schulbuchverl. GB 3002 E94 A4 GB 3002 E94 A4 Handbibliothek-HB Deutsch "DE-547; DE-23; DE-89; DE-Luen4; DE-Va1; DE-Fl3; DE-Frei129"
|
||||
04388217X 3301462642 1993 3-12-351410-2 Fabel und Parabel Fabel und Parabel : mit Materialien 1. Aufl. Stuttgart Klett GB 3002 F114 GB 3002 F114 Handbibliothek-HB Deutsch "DE-8; DE-Frei129"
|
||||
1607164841 3126801803 1994 3-12-261660-2 Festhalten - abspringen Festhalten - abspringen : Originalbeiträge zum Thema Erwachsenwerden 1. Aufl., 4. [Dr.] Stuttgart [u.a.] Klett GB 3002 F418 GB 3002 F418 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1112831789 2245995066 1986 3-12-232010-X "Gedichte für bayerische Schulen ; 1/4" 1. Aufl., 2. [Dr.]. "Stuttgart; Leipzig" Klett-Schulbuchverl. GB 3002 G296 -1/4 GB 3002 G296 -1/4 Handbibliothek-HB Deutsch "DE-14; DE-Frei129"
|
||||
1615321799 3191148477 1995 3-12-261070-1 55 gewöhnliche und ungewöhnliche, auf jeden Fall aber kurze und Kürzestgeschichten 55 gewöhnliche und ungewöhnliche, auf jeden Fall aber kurze und Kürzestgeschichten 1. Aufl., 5. Dr. Stuttgart Klett Schulbuchverl. GB 3002 G828 GB 3002 G828 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614892040 3187409350 1984 3-12-351790-X Klassik "Klassik : Lyrik; mit Materialien" 1. Auflage Stuttgart Ernst Klett Verlag GB 3002 G878 GB 3002 G878 Handbibliothek-HB Deutsch "DE-15; DE-Frei129"
|
||||
231906781 3191185984 1994 3-12-261810-9 Geschwistergeschichten Geschwistergeschichten : [6/7] 1. Aufl., 3. [Dr.] Stuttgart [u.a.] Klett-Schulbuchverl GB 3002 G886 G3 GB 3002 G886 G3 Handbibliothek-HB Deutsch "DE-Fl3; DE-Frei129"
|
||||
1615409904 3191942548 1995 3-12-261410-3 Liebt mich - liebt mich nicht "Liebt mich - liebt mich nicht : moderne Liebesgeschichten aus aller Welt; mit Materialien" 1. Aufl., 7. [Dr.] Stuttgart Klett GB 3002 G886 L7 GB 3002 G886 L7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159321108 2389920608 1995 3-12-260370-5 Die Falle Die Falle "Wildwestgeschichten ; [1, Hauptbd.]" 1. Aufl., 15 . [Dr.] - 1995. Stuttgart Klett GB 3002 G984 GB 3002 G984 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159396345 2390131131 1991 3-12-261510-X "Heiser auf der Seele? ; [Hauptbd.]" 1. Aufl., [Nachdr.] - 1991. Stuttgart Klett GB 3002 H473 GB 3002 H473 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615325166 3191173544 1991 3-12-261770-6 Hiroshima, Tschernobyl und ... Hiroshima, Tschernobyl und ... : Wissenschaft in der Verantwortung 1. Aufl., 3. [Dr.] Stuttgart Klett-Schulbuchverl. GB 3002 H552 GB 3002 H552 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615321519 3191145869 1992 3-12-261050-7 Witz, Schwank, Lügengeschichte' Witz, Schwank, Lügengeschichte' 1. Aufl., 4. [Dr.] Stuttgart Klett GB 3002 H764 GB 3002 H764 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615254692 3190575797 1995 3-12-261270-4 Irrfahrt im Labyrinth Irrfahrt im Labyrinth : griechische Sagen 1. Aufl., 8. [Dr.] Stuttgart Klett GB 3002 I71 GB 3002 I71 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1618148141 3213944564 1992 3-12-261330-1 "Jandl, Ernst *1925-2000* ; ID: gnd/118556894" Fünf Mann Menschen "Fünf Mann Menschen : Hörspiel; mit Materialien als kreatives Angebot" 1. Aufl., 3. Dr. Stuttgart Klett GB 3002 J33 GB 3002 J33 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159257779 2389735851 1995 3-12-260840-5 "Der Kampf um den Südpol ; [Hauptbd.]" 1. Aufl., 11. Dr. Stuttgart Klett GB 3002 K15 GB 3002 K15 Handbibliothek-HB Deutsch DE-Frei129
|
||||
231913664 3191171185 1994 3-12-261870-2 Kinder anderswo Kinder anderswo : Texte zum Thema 'Kinderalltag in der Dritten Welt' 1. Aufl., 2. [Dr.] "Stuttgart; Leipzig [u.a.]" Klett GB 3002 K51 GB 3002 K51 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615326308 3191182039 1993 3-12-261580-0 Auf der Suche nach Bethlehem Auf der Suche nach Bethlehem : Texte zum Thema Weihnachten 1. Aufl., 4. [Dr.] Stuttgart Klett GB 3002 K79 GB 3002 K79 Handbibliothek-HB Deutsch DE-Frei129
|
||||
316179787 3190577242 1995 3-12-261360-3 Tod des Lichtgottes "Tod des Lichtgottes : germanische Götter- und Heldensagen ; mit Materialien" 1. Aufl., 4. [Dr.] Stuttgart [u.a.] Klett GB 3002 K95 GB 3002 K95 Handbibliothek-HB Deutsch "DE-Ma9; DE-Luen4; DE-Frei129"
|
||||
565053280 3187397115 1994 3-12-261440-5 'Ich will Wolken und Sterne. Jeden Tag.' "'Ich will Wolken und Sterne. Jeden Tag.' : Gedichte der achtziger Jahre ; mit Materialien" 1. Aufl., 3. Dr. Stuttgart [u.a.] Klett-Schulbuchverl. GB 3002 L271 GB 3002 L271 Handbibliothek-HB Deutsch "DE-Luen4; DE-Bs78; DE-Frei129"
|
||||
1615328866 3191201599 1994 3-12-261570-3 Allerlei Gereimtes und Ungereimtes Allerlei Gereimtes und Ungereimtes : Gedichte für Kl. 5 bis 7 1. Aufl., 6. [Dr.] Stuttgart Klett GB 3002 L271 A4 GB 3002 L271 A4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1167765702 2408912237 1995 3-12-261340-9 "Ein völlig klarer Fall und neun andere moderne Jugendkrimis ; [Hauptbd.]" 1. Aufl., [Nachdr.]. Stuttgart Klett GB 3002 L274 GB 3002 L274 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615256601 3190596344 1994 3-12-261150-3 Erwachen im 20. Jahrtausend und andere Science-fiction-Geschichten Erwachen im 20. Jahrtausend und andere Science-fiction-Geschichten : mit Materialien 1. Aufl., 6. [Dr.] Stuttgart Klett GB 3002 L274 GB 3002 L274 Handbibliothek-HB Deutsch DE-Frei129
|
||||
115870318X 238817337X 1995 3-12-261344-1 Klassenstufe 5 - 6 Klassenstufe 5 - 6 "Lesehefte-Lehrerkommentar ; 1,1,3)" 1. Aufl., 3. [Dr.] - 1995. Stuttgart Klett GB 3002 L628 L -5/6 GB 3002 L628 L -5/6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1111708657 2241423289 1994 3-12-261354-9 Klassenstufe 7 - 8 Klassenstufe 7 - 8 "Lesehefte-Lehrerkommentar ; 2" 1. Aufl., 3. [Dr.]. Stuttgart Klett GB 3002 L628 L -7/8 GB 3002 L628 L -7/8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1111708851 2241423807 1994 3-12-261364-6 Klassenstufe 9 - 10 Klassenstufe 9 - 10 "Lesehefte-Lehrerkommentar ; 3" 1. Aufl., 3. [Dr.]. Stuttgart Klett GB 3002 L628 L -9/10 GB 3002 L628 L -9/10 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1111709173 2241424862 1992 3-12-261384-0 Ergänzungsband 1989 Ergänzungsband 1989 "Lesehefte-Lehrerkommentar ; 5" 1. Aufl., 2. Dr. Stuttgart Klett GB 3002 L628 Z -89 GB 3002 L628 Z -89 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159317453 2389907245 1995 3-12-261210-0 "Märchenreise durch Europa ; [Hauptbd.]" 1. Aufl., 6. [Dr.] Stuttgart Klett GB 3002 M185 GB 3002 M185 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615320784 3191139524 1995 3-12-261020-5 Der Papalagi Der Papalagi : e. Südseehäuptling erlebt unsere Zivilisation 1. Aufl., 13. Dr. Stuttgart Klett GB 3002 P213 GB 3002 P213 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159315361 2389901646 1995 3-12-260660-7 $PBuffalo Child Long Lance [Hauptbd.] [Hauptbd.] "Häuptling Büffelkind Langspeer erzählt sein Leben / $PBuffalo Child Long Lance ; (haup,1995)" 1. Aufl., [Nachdr.]. Stuttgart Klett GB 3002 P348 GB 3002 P348 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614891524 3187403549 1994 3-12-351320-3 Barock-Lyrik Barock-Lyrik : mit Materialien 1. Aufl., 4. [ Dr.] Stuttgart Klett GB 3002 R348 GB 3002 R348 Handbibliothek-HB Deutsch DE-Frei129
|
||||
161541357X 3191975586 1992 3-12-351150-2 Experimentelle und konkrete Poesie vom Barock zur Gegenwart Experimentelle und konkrete Poesie vom Barock zur Gegenwart : mit Materialien 1. Aufl., 2. Dr. Stuttgart Klett GB 3002 R348 E9 GB 3002 R348 E9 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615257934 3190610029 1994 3-12-261620-3 Mit Leib und Seele dabei Mit Leib und Seele dabei : Texte zu: Kindheit und Jugend unterm Hakenkreuz 1. Aufl., 4.[Dr.] Stuttgart Klett GB 3002 R845 GB 3002 R845 Handbibliothek-HB Deutsch DE-Frei129
|
||||
161489339X 3187421857 1994 3-12-351880-9 Naturlyrik vom Barock bis zur Gegenwart Naturlyrik vom Barock bis zur Gegenwart : mit Materialien 1. Aufl., 4. [Dr.] Stuttgart Klett GB 3002 S385 GB 3002 S385 Handbibliothek-HB Deutsch "DE-Frei129; DE-59"
|
||||
118975579 3187423965 1993 3-12-352030-7 Liebeslyrik vom Barock bis zur Gegenwart Liebeslyrik vom Barock bis zur Gegenwart : mit Materialien 1. Aufl., [Nachdr.] "Stuttgart; Leipzig [u.a.]" Klett-Schulbuchverl. GB 3002 S385 L7 GB 3002 S385 L7 Handbibliothek-HB Deutsch "DE-Va1; DE-Va1; DE-Frei129"
|
||||
164012361X 3301466796 1995 3-12-261220-8 Siebzehn Kurzgeschichten Siebzehn Kurzgeschichten : mit Materialien 1. Aufl., 16. Dr. Stuttgart Klett Schulbuchverl. GB 3002 S571 GB 3002 S571 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615256482 3190595089 1994 3-12-261640-8 Abenteuergeschichten Abenteuergeschichten 1. Aufl., 6. [Dr.] Stuttgart Klett GB 3002 S818 GB 3002 S818 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615255257 319058267X 1995 3-12-261540-1 Verschlüsselte Wahrheit Verschlüsselte Wahrheit : Fabeln für Sekundarstufe I 1. Aufl., 7. Dr. Stuttgart Klett GB 3002 V561 GB 3002 V561 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615327584 319119195X 1994 3-12-261490-1 Das Krokodil am Marterpfahl Das Krokodil am Marterpfahl : Jugendbuchautoren schreiben für euch 1. Aufl., 7. [Dr.] Stuttgart Klett GB 3002 W412 GB 3002 W412 Handbibliothek-HB Deutsch DE-Frei129
|
||||
231913621 3186160936 1995 3-12-261760-9 Zwischen Trott und Trotz "Zwischen Trott und Trotz : Mädchen- und Frauenliteratur ; [9/10]" 1. Aufl., 4. Dr. Stuttgart [u.a.] Klett, Schulbuchverl. GB 3002 Z98 GB 3002 Z98 Handbibliothek-HB Deutsch "DE-28; DE-Fl3; DE-Frei129"
|
||||
161474419X 3186145066 1994 "3-12-261130-9; 3-12-261132-5" "David, Kurt *1924-1994* ; ID: gnd/124954065" Antennen-August Antennen-August : eine Tiergeschichte 1. Aufl., [Nachdr.] Stuttgart Klett GB 3004 D249 GB 3004 D249 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615176241 3189905711 1993 3-12-261140-6 Edgar Allan Poe, 'Grube und Pendel' Edgar Allan Poe, 'Grube und Pendel' : und andere Erzählungen 1. Aufl., 6. Dr. Stuttgart Klett GB 3004 E23 GB 3004 E23 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614745374 318615863X 1994 3-12-260310-1 Kriminalgeschichten Kriminalgeschichten 1. Aufl., 26. Dr. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GB 3004 K92 GB 3004 K92 Handbibliothek-HB Deutsch DE-Frei129
|
||||
161280053X 3170336533 1992 3-12-261250-X "London, Jack *1876-1916* ; ID: gnd/118574183" Grausame Südsee Grausame Südsee : 5 Erzählungen über Naturgewalt und Barbarei 1. Aufl. Stuttgart Klett GB 3004 L847 G7 GB 3004 L847 G7 Handbibliothek-HB Deutsch "DE-14; DE-Frei129"
|
||||
304099732 3214825836 1990 "3-12-234364-9; 3-12-234360-6" Gedichtete Geschichten Gedichtete Geschichten : Gedichte, die von merkwürdigen Ereignissen erzählen 1. Aufl., [Nachdr.] Stuttgart Klett GB 3004 M716 GB 3004 M716 Handbibliothek-HB Deutsch "DE-14; DE-Frei129"
|
||||
211385425 318614857X 1995 3-12-260650-X "Defoe, Daniel *1660-1731* ; ID: gnd/118524275" Robinson Crusoe Robinson Crusoe : mit Materialien 1. Aufl., [Nachdr.] Stuttgart [u.a.] Klett GB 3004 R658 GB 3004 R658 Handbibliothek-HB Deutsch "DE-Ma9; DE-Frei129"
|
||||
1615180435 3189948593 1994 3-12-261880-X "Spillner, Wolf *1936-2021* ; ID: gnd/120090082" Taube Klara Taube Klara : mit Materialien 1. Aufl., 4. [Dr.] "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GB 3004 S756 GB 3004 S756 Handbibliothek-HB Deutsch DE-Frei129
|
||||
161454638X 3184447219 1993 3-12-306330-5 Der Teufel mit den drei goldenen Haaren Der Teufel mit den drei goldenen Haaren : Schultheaterstück 1. Aufl., 2. [Dr.] Stuttgart [u.a.] Klett Schulbuchverl. GB 3008 E33 GB 3008 E33 Handbibliothek-HB Deutsch "DE-9; DE-Fl3; DE-996; DE-Frei129"
|
||||
1608162311 3134181878 2009 978-3-12-675890-1 Alles drin Alles drin : Praxishandbuch Grundstufe Deutsch 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen GB 3044 A434 GB 3044 A434 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504180; DE-M504157; DE-M504207"
|
||||
1400600014 2649203374 2009 978-3-12-675417-0 "Mit Erfolg zu telc Deutsch B2 Zertifikat Deutsch Plus ; Übungsbuch" 1. Aufl., [Nachdr.] "Barcelona; Stuttgart [u.a.]" Klett Sprachen GB 3044 B111 A GB 3044 B111 A Handbibliothek-HB Deutsch DE-Frei129
|
||||
1396592555 2646500017 2009 978-3-12-675831-4 Bauer-Hutz, Barbara "Mit Erfolg zum Goethe-Zertifikat B2 / Bauer-Hutz, Barbara ; Testbuch" 1. Aufl., [Nachdr.] "Stuttgart; [Leipzig]" Klett GB 3044 B344 GB 3044 B344 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504210; DE-M504196"
|
||||
1400315093 2648609865 2009 978-3-12-675446-0 "Mit Erfolg zum Zertifikat Deutsch für Jugendliche ; Übungs- und Testbuch" 1. Aufl., [Nachdr.] "Barcelona; Stuttgart [u.a.]" Klett Sprachen GB 3044 B583 A GB 3044 B583 A Handbibliothek-HB Deutsch "DE-Frei129; DE-M504205; DE-M504196"
|
||||
1373356006 2646504322 2008 978-3-12-675436-1 "Mit Erfolg zur DSH ; Übungsbuch" 1. Aufl., [Nachdr.] "Barcelona; Stuttgart [u.a.]" Klett Sprachen GB 3044 C111 A GB 3044 C111 A Handbibliothek-HB Deutsch "DE-Ch1; DE-Frei129; DE-M504178"
|
||||
1400301904 2648583343 2009 978-3-12-676121-5 "Das neue Deutschmobil. - Vollst. Neubearb. ; 2, Arbeitsbuch" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen, Ed. Deutsch GB 3044 D383 A -2 GB 3044 D383 A -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1338351516 2646517637 2002 "978-3-12-534446-4; 978-88-8148-823-0; 88-8148-823-X" Grundstufe Grundstufe "Deutsch lernen mit ... Spielen und Rätseln ; 1" "Recanati; [Stuttgart]" "ELI; Klett Sprachen" GB 3044 D626 -1 GB 3044 D626 -1 Handbibliothek-HB Deutsch "DE-14; DE-Frei129"
|
||||
1338345214 2646517971 2004 "978-3-12-534445-7; 88-536-0131-0" Mittelstufe Mittelstufe "Deutsch lernen mit ... Spielen und Rätseln ; 3" "Recanati; [Stuttgart]" "ELI; Klett Sprachen" GB 3044 D626 -3 GB 3044 D626 -3 Handbibliothek-HB Deutsch "DE-14; DE-Frei129"
|
||||
1397939842 2646481683 2009 978-3-12-676330-1 Janke-Papanikolaou, Sylvia Übungs- und Testbuch Übungs- und Testbuch "Mit Erfolg zu Fit in Deutsch / Janke-Papanikolaou, Sylvia ; 1, Übungs- und Testbuch" 1. Aufl., [Nachdr.] Stuttgart Klett GB 3044 E67 A -1 GB 3044 E67 A -1 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504179; DE-M504237; DE-M504150; DE-M504237; DE-M504108"
|
||||
1400312035 2648603212 2009 978-3-12-676331-8 Janke-Papanikolaou, Sylvia Lehrerhandbuch Lehrerhandbuch "Mit Erfolg zu Fit in Deutsch / Janke-Papanikolaou, Sylvia ; 1, Lehrerhandbuch" 1. Aufl., [Nachdr.] Stuttgart Klett GB 3044 E67 L -1 GB 3044 E67 L -1 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504135; DE-M504251"
|
||||
1384400737 2646482922 2009 978-3-12-676335-6 Janke-Papanikolaou, Sylvia Lehrerhandbuch Lehrerhandbuch "Mit Erfolg zu Fit in Deutsch / Janke-Papanikolaou, Sylvia ; 2, Lehrerhandbuch" 1. Aufl., [Nachdr.] Stuttgart Klett GB 3044 E67 L -2 GB 3044 E67 L -2 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504178; DE-M504179; DE-M504196"
|
||||
135832090X 2646625375 2007 "978-3-12-675580-1; 3-12-675580-1; 978-963-9194-51-9; 963-9194-51-4" Kursbuch Kursbuch "Deutsch mit Grips ; 1, Kursbuch" 1. Aufl., [Nachdr.] "Barcelona; Stuttgart [u.a.]" Klett Sprachen GB 3044 G868 -1 GB 3044 G868 -1 Handbibliothek-HB Deutsch "DE-15; DE-Frei129; DE-M504156; DE-M504237; DE-M504237"
|
||||
1358321159 2646627122 2008 "978-3-12-675586-3; 978-963-9194-63-2" Kursbuch Kursbuch "Deutsch mit Grips ; 2, Kursbuch" 1. Aufl., [Nachdr.] "Barcelona; Stuttgart [u.a.]" Klett Sprachen GB 3044 G868 -2 GB 3044 G868 -2 Handbibliothek-HB Deutsch "DE-15; DE-Frei129; DE-M504141"
|
||||
1358322562 264662753X 2008 978-3-12-675588-7 Arbeitsbuch Arbeitsbuch : [sicherer Ausdruck und guter Stil] "Deutsch mit Grips ; 2, Arbeitsbuch" 1. Aufl., [Nachdr.] "Barcelona; Stuttgart" Klett Sprachen, Ed. Deutsch GB 3044 G868 A -2 GB 3044 G868 A -2 Handbibliothek-HB Deutsch "DE-14; DE-15; DE-Frei129; DE-M504205"
|
||||
1382814909 2646503237 2009 978-3-12-675835-2 Hantschel, Hans-Jürgen "Mit Erfolg zum Goethe-Zertifikat C1 ; Testbuch" 1. Aufl., [Nachdr.] Stuttgart Klett GB 3044 H251 GB 3044 H251 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504160; DE-M504196"
|
||||
1152357832 2621900887 1989 3-12-675031-1 Lateinische Ausgangsschrift Lateinische Ausgangsschrift "Mina und Otto ; Schreiblehrgang ; Stufe 1" 1. Aufl., 2. [Dr.] - 1990. "München; [Stuttgart]" Klett Ed. Deutsch GB 3044 M663 Z -1 GB 3044 M663 Z -1 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504174"
|
||||
1400186617 2648348794 2009 "3-12-676150-X; 978-3-12-676150-5" "Mit uns leben. - Neu[bearb.] ; 1, Kursbuch" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen, Ed. Deutsch GB 3044 M679 -1 GB 3044 M679 -1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1400189810 2648354336 2009 3-12-676155-0 "Mit uns leben. - Neu[bearb.] ; 2, Kursbuch" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen, Ed. Deutsch GB 3044 M679 -2 GB 3044 M679 -2 Handbibliothek-HB Deutsch "DE-Ch1; DE-Frei129"
|
||||
1400188636 2648351906 2009 3-12-676151-8 "Mit uns leben. - Neu[bearb.] ; 1, Arbeitsbuch" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen, Ed. Deutsch GB 3044 M679 A -1 GB 3044 M679 A -1 Handbibliothek-HB Deutsch "DE-Ch1; DE-Frei129"
|
||||
1400140943 2648250565 2009 978-3-12-675807-9 Kurs- und Übungsbuch [A1] Kurs- und Übungsbuch [A1] "Passwort Deutsch ; 1, Kurs- und Übungsbuch" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen GB 3044 P111 -1 GB 3044 P111 -1 Handbibliothek-HB Deutsch "DE-Ch1; DE-Frei129; DE-M504210; DE-M504233"
|
||||
1400142539 2648253416 2009 978-3-12-675827-7 Kurs- und Übungsbuch [A1 + A2] Kurs- und Übungsbuch [A1 + A2] "Passwort Deutsch ; 2, Kurs- und Übungsbuch" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen GB 3044 P111 -1/2 GB 3044 P111 -1/2 Handbibliothek-HB Deutsch "DE-Ch1; DE-Frei129; DE-M504210; DE-M504177; DE-M504216; DE-M504224"
|
||||
1400149096 2648265597 2009 978-3-12-675847-5 Kurs- und Übungsbuch [A2] Kurs- und Übungsbuch [A2] "Passwort Deutsch ; 3, Kurs- und Übungsbuch" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen GB 3044 P111 -2 GB 3044 P111 -2 Handbibliothek-HB Deutsch "DE-Ch1; DE-Frei129; DE-M504210; DE-M504216; DE-M504224"
|
||||
1400150159 2648267719 2009 978-3-12-675867-3 Kurs- und Übungsbuch [A2 + B1] Kurs- und Übungsbuch [A2 + B1] "Passwort Deutsch ; 4, Kurs- und Übungsbuch" 1. Aufl., [Nachdr. ] Stuttgart Klett Sprachen GB 3044 P111 -2/3 GB 3044 P111 -2/3 Handbibliothek-HB Deutsch "DE-Ch1; DE-Frei129; DE-M504205; DE-M504224"
|
||||
1400149657 2648266747 2009 978-3-12-675887-1 Kurs- und Übungsbuch [B1] Kurs- und Übungsbuch [B1] "Passwort Deutsch ; 5, Kurs- und Übungsbuch" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen GB 3044 P111 -3 GB 3044 P111 -3 Handbibliothek-HB Deutsch "DE-Ch1; DE-Frei129; DE-M504207; DE-M504216"
|
||||
1400144019 2648256083 2009 978-3-12-675925-0 "Passwort Deutsch ; 2, Kursbuch" 1. Aufl., [Nachdr.] Stuttgart Klett International GB 3044 P289 -2 GB 3044 P289 -2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1400147891 2648263284 2009 978-3-12-675935-9 Kursbuch Kursbuch "Passwort Deutsch ; 3, Kursbuch" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen GB 3044 P289 -3 GB 3044 P289 -3 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504177"
|
||||
139352656X 2648258264 2009 "3-12-675921-1; 978-3-12-675921-2" Übungsbuch Übungsbuch "Passwort Deutsch ; 2, Übungsbuch" 1. Aufl. Stuttgart Klett Sprachen GB 3044 P289 A -2 GB 3044 P289 A -2 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504177"
|
||||
1400148596 2648264744 2009 978-3-12-675931-1 Übungsbuch Übungsbuch "Passwort Deutsch ; 3, Übungsbuch" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen GB 3044 P289 A -3 GB 3044 P289 A -3 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504177"
|
||||
1122215606 2281786773 1996 3-12-675016-8 "Sichtwechsel neu / Bachmann, Saskia ; 2, Unterrichtsbegleiter" 1. Aufl. "München; Stuttgart; Leipzig" Klett, Ed. Deutsch GB 3044 S565 L -2 GB 3044 S565 L -2 Handbibliothek-HB Deutsch "DE-15; DE-Frei129; DE-M504136"
|
||||
117193159X 2419583825 2000 3-12-675018-4 Kommunikative Absicht und sprachliche Realisierung & Manipulation durch Sprache Kommunikative Absicht und sprachliche Realisierung & Manipulation durch Sprache "Sichtwechsel neu / Bachmann, Saskia ; 3, Unterrichtsbegleiter" 1. Aufl., [Nachdr.] - 2000. "München; Stuttgart; Leipzig" Klett, Ed. Deutsch GB 3044 S565 L -3(N) GB 3044 S565 L -3(N) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1619822520 3227881276 2009 "978-3-12-768790-3; 3-12-768790-7" 88 Unterrichtsrezepte Deutsch als Fremdsprache 88 Unterrichtsrezepte Deutsch als Fremdsprache : eine Sammlung interaktiver Übungsideen [Nachdr.] "Stuttgart; Düsseldorf; Leipzig" Klett GB 3044 S618 GB 3044 S618 Handbibliothek-HB Deutsch "DE-291-306; DE-Frei129; DE-M504108; DE-M504202; DE-M504233; DE-M504215; DE-M504254"
|
||||
1386213691 2646514565 2009 978-3-12-675394-4 "Mit Erfolg zu Start Deutsch ; Testbuch" 1. Aufl. [Nachdr.] Stuttgart Ernst-Klett-Sprachen GB 3044 S796 GB 3044 S796 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504160; DE-M504156; DE-M504131; DE-M504176; DE-M504147"
|
||||
1400597188 2649196718 2009 978-3-12-675395-1 "Mit Erfolg zu Start Deutsch ; Übungsbuch" 1. Aufl., [Nachdr.] Stuttgart Ernst-Klett-Sprachen GB 3044 S796 A GB 3044 S796 A Handbibliothek-HB Deutsch "DE-Frei129; DE-M504160; DE-M504150; DE-M504131; DE-M504147"
|
||||
1382121873 2649195304 2008 978-3-12-675397-5 "Mit Erfolg zu Start Deutsch ; Prüfungsvorbereitung" 1. Aufl. Stuttgart Ernst-Klett-Sprachen GB 3044 S796 Z GB 3044 S796 Z Handbibliothek-HB Deutsch "DE-291-306; DE-Frei129; DE-M504256; DE-M504141; DE-M504157; DE-M504114; DE-M504128; DE-M504131; DE-M504182; DE-M504199; DE-M504237; DE-M504124; DE-M504203; DE-M504136; DE-M504176; DE-M504181; DE-M504249; DE-M504373; DE-M504243"
|
||||
1400135915 2648241221 2008 3-12-675285-3 "Stufen international ; 2, Lehr- und Arbeitsbuch" 1. Aufl., [Nachdr.] "Stuttgart; Leipzig" Klett Edition Deutsch GB 3044 S929 -2 (N) GB 3044 S929 -2 (N) Handbibliothek-HB Deutsch DE-Frei129
|
||||
117137609X 241823908X 2002 3-12-675290-X "Stufen international ; 3, Lehr- u. Arbeitsbuch" 1. Aufl., [Nachdr.]. "Stuttgart; Leipzig" Klett Edition Deutsch GB 3044 S929 -3 (N) GB 3044 S929 -3 (N) Handbibliothek-HB Deutsch "DE-Frei129; DE-Mit1"
|
||||
1172094756 2419980093 1999 3-12-675291-8 "Stufen international ; 3, Handbuch fur den Unterricht" 1. Aufl., [Nachdr.]. "Stuttgart; Leipzig" Klett Edition Deutsch GB 3044 S929 L -3 GB 3044 S929 L -3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
116718145X 2407679261 2001 3-12-675276-4 Vokabeln im Kontext Vokabeln im Kontext "Stufen international ; 3, Worterheft" 1. Aufl., [Nachdr.]. "Stuttgart; Leipzig" Klett Edition Deutsch GB 3044 S929 Z -3 GB 3044 S929 Z -3 Handbibliothek-HB Deutsch "DE-Frei129; DE-Zi4"
|
||||
1385245840 264650943X 2008 978-3-12-675371-5 "Mit Erfolg zum Zertifikat Deutsch ; Übungsbuch, Buch" 1. Aufl., 10. Druck Stuttgart Klett International, Edition Deutsch GB 3044 Z58 GB 3044 Z58 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1385258985 264920057X 2009 978-3-12-675373-9 "Mit Erfolg zum Zertifikat Deutsch ; Testbuch, Buch" 1. Aufl., 10. Druck Stuttgart Klett International, Edition Deutsch GB 3044 Z58 Z GB 3044 Z58 Z Handbibliothek-HB Deutsch "DE-Frei129; DE-M504157; DE-M504131; DE-M504178; DE-Sa18"
|
||||
1372713875 264658993X 2006 "3-12-554728-8; 978-3-12-554728-5" "Auf in den Zirkus! ; Lehrerband" 1. Aufl., [Nachdr.] "Stuttgart; Düsseldorf; Leipzig" Klett GB 3044 Z81 L GB 3044 Z81 L Handbibliothek-HB Deutsch "DE-15; DE-Frei129; DE-M504177; DE-M504138; DE-M504181"
|
||||
1608132579 3133917668 2009 978-3-12-675322-7 Klipp und klar "Klipp und klar : Übungsgrammatik Grundstufe Deutsch in 99 Schritten; [mit Lösungen]" 1. Aufl., [Nachdr.] Stuttgart Klett GB 3046 K65 GB 3046 K65 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1400293146 264856604X 2009 "978-3-12-675305-0; 978-960-409-526-1" [Niveaustufe A1 und A2] [Niveaustufe A1 und A2] "Perfekt in Deutsch ; [Schülerbd.]" 1. Aufl., [Nachdr.] "Barcelona; Stuttgart [u.a.]" Klett GB 3046 P438 GB 3046 P438 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504169; DE-M504166; DE-M504181; DE-M504112"
|
||||
1608162575 3134184567 2009 "3-12-675318-3; 978-3-12-675318-0" Brand, Linda M. Die Schöne ist angekommen Die Schöne ist angekommen : ein Grammatikkrimi 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen GB 3046 S365 GB 3046 S365 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504157; DE-M504160; DE-M504177; DE-M504210; DE-M504214; DE-M504216; DE-M504181"
|
||||
1601544855 3077198614 2009 978-3-12-558201-9 "Ferenbach, Magda *1915-* ; ID: gnd/116496878" Wörter zur Wahl Wörter zur Wahl : Wortschatzübungen Deutsch als Fremdsprache Neubearb., 1. Aufl. Stuttgart Klett GB 3048 F349 GB 3048 F349 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504160; DE-M504373; DE-L189"
|
||||
138904176X 2646592914 2009 978-3-12-675740-9 "Unternehmen Deutsch - Grundkurs ; Lehrbuch" 1. Aufl. Stuttgart Klett Sprachen GB 3054 B395 GB 3054 B395 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504136; DE-M504178; DE-M504205; DE-M504148"
|
||||
1389042340 2646593392 2009 "3-12-675741-3; 978-3-12-675741-6" "Unternehmen Deutsch - Grundkurs ; Arbeitsbuch" 1. Aufl. Stuttgart Klett Sprachen GB 3054 B395 A GB 3054 B395 A Handbibliothek-HB Deutsch "DE-15; DE-Frei129; DE-M504136; DE-M504151; DE-M504202"
|
||||
1400657679 2649341572 2009 3-12-675742-1 "Unternehmen Deutsch - Grundkurs ; Lehrerhandbuch" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen GB 3054 B395 L GB 3054 B395 L Handbibliothek-HB Deutsch "DE-Frei129; DE-M504136; DE-M504148"
|
||||
1400658063 2649342188 2009 "978-3-12-675738-6; 3-12-675738-3" "Unternehmen Deutsch - Grundkurs ; Wörterheft" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen GB 3054 B395 Z GB 3054 B395 Z Handbibliothek-HB Deutsch "DE-Frei129; DE-M504178; DE-M504148"
|
||||
1400715458 2649469846 2009 978-3-12-675743-0 "Unternehmen Deutsch - Aufbaukurs ; Wörterheft" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen GB 3054 B825 Z GB 3054 B825 Z Handbibliothek-HB Deutsch DE-Frei129
|
||||
109874229X 2186798123 1987 3-89179-031-7 Mittelstufe Mittelstufe "Deutsch - Sprachbereich Industrie ; (M,3)" 3., überarb. u. aktualisierte Aufl. Stuttgart Klett-Verl. für Wirtschafts- u. Bildungsservice GB 3054 E69 -2(3) GB 3054 E69 -2(3) Handbibliothek-HB Deutsch "DE-Frei129; DE-105; DE-L189"
|
||||
115483431X 2377511279 1973 3-12-342600-9 "Presse - Sprache ; [Textheft]" 1. Aufl., 2. [Dr.] - 1973.. Stuttgart Klett GD 8980 O12 GD 8980 O12 Handbibliothek-HB Deutsch DE-Frei129
|
||||
507143353 3180761202 1995 3-12-347490-9 Epochen der deutschen Literatur Epochen der deutschen Literatur : Gesamtausgabe Gesamtausg., 1. Aufl., 5. [Dr.] Stuttgart [u.a.] Klett GE 4001 B254 GE 4001 B254 Handbibliothek-HB Deutsch "DE-46; DE-Frei129; DE-D115"
|
||||
1610368606 315122718X 1993 3-12-347490-9 Epochen der deutschen Literatur Epochen der deutschen Literatur Gesamtausg., 1. Aufl., 4. [Dr.] Stuttgart Klett GE 4001 B254 GE 4001 B254 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1610492897 3151877338 1984 3-7193-0605-4 Villiger, Hermann Deutsche Literatur "Deutsche Literatur : Fuer Gymnasien und den Selbstunterricht; Von den Anfaengen bis zur Gegenwart" 4., durchgesehene und erweiterte Auflage Stuttgart Huber GE 4001 V757 (4) GE 4001 V757 (4) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1610411307 3151420915 1994 3-12-347400-3 "Wucherpfennig, Wolf *1942-* ; ID: gnd/12416045X" Geschichte der deutschen Literatur Geschichte der deutschen Literatur : von d. Anfängen bis zur Gegenwart 2. Aufl., 11. Dr. Stuttgart Klett GE 4001 W959 (2) GE 4001 W959 (2) Handbibliothek-HB Deutsch "DE-15; DE-Frei129"
|
||||
1614975116 3188107366 1995 3-12-260980-0 "Heyst, Ilse$cvan *1913-* ; ID: gnd/105812218" Alles für Karagöz Alles für Karagöz 1. Aufl., [Nachdr.] Stuttgart [u.a.] Klett GE 6918 H621 GE 6918 H621 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615174400 3189885087 1995 3-12-261190-2 "Noack, Hans-Georg *1926-2005* ; ID: gnd/118511165" Trip Trip : mit Materialien zur Drogenproblematik Gekürzte Schulausg., 1. Aufl., 11. [Dr.] Stuttgart Klett GE 6918 N739 T8 GE 6918 N739 T8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
505068478 3189900698 1995 3-12-261690-4 "Nöstlinger, Christine *1936-2018* ; ID: gnd/118811738" Das Austauschkind Das Austauschkind : mit Materialien 1. Aufl., 12. [Dr.] Stuttgart Klett GE 6918 N771 GE 6918 N771 Handbibliothek-HB Deutsch "DE-18; DE-547; DE-Frei129"
|
||||
1614745315 318615829X 1994 3-12-261610-6 "Donnelly, Elfie *1955-* ; ID: gnd/118746340" Tine durch zwei geht nicht Tine durch zwei geht nicht 1. Aufl., 6. Dr. "Stuttgart; Leipzig [u.a.]" Klett, Schulbuchverl. GE 6919 D685 GE 6919 D685 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1610413016 3151428347 2006 3-473-36026-0 "Scheffler, Ursel *1938-* ; ID: gnd/115511512" Ätze, das Tintenmonster Ätze, das Tintenmonster 3. Aufl [Ravensburg] Ravensburger Buchverl. GE 6919 S317 A2 (3) GE 6919 S317 A2 (3) Handbibliothek-HB Deutsch DE-Frei129
|
||||
359735304 3240882191 2001 3-522-17072-5 "Wölfel, Ursula *1922-2014* ; ID: gnd/11932119X" Das Lachkind und 99 andere ausgewählte Geschichten Das Lachkind und 99 andere ausgewählte Geschichten [6. Aufl.] "Stuttgart; Wien; Bern" Thienemann GE 6919 W842 L1 GE 6919 W842 L1 Handbibliothek-HB Deutsch "DE-Va1; DE-Frei129"
|
||||
115925608X 2389732097 1992 3-12-261630-0 "Wolf, Stefan *1938-2007* ; ID: gnd/122796373" Der doppelte Pedro Der doppelte Pedro : (TKKG) 1. Aufl., 2. [Dr.] Stuttgart Klett GE 6919 W855 GE 6919 W855 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615128220 3189477957 1993 3-12-352200-8 "Lessing, Gotthold Ephraim *1729-1781* ; ID: gnd/118572121" Minna von Barnhelm "Minna von Barnhelm : e. Lustspiel in 5 Aufzügen, verfertigt im Jahre 1763; mit Materialien" 1. Aufl., 5. Dr. "Stuttgart; Leipzig" Klett GI 6101 M665 GI 6101 M665 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615128360 3189479011 1995 3-12-351160-X "Lessing, Gotthold Ephraim *1729-1781* ; ID: gnd/118572121" Nathan der Weise "Nathan der Weise : ein dramatisches Gedicht in 5 Aufzügen; mit Materialien" 1. Aufl., 13. Dr. Stuttgart Klett GI 6101 N274 GI 6101 N274 Handbibliothek-HB Deutsch DE-Frei129
|
||||
165618183 3189916225 1994 3-12-351940-6 "Lessing, Gotthold Ephraim *1729-1781* ; ID: gnd/118572121" Gotthold Ephraim Lessing Gotthold Ephraim Lessing : Leben und Werk 1. Aufl., 3. [Dr.] Stuttgart [u.a.] Klett Schulbuchverl. GI 6103 B254 GI 6103 B254 Handbibliothek-HB Deutsch "DE-Luen4; DE-Frei129"
|
||||
1615128522 3189480079 1995 3-12-352100-1 "Lessing, Gotthold Ephraim *1729-1781* ; ID: gnd/118572121" Emilia Galotti Emilia Galotti : mit Materialien 1. Aufl., 13. Dr. Stuttgart Klett GI 6103 E53 GI 6103 E53 Handbibliothek-HB Deutsch DE-Frei129
|
||||
152656006 3184406423 1994 3-12-927485-5 "Große, Wilhelm *1948-* ; ID: gnd/120959860" Stundenblätter Lessings 'Nathan' und die Literatur der Aufklärung Stundenblätter Lessings 'Nathan' und die Literatur der Aufklärung 5. Aufl. "Stuttgart; Dresden" Klett-Verl. für Wissen und Bildung GI 6103 G878 (5) GI 6103 G878 (5) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615410414 319194785X 1992 3-12-351280-0 Klassik "Klassik : Kunst- u. Dichtungstheorien; mit Materialien" 1. Aufl., 4. [Dr.] Stuttgart Klett GK 2280 G878 GK 2280 G878 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1640148108 3301518664 1994 3-12-353800-1 "Eichendorff, Joseph$cvon *1788-1857* ; ID: gnd/118529390" Aus dem Leben eines Taugenichts Aus dem Leben eines Taugenichts : mit Materialien 1. Aufl., 9. Dr. Stuttgart Klett GK 3353 A932 GK 3353 A932 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614896275 3187447937 1993 3-12-351330-0 "Goethe, Johann Wolfgang$cvon *1749-1832* ; ID: gnd/118540238" Egmont "Egmont : eim Trauerspiel in 5 Aufzügen; mit Materialien" 1. Aufl., [Nachdr.] Stuttgart Klett GK 3831 E31 GK 3831 E31 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614895821 3187443141 1995 3-12-351230-4 "Goethe, Johann Wolfgang$cvon *1749-1832* ; ID: gnd/118540238" Faust, der Tragödie erster Teil Faust, der Tragödie erster Teil : mit Materialien 1. Aufl., 14. Dr. Stuttgart [u.a.] Klett GK 3831 F267 GK 3831 F267 Handbibliothek-HB Deutsch DE-Frei129
|
||||
316484199 3157396749 1991 3-12-351250-9 "Goethe, Johann Wolfgang$cvon *1749-1832* ; ID: gnd/118540238" Geschichte Gottfriedens von Berlichingen mit der eisernen Hand dramatisirt Geschichte Gottfriedens von Berlichingen mit der eisernen Hand dramatisirt : mit Materialien 1. Aufl., 3. Dr. "Stuttgart; Leipzig [u.a.]" Klett Schulbuchverl. GK 3831 G389 GK 3831 G389 Handbibliothek-HB Deutsch "DE-Luen4; DE-14; DE-Frei129"
|
||||
267377541 3187445020 1993 3-12-352800-6 "Goethe, Johann Wolfgang$cvon *1749-1832* ; ID: gnd/118540238" Iphigenie auf Tauris "Iphigenie auf Tauris : ein Schauspiel ; mit Materialien" 1. Aufl., [Nachdr.] Stuttgart [u.a.] Klett-Schulbuchverl. GK 3831 I64 GK 3831 I64 Handbibliothek-HB Deutsch "DE-3; DE-Frei129"
|
||||
1614895570 3187440959 1994 3-12-351420-X "Goethe, Johann Wolfgang$cvon *1749-1832* ; ID: gnd/118540238" Urfaust "Urfaust : Faust in ursprünglicher Gestalt; mit Materialien" 1. Aufl., [Nachdr.] Stuttgart Klett GK 3831 U75 GK 3831 U75 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614893845 3187425976 1995 3-12-351900-7 "Goethe, Johann Wolfgang$cvon *1749-1832* ; ID: gnd/118540238" Die Leiden des jungen Werther Die Leiden des jungen Werther : mit Materialien 1. Aufl., 14. [Dr.] Stuttgart Klett GK 3891 L527 M4 GK 3891 L527 M4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1640175431 330157663X 1995 3-12-260760-3 "Goethe, Johann Wolfgang$cvon *1749-1832* ; ID: gnd/118540238" Götz von Berlichingen Götz von Berlichingen : mit Materialien 1. Aufl., 12. Dr. Stuttgart [u.a.] Klett GK 4611 G611 GK 4611 G611 Handbibliothek-HB Deutsch "DE-Frei129; DE-M504248"
|
||||
1614671311 3185506421 1992 3-12-399140-7 "Sack, Volker *1938-* ; ID: gnd/1145514391" Gegenbilder "Gegenbilder : Johann Wolfgang von Goethe: Iphigenie auf Tauris; Friedrich Hebbel: Maria Magdalene" 1. Aufl., [Nachdr.] Stuttgart Klett GK 4611 S121 GK 4611 S121 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614897549 3187459013 1995 3-12-261950-4 "Hauff, Wilhelm *1802-1827* ; ID: gnd/118546864" Das kalte Herz Das kalte Herz 1. Aufl., 2. [Dr.] "Stuttgart; Dresden" Klett GK 4856 K14 GK 4856 K14 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158918615 2388791812 1994 3-12-261590-8 "Hauff, Wilhelm *1802-1827* ; ID: gnd/118546864" "Die Karawane / Hauff, Wilhelm *1802-1827* ; ID: gnd/118546864 ; Buch" Gek. Schulausg., 1. Aufl., 4. Dr. Stuttgart Klett GK 4856 K18 GK 4856 K18 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614965226 318803234X 1995 3-12-261310-7 "Hauff, Wilhelm *1802-1827* ; ID: gnd/118546864" Das Wirtshaus im Spessart Das Wirtshaus im Spessart : mit Materialien 1. Aufl., [Nachdr.] Stuttgart Klett GK 4856 W799 GK 4856 W799 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614977046 3188127510 1995 3-12-262020-0 "Hoffmann, E. T. A. *1776-1822* ; ID: gnd/118552465" Das Fräulein von Scuderi Das Fräulein von Scuderi 1. Aufl., [Nachdr.] "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GK 4942 F799 GK 4942 F799 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159040281 238914473X 1994 3-12-261850-8 "Kleist, Heinrich$cvon *1777-1811* ; ID: gnd/118563076" Das Erdbeben in Chili Das Erdbeben in Chili : mit Materialien 1. Aufl., 3. [Dr.] "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GK 5162 E66 GK 5162 E66 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615046038 3188743084 1993 3-12-351500-1 "Kleist, Heinrich$cvon *1777-1811* ; ID: gnd/118563076" Michael Kohlhaas "Michael Kohlhaas : (aus e. alten Chronik); mit Materialien" 1. Aufl., 9. Dr. Stuttgart Klett GK 5162 M621 GK 5162 M621 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615044590 3188729111 1994 3-12-351390-4 "Kleist, Heinrich$cvon *1777-1811* ; ID: gnd/118563076" Der zerbrochne Krug "Der zerbrochne Krug : e. Lustspiel; mit Materialien" 1. Aufl., 8. Dr. "Stuttgart; Leipzig" Klett GK 5162 Z58 GK 5162 Z58 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1627634800 3270835620 1993 3-12-352010-2 Heinrich von Kleist Heinrich von Kleist : Leben und Werk 1. Aufl., 2. [Dr.] "Stuttgart; Leipzig [u.a.]" Klett GK 5164 B424 GK 5164 B424 Handbibliothek-HB Deutsch "DE-Luen4; DE-Frei129"
|
||||
1615126619 3189465118 1993 3-12-354600-4 "Lenz, Jakob Michael Reinhold *1751-1792* ; ID: gnd/118571656" Der Hofmeister oder Vorteile der Privaterziehung "Der Hofmeister oder Vorteile der Privaterziehung : e. Komödie; mit Materialien" 1. Aufl., 5. Dr. "Stuttgart; Leipzig" Klett GK 5312 H713 GK 5312 H713 Handbibliothek-HB Deutsch DE-Frei129
|
||||
161517849X 3189929254 1995 3-12-352600-3 "Schiller, Friedrich *1759-1805* ; ID: gnd/118607626" Don Carlos, Infant von Spanien "Don Carlos, Infant von Spanien : ein dramatisches Gedicht; mit Materialien" 1. Aufl., 9. Dr. Stuttgart Klett GK 8361 D674 GK 8361 D674 Handbibliothek-HB Deutsch DE-Frei129
|
||||
161517785X 318992239X 1995 3-12-352400-0 "Schiller, Friedrich *1759-1805* ; ID: gnd/118607626" Die Raeuber Die Raeuber : Ein Schauspiel. Mit Materialien. 1. Aufl., 11. [Dr.] Stuttgart Klett GK 8361 R135 S3 GK 8361 R135 S3 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1640146555 3301515231 1994 3-12-351980-5 "Schiller, Friedrich *1759-1805* ; ID: gnd/118607626" Wallenstein "Wallenstein : ein dramatisches Gedicht; mit Materialien" 1. Aufl., 4. Dr. Stuttgart Klett GK 8361 W197 GK 8361 W197 Handbibliothek-HB Deutsch DE-Frei129
|
||||
160779134X 3131563192 1992 3-12-261380-8 "Schiller, Friedrich *1759-1805* ; ID: gnd/118607626" Wilhelm Tell Wilhelm Tell : mit Materialien 1. Aufl. Stuttgart [[u.a.] Ernst Klett Schulbuchverlag GK 8361 W678 GK 8361 W678 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159182981 238952527X 1992 3-12-351770-5 "Schiller, Friedrich *1759-1805* ; ID: gnd/118607626" 'Der Verbrecher aus verlorener Ehre' 'Der Verbrecher aus verlorener Ehre' : mit Materialien 1. Aufl., 3. [Dr.] Stuttgart [u.a.] Klett GK 8401 S334 GK 8401 S334 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1640127895 3301476635 1992 3-12-351200-2 "Büchner, Georg *1813-1837* ; ID: gnd/118516906" Dantons Tod "Dantons Tod : ein Drama; mit Materialien" 1. Aufl., 6. Dr. Stuttgart [u.a.] Klett GL 3030 D194 GL 3030 D194 Handbibliothek-HB Deutsch "DE-9; DE-Frei129"
|
||||
1614675139 3185541502 1994 3-12-352700-X Georg Büchner: 'Lenz' und Oberlins Aufzeichnungen "Georg Büchner: 'Lenz' und Oberlins Aufzeichnungen : in Gegenüberstellung; mit Materialien" 1. Aufl., 5. Dr. Stuttgart Klett GL 3030 W374 GL 3030 W374 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614675082 3185541235 1994 3-12-351340-8 "Büchner, Georg *1813-1837* ; ID: gnd/118516906" Leonce und Lena "Leonce und Lena : ein Lustspiel; mit Materialien" 1. Aufl., [Nachdr.] Stuttgart Klett GL 3032 L582 GL 3032 L582 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1640146857 3301515878 1995 3-12-351600-8 "Büchner, Georg *1813-1837* ; ID: gnd/118516906" Woyzeck "Woyzeck : Lese- u. Bühnenfassung; mit Materialien" 1. Aufl., [13. Dr.] Stuttgart Klett GL 3032 W938 GL 3032 W938 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614745471 3186159369 1995 3-12-351800-0 "Droste-Hülshoff, Annette$cvon *1797-1848* ; ID: gnd/118527533" Die Judenbuche "Die Judenbuche : e. Sittengemälde aus d. gebirgichten Westfalen; mit Materialien" 1. Aufl., 9. Dr. Stuttgart Klett GL 3486 J92 GL 3486 J92 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614745501 3186159504 1995 3-12-262010-3 "Droste-Hülshoff, Annette$cvon *1797-1848* ; ID: gnd/118527533" Die Judenbuche Die Judenbuche : ein Sittengemälde aus dem gebirgigten Westfalen 1. Aufl., 2. [Dr.] "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GL 3486 J92 S6 GL 3486 J92 S6 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614888442 3187376576 1995 3-12-351810-8 "Fontane, Theodor *1819-1898* ; ID: gnd/118534262" Effi Briest Effi Briest : mit Materialien 1. Aufl., 10. Dr. Stuttgart Klett GL 3828 E27 M4 GL 3828 E27 M4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
161479040X 3186552893 1995 3-12-351120-0 "Fontane, Theodor *1819-1898* ; ID: gnd/118534262" Frau Jenny Treibel Frau Jenny Treibel : mit Materialien 1. Aufl., 8. Dr. Stuttgart Klett GL 3828 F845 GL 3828 F845 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614888051 3187373186 1995 3-12-351730-6 "Fontane, Theodor *1819-1898* ; ID: gnd/118534262" Irrungen, Wirrungen Irrungen, Wirrungen : mit Materialien 1. Aufl., 7. Dr. Stuttgart Klett GL 3828 I71 M4 GL 3828 I71 M4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
30753412X 3186555191 1995 3-12-351740-3 "Fontane, Theodor *1819-1898* ; ID: gnd/118534262" Mathilde Möhring Mathilde Möhring : mit Materialien 1. Aufl., [Nachdr.] Stuttgart [u.a.] Klett GL 3828 M431 GL 3828 M431 Handbibliothek-HB Deutsch "DE-7; DE-Luen4; DE-Frei129"
|
||||
1614896399 3187448801 1995 3-12-260220-2 "Gotthelf, Jeremias *1797-1854* ; ID: gnd/118540963" Die schwarze Spinne Die schwarze Spinne 2. Aufl., [Nachdr.] Stuttgart Klett GL 4616 S411 (2) GL 4616 S411 (2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1640150404 3301523692 1994 3-12-353900-8 "Hebbel, Friedrich *1813-1863* ; ID: gnd/118547445" Maria Magdalene "Maria Magdalene : e. bürgerl. Trauerspiel in 3 Acten; mit Materialien" 1. Aufl., 6. Dr. Stuttgart Klett GL 5302 M332 GL 5302 M332 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614973377 3188093691 1994 3-12-351920-1 "Heine, Heinrich *1797-1856* ; ID: gnd/118548018" Deutschland - ein Wintermärchen "Deutschland - ein Wintermärchen : geschrieben im Januar 1844; mit Materialien" 1. Aufl., [Nachdr.] Stuttgart Klett GL 5416 D486 W7 GL 5416 D486 W7 Handbibliothek-HB Deutsch DE-Frei129
|
||||
31622345X 3188758812 1993 3-12-261890-7 "Krausnick, Michail *1943-2019* ; ID: gnd/118715771" Die eiserne Lerche "Die eiserne Lerche : Georg Herwegh, Dichter und Rebell ; mit Materialien" 1. Aufl., 2. Dr. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GL 5503 E36 GL 5503 E36 Handbibliothek-HB Deutsch "DE-Luen4; DE-Ch1; DE-Frei129"
|
||||
1614979014 3188143974 1995 3-12-354100-2 "Keller, Gottfried *1819-1890* ; ID: gnd/11856109X" Romeo und Julia auf dem Dorfe Romeo und Julia auf dem Dorfe : mit Materialien 1. Aufl., 11. Dr. Stuttgart Klett GL 5865 H149 GL 5865 H149 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614978921 3188142552 1995 3-12-261830-3 "Keller, Gottfried *1819-1890* ; ID: gnd/11856109X" Kleider machen Leute Kleider machen Leute 1. Aufl., 7. [Dr.] Stuttgart [u.a.] Klett-Schulbuchverl. GL 5865 K29 GL 5865 K29 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615177132 3189916446 1991 3-12-351470-6 "Raabe, Wilhelm *1831-1910* ; ID: gnd/118597442" Stopfkuchen "Stopfkuchen : eine See- und Mordgeschichte; mit Materialien" 1. Aufl., 2. [Dr.] Stuttgart Klett GL 7565 S883 GL 7565 S883 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1640158324 3301541658 1995 3-12-260640-2 "Storm, Theodor *1817-1888* ; ID: gnd/118618725" Der Schimmelreiter Der Schimmelreiter 1. Aufl., 16. Dr. Stuttgart Klett GL 9460 F159 GL 9460 F159 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158824831 2388505704 1994 3-12-260850-2 "Feuerbach, Paul Johann Anselm$lRitter von *1775-1833* ; ID: gnd/118532766" "Kaspar Hauser oder Beispiel eines Verbrechens am Seelenleben eines Menschen / Feuerbach, Paul Johann Anselm$lRitter von *1775-1833* ; ID: gnd/118532766 ; [Hauptbd.]" 1. Aufl., [Nachdr.]. Stuttgart Klett GL 9951 F423 GL 9951 F423 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614675163 3185541642 1990 3-12-358600-6 Materialien Bertolt Brecht, 'Mutter Courage und ihre Kinder' Materialien Bertolt Brecht, 'Mutter Courage und ihre Kinder' 1. Aufl., 2. Dr. Stuttgart Klett GM 2660 N311 GM 2660 N311 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614969248 3188061498 1994 3-12-351360-2 "Hauptmann, Gerhart *1862-1946* ; ID: gnd/118546937" Der Biberpelz "Der Biberpelz : eine Diebskomödie; mit Materialien" 1. Aufl., 5. Dr. "Stuttgart; Leipzig [u.a.]" Klett GM 3583 B581 GM 3583 B581 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614969396 3188062907 1995 3-12-261860-5 "Hauptmann, Gerhart *1862-1946* ; ID: gnd/118546937" Der Biberpelz Der Biberpelz : eine Diebskomödie 1. Aufl., 4. [Dr.] Stuttgart [u.a.] Klett GM 3583 B581 D5 GM 3583 B581 D5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614968810 3188058322 1995 3-12-351370-X "Hauptmann, Gerhart *1862-1946* ; ID: gnd/118546937" Die Ratten "Die Ratten : Berliner Tragikomödie; mit Materialien" 1. Aufl., [Nachdr.] Stuttgart [u.a.] Klett GM 3583 R237 GM 3583 R237 Handbibliothek-HB Deutsch "DE-291-306; DE-Frei129"
|
||||
1614971471 3188077602 1993 3-12-355700-6 Hermann Hesse, 'Unterm Rad' Hermann Hesse, 'Unterm Rad' 1. Aufl., 5. [Dr.] "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GM 3670 G562 GM 3670 G562 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158985150 2388980666 1994 3-12-351260-6 "Hofmannsthal, Hugo$cvon *1874-1929* ; ID: gnd/118552759" Ein Brief Ein Brief 1. Aufl., [Nachdr.] Stuttgart Klett GM 3773 B853 GM 3773 B853 Handbibliothek-HB Deutsch DE-Frei129
|
||||
212449621 3188142471 1993 3-12-351970-8 "Beicken, Peter *1943-* ; ID: gnd/124272460" Franz Kafka, Leben und Werk Franz Kafka, Leben und Werk 1. Aufl., 4. [Dr.] Stuttgart [u.a.] Klett Schulbuchverl. GM 4004 B422 L4 GM 4004 B422 L4 Handbibliothek-HB Deutsch "DE-700; DE-Frei129"
|
||||
1615041745 3188702043 1995 3-12-351380-7 "Keun, Irmgard *1905-1982* ; ID: gnd/118722123" Nach Mitternacht "Nach Mitternacht : Roman; mit Materialien" 1. Aufl., [Nachdr.] Stuttgart Klett GM 4138 N119 GM 4138 N119 Handbibliothek-HB Deutsch DE-Frei129
|
||||
316251305 3189509999 1993 3-12-356800-8 Materialien Heinrich Mann 'Professor Unrat' Materialien Heinrich Mann 'Professor Unrat' 1. Aufl., [Nachdr.] Stuttgart [u.a.] Klett GM 4755 P964 G5 GM 4755 P964 G5 Handbibliothek-HB Deutsch "DE-Luen4; DE-Frei129"
|
||||
316251577 3189509379 1995 3-12-355400-7 Materialien Heinrich Mann 'Der Untertan' Materialien Heinrich Mann 'Der Untertan' 1 Aufl., [Nachdr.] Stuttgart [u.a.] Klett GM 4755 U61 GM 4755 U61 Handbibliothek-HB Deutsch "DE-Luen4; DE-Frei129"
|
||||
1627963030 3272212418 1994 3-12-922309-6 "Hermes, Beate *1960-* ; ID: gnd/115512608" Lektürehilfen Thomas Mann, 'Tonio Kröger' Lektürehilfen Thomas Mann, 'Tonio Kröger' 4. Aufl. "Stuttgart; Dresden" Klett GM 4782 H553 L5 (4) GM 4782 H553 L5 (4) Handbibliothek-HB Deutsch "DE-Fl3; DE-15; DE-Frei129"
|
||||
1159184763 2389530125 1994 3-12-260880-4 "Traven, B. *1882-1969* ; ID: gnd/118623672" "Der Schatz der Sierra Madre / Traven, B. *1882-1969* ; ID: gnd/118623672. - Gek. Schulfassung ; [Hauptbd.]" 1. Aufl., 8. Dr. Stuttgart Klett GM 6280 S312 GM 6280 S312 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615252223 3190556237 1994 3-12-260420-5 "Wassermann, Jakob *1873-1934* ; ID: gnd/118629387" Das Gold von Caxamalca Das Gold von Caxamalca : mit Materialien. 1. Aufl., 16. [Dr.] Stuttgart Klett GM 6676 G618 GM 6676 G618 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615250581 3190542279 1995 3-12-358720-7 Materialien Frank Wedekind, 'Frühlings Erwachen' Materialien Frank Wedekind, 'Frühlings Erwachen' 1. Aufl., 4. Dr. Stuttgart Klett GM 6728 F944 GM 6728 F944 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614674949 3480913490 1994 3-12-261010-8 "Bayer, Ingeborg *1927-2017* ; ID: gnd/115444092" Yamba Yamba 1. Aufl., 6. Dr. Stuttgart Klett GM 7651 B357 Y1 GM 7651 B357 Y1 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158825161 2388506786 1995 3-12-261230-5 Feustel, Günther "Ein Indio darf den Tag nicht verschlafen / Feustel, Günther *1924-2011* ; ID: gnd/118686976 ; [Hauptbd.]" 1. Aufl., [Nachdr.] - 1995. "Stuttgart; Leipzig" Klett GM 7651 F426 GM 7651 F426 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1606423932 3120312703 1994 3-12-261820-6 "Lornsen, Boy *1922-1995* ; ID: gnd/118574442" Feuer im Nacken Feuer im Nacken 1. Aufl., 4. [Dr.] "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett Schulbuchverl. GM 7651 L875 GM 7651 L875 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159184615 2389529763 1993 3-12-260820-0 "Tetzner, Lisa *1894-1963* ; ID: gnd/118756540" Der Fussball Der Fussball "Der Fußball / Tetzner, Lisa *1894-1963* ; ID: gnd/118756540 ; [Hauptbd.]" 1. Aufl, 6. [Dr.] Stuttgart Klett GM 7651 T349 GM 7651 T349 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615180982 3189953910 1994 3-12-260970-3 "Tetzner, Lisa *1894-1963* ; ID: gnd/118756540" War Paul schuldig? War Paul schuldig? : Kindheit und Jugend im Dritten Reich 1. Aufl., 9. Dr. Stuttgart Klett GM 7651 T349 W2 GM 7651 T349 W2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
164236052X 3306307076 1994 3-12-352040-4 Kurzprosa der Gegenwart "Kurzprosa der Gegenwart : Bundesrepublik Deutschland, Österreich, Schweiz; mit Materialien" 1. Aufl., 4. [Dr.] Stuttgart Klett GN 2366 S294 GN 2366 S294 Handbibliothek-HB Deutsch DE-Frei129
|
||||
115870349X 2388174201 1995 3-12-260570-8 "Böll, Heinrich *1917-1985* ; ID: gnd/118512676" "Im Tal der donnernden Hufe / Böll, Heinrich *1917-1985* ; ID: gnd/118512676 ; [Hauptbd.]" 1. Aufl., [Nachdr.]. Stuttgart Klett GN 3280 I31 GN 3280 I31 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614675031 3185540948 1995 3-12-355800-2 Materialien Wolfgang Borchert 'Draußen vor der Tür' Materialien Wolfgang Borchert 'Draußen vor der Tür' 1. Aufl., [Nachdr.] Stuttgart Klett GN 3654 G878 M4 GN 3654 G878 M4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615408916 3191931953 1995 3-12-353700-5 "Drewitz, Ingeborg *1923-1986* ; ID: gnd/11852741X" Gestern war heute "Gestern war heute : 100 Jahre Gegenwart; mit Materialien" 1. Aufl., 3. Dr. Stuttgart Klett GN 4140 G393 GN 4140 G393 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614673829 3185528506 1993 3-12-399250-0 "Schänzlin, Gertrud ; ID: gnd/1187845213" Lebensversuche von Frauen "Lebensversuche von Frauen : Ingeborg Drewitz: Oktoberlicht oder ein Tag im Herbst; Theodor Fontane: Mathilde Möhring; Marlen Haushofer: Die Wand" 1. Aufl., [Nachdr.] Stuttgart Klett GN 4141 S294 GN 4141 S294 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614672288 3185513894 1989 3-12-399060-5 "Schänzlin, Gertrud ; ID: gnd/1187845213" Frauenbilder Frauenbilder : Ingeborg Drewitz: Gestern war heute, Theodor Fontane: Effi Briest, Barbara Frischmuth: Erzählungen, Heinrich Mann: Eugénie 1. Aufl., [Nachdr.] Stuttgart Klett GN 4141 S294 F8 GN 4141 S294 F8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614745536 3186159822 1993 3-12-358100-4 Friedrich Dürrenmatt, Der Besuch der alten Dame Friedrich Dürrenmatt, Der Besuch der alten Dame 1. Aufl., [Nachdr.] Stuttgart Klett GN 4172 A755 B5 GN 4172 A755 B5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614745595 3186160650 1994 3-12-356100-3 Materialien Friedrich Dürrenmatt 'Die Physiker' Materialien Friedrich Dürrenmatt 'Die Physiker' 1. Aufl., 7. [Dr.] Stuttgart Klett GN 4172 A755 P5 GN 4172 A755 P5 Handbibliothek-HB Deutsch DE-Frei129
|
||||
316402672 3185527089 1995 3-12-399150-4 "Bekes, Peter *1946-* ; ID: gnd/136015069" Außenseiter "Außenseiter : Max Frisch: Andorra ; Gotthold Ephraim Lessing: Nathan der Weise" 1. Aufl. - [Nachdr.] Stuttgart Klett GN 4602 B424 GN 4602 B424 Handbibliothek-HB Deutsch "DE-Luen4; DE-Frei129"
|
||||
1614889120 3187382452 1993 3-12-355100-8 Materialien Max Frisch 'Andorra' Materialien Max Frisch 'Andorra' 1. Aufl., [Nachdr.] Stuttgart [u.a.] Klett GN 4602 H553 M4 GN 4602 H553 M4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614889309 3187384463 1995 3-12-357800-3 Materialien Max Frisch 'Homo faber' Materialien Max Frisch 'Homo faber' 1. Aufl., 6. Dr. "Stuttgart; Leipzig [u.a.]" Klett Schulbuchverl. GN 4602 J95 GN 4602 J95 Handbibliothek-HB Deutsch DE-Frei129
|
||||
316507628 3187391796 1992 3-12-351460-9 "Frischmuth, Barbara *1941-2025* ; ID: gnd/118693727" Jahre Jahre : mit Materialien 1. Aufl., 3. [Dr.] Stuttgart [u.a.] Klett-Schulbuchverl. GN 4621 J25 GN 4621 J25 Handbibliothek-HB Deutsch "DE-Luen4; DE-Frei129"
|
||||
228110521 3301541224 1992 3-12-356700-1 Materialien Günter Grass, 'Die Blechtrommel', 'Katz und Maus' Materialien Günter Grass, 'Die Blechtrommel', 'Katz und Maus' 1. Aufl., 3. [Dr.] Stuttgart [u.a.] Klett GN 5052 B896 GN 5052 B896 Handbibliothek-HB Deutsch "DE-27; DE-Frei129"
|
||||
1615126953 3189469180 1995 3-12-260240-7 "Lenz, Siegfried *1926-2014* ; ID: gnd/118571680" Das Feuerschiff Das Feuerschiff 2. Aufl., 67. Dr. Stuttgart Klett GN 7719 F423 (2) GN 7719 F423 (2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615127909 3189476225 1992 3-12-260260-1 "Lenz, Siegfried *1926-2014* ; ID: gnd/118571680" Lukas, sanftmütiger Knecht Lukas, sanftmütiger Knecht 2. Aufl., 58. [Dr.] Stuttgart Klett GN 7719 L954 (2) GN 7719 L954 (2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
22760637X 3189517274 1991 3-12-351930-9 "Müller, Heiner *1929-1995* ; ID: gnd/118584944" Der Lohndrücker Der Lohndrücker 1. Aufl., [Nachdr.] Stuttgart Klett GN 7881 T877 GN 7881 T877 Handbibliothek-HB Deutsch "DE-547; DE-547; DE-7; DE-Fl3; DE-Frei129; DE-Mar1"
|
||||
316242411 3189903069 1995 3-12-356500-9 Materialien Ulrich Plenzdorf 'Die neuen Leiden des jungen W.' Materialien Ulrich Plenzdorf 'Die neuen Leiden des jungen W.' 1.Aufl., [Nachdr.] "Stuttgart; Leipzig" Klett Schulbuchverl. GN 8028 W855 GN 8028 W855 Handbibliothek-HB Deutsch "DE-Luen4; DE-Frei129"
|
||||
119146119X 2461022224 1994 3-12-260770-0 "Scharang, Michael *1941-* ; ID: gnd/118841769" "Der Beruf des Vaters / Scharang, Michael *1941-* ; ID: gnd/118841769 ; Buch" 1. Aufl., [Nachdr.] - 1994. Stuttgart Klett GN 8865 B552 GN 8865 B552 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1159183317 2389525946 1992 3-12-261350-6 "Schnurre, Wolfdietrich *1920-1989* ; ID: gnd/118609831" "Ein Fall für Herrn Schmidt / Schnurre, Wolfdietrich *1920-1989* ; ID: gnd/118609831 ; Buch" 1. Aufl., 3. [Dr.] - 1992. Stuttgart Klett GN 9135 F194 GN 9135 F194 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615251049 3190548196 1993 3-12-260250-4 "Weyrauch, Wolfgang *1904-1980* ; ID: gnd/118632078" Die japanischen Fischer Die japanischen Fischer 2. Aufl., 59. [Dr.] Stuttgart Klett GN 9871 J35 (2) GN 9871 J35 (2) Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614743932 3186142911 1993 3-12-260590-2 "Cotton, Jerry ; ID: gnd/1056019786" Du lebst zu lange, G-man! Du lebst zu lange, G-man! : Ein Heftroman der Spannungsliteratur. Mit Materialien. 1. Aufl., 7. [Dr.] "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. GN 9999 C851 GN 9999 C851 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1158778465 2388383153 1995 3-12-261320-4 "No future? ; [Schulerh.]" 1. Aufl., [Nachdr.] - 1995. "Stuttgart; Leipzig" Klett Schulbuchverl. GN 9999 D317 GN 9999 D317 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614969825 3188066287 1994 3-12-351960-0 "Haushofer, Marlen *1920-1970* ; ID: gnd/118811134" Die Wand "Die Wand : Roman; mit Materialien" 1. Aufl., 6. [Dr.] Stuttgart Klett GN 9999 H376 GN 9999 H376 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1615044183 3188726597 1994 3-12-260990-8 "Kleberger, Ilse *1921-2012* ; ID: gnd/115886737" Jannis der Schwammtaucher Jannis der Schwammtaucher 1. Aufl., 11. Dr. Stuttgart Klett GN 9999 K63 J3 GN 9999 K63 J3 Handbibliothek-HB Deutsch "DE-15; DE-Frei129"
|
||||
1173311068 2422988180 1994 3-12-260630-5 Nagel, Herbert C. "Der Weg nach Norden / Nagel, Herbert C. ; [Hauptbd.]" [Nachdr.]. Stuttgart Klett GN 9999 N147 GN 9999 N147 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1614745137 3186156122 1995 3-12-261480-4 "Dickens, Charles *1812-1870* ; ID: gnd/118525239" Oliver Twist Oliver Twist : Text u. Materialien Gekürzte Schulausg., 1. Aufl., [Nachdr.] Stuttgart Klett HL 2584 O48 HL 2584 O48 Handbibliothek-HB Deutsch DE-Frei129
|
||||
316224111 3188712537 1995 3-12-261290-9 "Kipling, Rudyard *1865-1936* ; ID: gnd/118562290" Aus den Dschungel-büchern Aus den Dschungel-büchern : Auswahl 1. Aufl., 6. Dr. Stuttgart [u.a.] Klett HL 3424 A932 HL 3424 A932 Handbibliothek-HB Deutsch "DE-Luen4; DE-Frei129"
|
||||
1615040978 3188694288 1995 3-12-260710-7 "Kerr, Judith *1923-2019* ; ID: gnd/118950517" Als Hitler das rosa Kaninchen stahl Als Hitler das rosa Kaninchen stahl Gek. Schulausg., 1. Aufl., 17. Dr. Stuttgart Klett HN 9990 K41 A4 HN 9990 K41 A4 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1135103410 2573085864 1968 Für das 2. Schuljahr Für das 2. Schuljahr "Unsere neue Welt ; 2, [Schulerbd., 1968]" Süddt. Ausg., 1. Aufl., 2. Dr. Stuttgart Klett MA 07/848 MA 07/848 Handbibliothek-HB Deutsch "DE-15; DE-Frei129"
|
||||
1165311690 2375408594 1974 "3-12-232100-9; 3-12-232400-8; 3-12-232210-2; 3-12-232110-6" "Unsere neue Fibel. - grundlegende Neubearb. ; [Hauptbd.]" 1. Aufl., [Nachdr.]. Stuttgart Klett MA 12/516 MA 12/516 Handbibliothek-HB Deutsch "DE-14; DE-Frei129"
|
||||
1640130748 3301482414 1994 3-12-351170-7 Das Volksbuch von Doktor Faust "Das Volksbuch von Doktor Faust : 1587; mit Materialien" 1. Aufl., 4. Dr. Stuttgart Klett MA 17/519 MA 17/519 Handbibliothek-HB Deutsch "DE-14; DE-Frei129"
|
||||
1155545931 2573109550 1978 3-12-364500-2 Übungsheft Rechtschreibung und Zeichensetzung Übungsheft Rechtschreibung und Zeichensetzung "Sprachbuch. - [Ausg.] C ; 8/9" 1. Aufl. Stuttgart Klett MB 07/179 MB 07/179 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1163426393 2398226158 1998 3-12-211429-1 1. Aufl., 2. Dr 1. Aufl., 2. Dr "Sprachfuchs - II. - Baden-Württemberg ; Lehrerband ; 4, Lehrerbd." "Stuttgart; Leipzig" Klett MB 19/43 MB 19/43 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1157390676 238445109X 1978 3-12-323500-9 Übungsheft Rechtschreibung und Zeichensetzung Übungsheft Rechtschreibung und Zeichensetzung "Sprachbuch. - A/B-Ausg. ; 7,Uebh." 1. Aufl., [Nachdr.] - 1978. Stuttgart Klett Deu O 250: 11 U,7/2 SDMDeu O 250: 11 U,7/2 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1139586866 2621865097 1978 3-12-324400-8 Übungsheft Grammatik und Zeichensetzung Übungsheft Grammatik und Zeichensetzung "Sprachbuch. - A/B-Ausg. ; 8,Ubungsh.." 1. Aufl., [Nachdr.] - 1978. Stuttgart Klett Deu O 250: 11 U,8 SDMDeu O 250: 11 U,8 Handbibliothek-HB Deutsch DE-Frei129
|
||||
1420099353 2689302594 2008 "Wizadora ; [Themenheft]" 5. Aufl. Baden-Baden SWR HD 220 W835 (5) HD 220 W835 (5) Handbibliothek-HB Englisch DE-Frei129
|
||||
30352832X 3106832568 1999 3-12-576131-X Pinder, Brenda A workshop approach to Shakespeare's Macbeth A workshop approach to Shakespeare's Macbeth : Kopiervorlagen 1. Aufl., [Nachdr.] Stuttgart [u.a.] Klett Fre N 710: 10 Fre N 710: 10 Handbibliothek-HB Englisch "DE-8; DE-547; DE-32; DE-Ma9; DE-Fl3; DE-Frei129"
|
||||
375806563 3106653353 1999 87-11-09136-3 "Rahlens, Holly-Jane *1950-* ; ID: gnd/128582650" Prince William, Maximillian Minsky and me Prince William, Maximillian Minsky and me Stuttgart [u.a.] Klett Fre O 580: 211 Fre O 580: 211 Handbibliothek-HB Englisch DE-Frei129
|
||||
1607047667 3125761409 1999 "87-11-09119-3; 3-12-544392-X; 82-05-25807-4; 91-21-18774-6; 0-85048-355-7; 951-31-1608-5" "Ferro, Charles *ca. 20. Jh.* ; ID: gnd/119482134" Burning love Burning love "Copenhagen; Stuttgart" "Aschehoug; Klett" Fre O 580: 223 Fre O 580: 223 Handbibliothek-HB Englisch DE-Frei129
|
||||
1606346857 3119661864 1996 "978-87-23-90522-2; 91-47-07944-4; 978-3-12-535420-3" "Duncan, Lois *1934-2016* ; ID: gnd/119191458" I know what you did last summer I know what you did last summer "Copenhagen; Stuttgart" "Easy Readers; Klett Sprachen" Fre O 580: 228 Fre O 580: 228 Handbibliothek-HB Englisch DE-Frei129
|
||||
1606999397 3125345847 2000 3-12-540500-9 "Brown, George H. *1884-* ; ID: gnd/1146693834" Robin Hood and his outlaws Robin Hood and his outlaws 1. Aufl. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett Schulbuchverl. Fre O 580: 240 Fre O 580: 240 Handbibliothek-HB Englisch DE-Frei129
|
||||
1476906548 2802909975 2008 "978-3-12-535151-6; 978-87-23-02879-2" John Cook crosses Dead Man's Sea John Cook crosses Dead Man's Sea "John Cook crosses Dead Man's Sea / Koch Jensen, Kirsten ; Buch" 1. ed. "[S.l.]; [Stuttgart]" "Egmont; Klett Sprachen" Fre O 580: 247 Fre O 580: 247 Handbibliothek-HB Englisch DE-Frei129
|
||||
1380345855 2608475760 2008 "3-12-578040-3; 978-3-12-578040-8" "Rai, Bali *1971-* ; ID: gnd/124060080" "(Un)arranged marriage / Rai, Bali *1971-* ; ID: gnd/124060080 ; [Hauptbd.]" 1. Aufl., [Nachdr.] Stuttgart Klett Sprachen Fre O 580: 71 Fre O 580: 71 Handbibliothek-HB Englisch DE-Frei129
|
||||
1621096661 3238351362 1992 "978-3-12-536241-3; 3-12-536241-5" "Stevenson, Robert Louis *1850-1894* ; ID: gnd/118753711" Treasure island Treasure island "Kopenhagen; Stuttgart; München" "Easy Readers; Klett" Fre O 590: 17 Fre O 590: 17 Handbibliothek-HB Englisch DE-Frei129
|
||||
162116778X 323879535X 2009 978-3-12-514814-7 "Banfi, Maria Luisa ; ID: gnd/1280437081" A faraway world A faraway world Stuttgart Klett Fre O 590: 19 Fre O 590: 19 Handbibliothek-HB Englisch DE-Frei129
|
||||
1607109492 3126294871 1998 3-12-542400-3 Musman, Richard Titanic Titanic 2. Aufl., 19. [Dr.] "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett Schulbuchverl. Fre O 600: 29 Fre O 600: 29 Handbibliothek-HB Englisch DE-Frei129
|
||||
1635619467 3292125375 2009 "978-3-12-501603-3; 3-12-501603-7" "Clandfield, Lindsay *1971-* ; ID: gnd/1231920580" Dealing with difficulties Dealing with difficulties : solutions, strategies and suggestions for successful teaching "Peaslake; Stuttgart" "Delta Publishing; Klett Sprachen GmbH" HD 158 C587 HD 158 C587 Handbibliothek-HB Englisch DE-Frei129
|
||||
1601492448 3076760580 1994 "0-521-42235-3; 0-521-42015-6; 3-12-533161-7" Vale, David Teaching children english Teaching children english : a training course for teachers of English to children "Cambridge [u.a.]; [Stuttgart; Dresden]" "Cambridge University Press; Klett [Vertrieb]" HD 162 V149 HD 162 V149 Handbibliothek-HB Englisch "DE-Ch1; DE-Frei129"
|
||||
315247533 3127683871 1998 3-7709-0897-X Englisch für Minis Englisch für Minis : für die Grundschule 3. Aufl. Reutlingen Ensslin und Laiblin HD 162 Z54 (3) HD 162 Z54 (3) Handbibliothek-HB Englisch DE-Frei129
|
||||
1615629300 3193793345 2000 "0-521-66805-0; 3-12-533025-4" Wicks, Matt Imaginative projects Imaginative projects : a resource book of projects for younger students 1. publ. "Cambridge; Stuttgart [u.a.]" "Cambridge Univ. Pr.; Klett [Vertrieb]" HD 164 W637 HD 164 W637 Handbibliothek-HB Englisch DE-Frei129
|
||||
481312366 3232945201 2005 "3-12-534145-0; 0-521-60582-2" Craven, Miles Quizzes, questionnaires and puzzles Quizzes, questionnaires and puzzles : ready-made activities for intermediate students "[Stuttgart]; Cambridge [u.a.]" "Klett; Cambridge Univ. Press" HD 172 C898 HD 172 C898 Handbibliothek-HB Englisch "DE-547; DE-Frei129; DE-520"
|
||||
618344039 3116782202 2009 "978-3-12-514808-6; 978-88-536-0427-9" "Barrie, James M. *1860-1937* ; ID: gnd/11865733X" Peter Pan Peter Pan "Recanati; Stuttgart" "ELI; Klett" HD 176 B275 HD 176 B275 Handbibliothek-HB Englisch "DE-8; DE-7; DE-7; DE-15; DE-Frei129"
|
||||
1606122371 3117745807 2009 "978-88-536-0430-9; 978-3-12-514812-3" "Carroll, Lewis *1832-1898* ; ID: gnd/11851928X" Alice in Wonderland Alice in Wonderland "[Stuttgart]; [Stuttgart]" "Ernst Klett Sprachen GmbH; Klett [Vertrieb]" HD 176 C319 HD 176 C319 Handbibliothek-HB Englisch "DE-56; DE-15; DE-Frei129"
|
||||
379303035 3139033753 1994 3-12-570350-6 "Gompf, Gundi *-2013* ; ID: gnd/1025346645" Chico Chico 1. Aufl., [Nachdr.] "Stuttgart; Leipzig" Klett Schulbuchverl. HD 176 G634 HD 176 G634 Handbibliothek-HB Englisch "DE-547; DE-28; DE-Frei129"
|
||||
1608742156 3139033362 1999 3-12-570380-8 "Gompf, Gundi *-2013* ; ID: gnd/1025346645" Aunt Sophy Aunt Sophy 1. Aufl., [Nachdr.] Stuttgart Klett HD 176 G634 A9 HD 176 G634 A9 Handbibliothek-HB Englisch DE-Frei129
|
||||
1621655040 3241548775 2004 3-12-571414-1 Conroy-Schulz, Marilyn Two Pantomimes for Christmas Two Pantomimes for Christmas 1. Aufl., [Nachdr.] "Stuttgart; Düsseldorf; Leipzig" Klett HD 184 C754 HD 184 C754 Handbibliothek-HB Englisch DE-Frei129
|
||||
233023119 3198899346 1997 3-12-719001-8 "Donath, Reinhard *1952-* ; ID: gnd/115688889" E-Mail-Projekte im Englischunterricht E-Mail-Projekte im Englischunterricht : authentische Kommunikation mit englischsprachigen Partnerklassen 1. Aufl., [Nachdr.] "Stuttgart; Leipzig [u.a.]" Klett-Verl. HD 184 D677 HD 184 D677 Handbibliothek-HB Englisch "DE-27; DE-547; DE-7; DE-3; DE-Luen4; DE-715; DE-715; DE-715; DE-700; DE-Va1; DE-755; DE-291-307; DE-Sa16-1; DE-Frei129"
|
||||
1607281430 3127914857 1999 3-12-570910-5 "Hellyer-Jones, Rosemary ; ID: gnd/119036045" Snapdragon Snapdragon 1. Aufl., [Nachdr.] "Stuttgart; Düsseldorf; Leipzig" Klett HD 192 H477 HD 192 H477 Handbibliothek-HB Englisch DE-Frei129
|
||||
1604842288 3106447370 2008 978-3-12-573103-5 Price, Roger Mad Libs "Mad Libs : best of Mad Libs; Mad Libs 50th anniversary" "New York; [Stuttgart]" "Price, Stern, Sloan; Klett" HD 192 P946 HD 192 P946 Handbibliothek-HB Englisch DE-Frei129
|
||||
1643230581 3308179105 1994 "0-521-30996-4; 0-521-31224-8; 3-12-533990-1" Collie, Joanne Literature in the language classroom Literature in the language classroom : a resource book of ideas and activities 1. publ., 7. pr. "Cambridge [u.a.]; [Stuttgart; Dresden]" "Cambridge Univ. Pr.; Klett" HD 210 C699 (7) HD 210 C699 (7) Handbibliothek-HB Englisch DE-Frei129
|
||||
385141424 3241543722 2007 "978-3-12-530520-5; 3-12-530520-9" Bic, Alexander D. Alaskan adventures Alaskan adventures 1. Aufl., [Nachdr.] "Stuttgart; Düsseldorf; Leipzig" Klett HD 219 B583 HD 219 B583 Handbibliothek-HB Englisch "DE-8; DE-Frei129"
|
||||
1444877186 272053658X 2009 978-3-12-588052-8 Activity book mit Audio-CD und Lernsoftware Activity book mit Audio-CD und Lernsoftware "Playway. - Ausg. für Deutschland ; 3, Activity book" 2. Aufl. "Rum/Innsbruck; Stuttgart" "Helbling; Klett" HD 220 I G376 A -3(2) HD 220 I G376 A -3(2) Handbibliothek-HB Englisch DE-Frei129
|
||||
1444764209 272053739X 2009 978-3-12-588053-5 "Playway. - Ausg. für Deutschland ; 3, Teacher's Book" 1. Aufl., [Nachdr.] "Rum/Innsbruck; Stuttgart" "Helbling; Klett" HD 220 I G376 L -3 HD 220 I G376 L -3 Handbibliothek-HB Englisch DE-Frei129
|
||||
1444745905 2720538620 2009 978-3-12-588063-4 "Playway. - Ausg. für Deutschland ; 4, Teacher's Book" 2. Aufl. "Rum/Innsbruck; Stuttgart" "Helbling; Klett" HD 220 I G376 L -4(2) HD 220 I G376 L -4(2) Handbibliothek-HB Englisch DE-Frei129
|
||||
1444859439 2720537977 2009 978-3-12-588059-7 Show what you know Show what you know : Lehrerkommentar, Tests, Materialien zur Freiarbeit, Portfolio, inkl. CD (Audio- und CD-ROM-Teil) "Playway. - Ausg. für Deutschland ; 3, [Lehrerband]" 2. Aufl. "Innsbruck; [Stuttgart; Leipzig]" "Helbling; Klett" HD 220 I G376 L1 -3(2) HD 220 I G376 L1 -3(2) Handbibliothek-HB Englisch DE-Frei129
|
||||
1444863517 272053904X 2009 978-3-12-588069-6 Show what you know Show what you know : Lehrerkommentar, Tests, Materialien zur Freiarbeit, Portfolio, inkl. CD (Audio- und CD-ROM-Teil) "Playway. - Ausg. für Deutschland ; 4, [Lehrerband]" 2. Aufl. "Innsbruck; [Stuttgart; Leipzig]" "Helbling; Klett" HD 220 I G376 L1 -4(2) HD 220 I G376 L1 -4(2) Handbibliothek-HB Englisch DE-Frei129
|
||||
1444927078 2720534013 2009 978-3-12-588046-7 Picture cards, story cards Picture cards, story cards "Playway. - Ausg. für Deutschland ; 2, Cards-set" 1. Aufl. "Stuttgart; [Leipzig]" Klett HD 220 I G376 Z -2 HD 220 I G376 Z -2 Handbibliothek-HB Englisch DE-Frei129
|
||||
1439736448 2720538892 2009 978-3-12-588066-5 Picture cards, story cards Picture cards, story cards "Playway. - Ausg. für Deutschland ; 4, Cards-set" 1. Aufl. "Stuttgart; [Leipzig]" Klett HD 220 I G376 Z -4 HD 220 I G376 Z -4 Handbibliothek-HB Englisch DE-Frei129
|
||||
1408960311 2831826837 2009 978-3-12-588061-0 "Playway. - [Neuentwicklung, Ausg. Baden-Württemberg, Brandenburg, Hamburg, Rheinland-Pfalz] ; 4, Activity book mit Audio-CD" 2. Aufl. "Rum; Innsbruck; Stuttgart" "Helbling; Klett" HD 220 I N481 A -4/1(N2) HD 220 I N481 A -4/1(N2) Handbibliothek-HB Englisch DE-Frei129
|
||||
1444917749 2720538337 2009 978-3-12-588062-7 Activity book mit Audio-CD und Lernsoftware Activity book mit Audio-CD und Lernsoftware "Playway. - [Neuentwicklung, Ausg. Baden-Württemberg, Brandenburg, Hamburg, Rheinland-Pfalz] ; 4, Activity book" 2. Aufl. "Rum/Innsbruck; Stuttgart" "Helbling; Klett" HD 220 I N481 A -4/2 (N2) HD 220 I N481 A -4/2 (N2) Handbibliothek-HB Englisch DE-Frei129
|
||||
137496459X 2596855836 2008 978-3-12-581127-0 Vokabellernheft Vokabellernheft "Red Line ; 2, Vokabellernheft" 1. Aufl., [Nachdr.] "Stuttgart; Leipzig" Klett HD 220 II R312 Z1 -2 HD 220 II R312 Z1 -2 Handbibliothek-HB Englisch DE-Frei129
|
||||
1104769875 2923856147 1993 3-12-511600-7 1. Auflage 1. Auflage "A grammar workshop ; [Hauptbd.]" "Stuttgart; Leipzig" Klett-Schulbuchverl. HD 220 Z66 G7 HD 220 Z66 G7 Handbibliothek-HB Englisch "DE-14; DE-Frei129"
|
||||
1104769557 2212848773 1993 3-12-511610-4 1. Aufl., 1. Dr 1. Aufl., 1. Dr "A grammar workshop ; Lehrerausg. mit Lösungen" "Stuttgart; Leipzig" Klett-Schulbuchverl. HD 220 Z66 G7 L HD 220 Z66 G7 L Handbibliothek-HB Englisch "DE-14; DE-Frei129"
|
||||
510595294 3233118813 2005 "0-521-52727-9; 3-12-533600-7; 978-0-521-52727-9" "McCarthy, Michael *1947-* ; ID: gnd/124352286" English phrasal verbs in use English phrasal verbs in use : 70 units of vocabulary reference and practice self-study and classroom use 4. print. "Cambridge [u.a.]; [Stuttgart; Leipzig] [u.a.]" "Cambridge University Press; Klett Sprachen" HD 230 M478 P5 HD 230 M478 P5 Handbibliothek-HB Englisch "DE-Luen4; DE-Frei129; DE-520"
|
||||
1623342325 3250408840 2001 "0-521-66435-7; 3-12-533511-6" "McCarthy, Michael *1947-* ; ID: gnd/124352286" English vocabulary in use English vocabulary in use : upper-intermediate 1. publ. "[Stuttgart]; Cambridge [u.a.]" "Klett [Vertrieb]; Cambridge University Press" HD 230 M478 U8 HD 230 M478 U8 Handbibliothek-HB Englisch "DE-547; DE-7; DE-3; DE-9; DE-Frei129; DE-Rtw2; DE-Tue128"
|
||||
368412911 3150678293 2003 "978-3-12-539099-7; 0-521-01171-X; 3-12-539099-0" Redman, Stuart English vocabulary in use "English vocabulary in use : pre-intermediate & intermediate ; [self-study and classroom use]" new ed., repr. "Cambridge [u.a.]; [Stuttgart]" "Cambridge University Press; Klett [Vertrieb]" HD 230 R318 (N) HD 230 R318 (N) Handbibliothek-HB Englisch "DE-18; DE-7; DE-519; DE-519; DE-519; DE-527; DE-527; DE-527; DE-Frei129"
|
||||
1606478672 3120779660 2007 "978-0-521-75464-4; 978-3-12-533496-0" Gammidge, Mick Speaking extra Speaking extra : a resource book of multi-level skills activities 1. publ., [repr.] "Cambridge; [Stuttgart]" "Cambridge University Press; Klett [Vertrieb]" HD 231 G193 HD 231 G193 Handbibliothek-HB Englisch DE-Frei129
|
||||
1606483498 312082013X 2007 "0-521-77436-5; 3-12-539089-3" Lazar, Gillian Meanings and metaphors Meanings and metaphors : activities to practise figurative language 1. publ., [repr.] "Cambridge; Stuttgart [u.a.]" "Cambridge University Press; Klett [Vertrieb]" HD 234 L431 HD 234 L431 Handbibliothek-HB Englisch DE-Frei129
|
||||
1621356167 3239878542 2006 3-12-542300-7 "Amor, Stuart *1947-* ; ID: gnd/1145633269" The mail train job The mail train job 1. Aufl., [Nachdr.] Stuttgart [u.a.] Klett-Schulbuchverl. HD 240 A524 HD 240 A524 Handbibliothek-HB Englisch DE-Frei129
|
||||
1382370490 2613003189 2006 3-12-570940-7 "A cornish mystery ; Buch" 1. Aufl., [Nachdr.]. Stuttgart Klett HD 240 A995 C8 HD 240 A995 C8 Handbibliothek-HB Englisch DE-Frei129
|
||||
1381698875 2611680841 2008 978-3-12-547081-1 "The four detectives ; Buch" 2. Aufl. "Stuttgart; Leipzig" Klett HD 240 B141 (2) HD 240 B141 (2) Handbibliothek-HB Englisch DE-Frei129
|
||||
1612630731 3168952648 2003 3-12-578130-2 "Doherty, Berlie *1943-* ; ID: gnd/120869322" Dear nobody Dear nobody 1. Aufl., [Nachdr.] "Stuttgart; Düsseldorf; Leipzig" Klett HD 240 D655 HD 240 D655 Handbibliothek-HB Englisch DE-Frei129
|
||||
138169831X 2611486700 2004 3-12-570990-3 "One of those days ; Buch" 2. Aufl. "Stuttgart; Düsseldorf; Leipzig" Klett HD 240 H153 (2) HD 240 H153 (2) Handbibliothek-HB Englisch DE-Frei129
|
||||
1382372485 261300634X 2006 3-12-570970-9 "Roller coaster ; Buch" 1. Aufl., [Nachdr.]. "Stuttgart; Düsseldorf; Leipzig" Klett HD 240 H477 R7 HD 240 H477 R7 Handbibliothek-HB Englisch DE-Frei129
|
||||
1380404258 2609335024 2006 3-12-578020-9 "Cloning Miranda ; [Hauptbd.]" 1. Aufl., [Nachdr.] "Stuttgart; Düsseldorf; Leipzig" Klett HD 240 K15 HD 240 K15 Handbibliothek-HB Englisch DE-Frei129
|
||||
1182491839 2444802268 2004 3-12-578140-X "The Giver ; [Hauptband]" 1. Aufl., [Nachdr.] "Stuttgart; Düsseldorf; Leipzig" Klett HD 240 L921 HD 240 L921 Handbibliothek-HB Englisch DE-Frei129
|
||||
1182492223 244480306X 2004 3-12-578141-8 "The Giver ; Teacher's Guide" 1. Aufl., [Nachdr.] - 2004. "Stuttgart; Düsseldorf; Leipzig" Klett HD 240 L921 L HD 240 L921 L Handbibliothek-HB Englisch DE-Frei129
|
||||
1382369913 2613001909 2004 3-12-570950-4 "Foul! ; Buch" 1. Aufl., [Nachdr.]. Stuttgart Klett HD 240 P855 HD 240 P855 Handbibliothek-HB Englisch DE-Frei129
|
||||
146379049X 2768612472 2003 3-12-570950-4 "Foul! ; Buch" Nachdr. Stuttgart Klett HD 240 P855 HD 240 P855 Handbibliothek-HB Englisch DE-Frei129
|
||||
1381698468 2611683603 2004 3-12-570920-2 "Ben alone in Leeds ; Buch" 7. Aufl. "Stuttgart; Düsseldorf; Leipzig" Klett HD 240 P923 (7) HD 240 P923 (7) Handbibliothek-HB Englisch DE-Frei129
|
||||
1182036872 2443830047 2004 3-12-578170-1 "Holes ; [Hauptbd.]" 1. Aufl., [Nachdr.] "Stuttgart; Düsseldorf; Leipzig" Klett HD 240 S121 HD 240 S121 Handbibliothek-HB Englisch DE-Frei129
|
||||
1182493661 2444805682 2004 3-12-578171-X with copymasters with copymasters "Holes ; Teacher's guide" 1. Aufl., [Nachdr.] - 2004. "Stuttgart; Düsseldorf; Leipzig" Klett HD 240 S121 L HD 240 S121 L Handbibliothek-HB Englisch DE-Frei129
|
||||
1621283976 3239479532 2003 3-12-544150-1 "Taylor, Jeremy ; ID: gnd/119411164" All 4 love All 4 love Stuttgart Klett [u.a.] HD 240 T243 HD 240 T243 Handbibliothek-HB Englisch DE-Frei129
|
||||
1621652661 3241536181 2008 3-12-542630-8 Orton, Eric Shemaz Shemaz 1. Aufl., [Nachdr.] "Stuttgart; München; Düsseldorf; Leipzig" Klett HD 242 O78 HD 242 O78 Handbibliothek-HB Englisch DE-Frei129
|
||||
338542671 3143192216 1999 "0-00-448879-2; 3-12-580252-0" Collins-Longman student atlas Collins-Longman student atlas 1. publ., repr., rev. "Glasgow [u.a.]; [Stuttgart]" "HarperCollins [u.a.]; Klett" HD 245 C713 HD 245 C713 Handbibliothek-HB Englisch "DE-547; DE-517; DE-Frei129; DE-105"
|
||||
1607831007 3131808888 1996 3-12-580140-0 Polar regions Polar regions 1. Aufl., [Nachdr.] Stuttgart Klett-Schulbuchverl. HD 245 M217 HD 245 M217 Handbibliothek-HB Englisch DE-Frei129
|
||||
1616270993 3198899028 2003 "0-521-00891-3; 3-12-580603-8" "Martin, Jean ; ID: gnd/135952689" Chemistry Chemistry New ed., [2. ed, repr.] "Cambridge; Stuttgart [u.a.]" "Cambridge Univ. Pr.; Klett [Vertrieb]" HD 245 M381 C5 (2) HD 245 M381 C5 (2) Handbibliothek-HB Englisch DE-Frei129
|
||||
1616271124 3198900107 2003 "0-521-01030-6; 3-12-580602-X" Milner, Brian Physics Physics New ed., [2. ed., repr.] "Cambridge; Stuttgart [u.a.]" "Cambridge Univ. Pr.; Klett [Vertrieb]" HD 245 M659 (2) HD 245 M659 (2) Handbibliothek-HB Englisch DE-Frei129
|
||||
1607831481 3131811730 1997 3-12-580130-3 Population growth and distribution Population growth and distribution 1. Aufl., [Nachdr.] Stuttgart Klett HD 245 R595 HD 245 R595 Handbibliothek-HB Englisch DE-Frei129
|
||||
1607829053 3131798203 1999 3-12-580310-1 Young people and the law Young people and the law 1. Aufl., [Nachdr.] Stuttgart Klett-Schulbuchverl. HD 245 S385 HD 245 S385 Handbibliothek-HB Englisch DE-Frei129
|
||||
1618797727 3219471315 1991 "0-590-46988-6; 978-3-12-589056-5" "Anholt, Catherine *1958-* ; ID: gnd/1194589901" All about you All about you "New York [u. a.]; [Stuttgart]" "Scholastic; Klett [Vertrieb]" HG 831 A596 HG 831 A596 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
160476810X 3105750010 1966 "0-590-44260-0; 978-0-590-44260-2; 978-3-12-589024-4" "Bridwell, Norman *1928-2014* ; ID: gnd/112373416X" Clifford takes a trip Clifford takes a trip "New York [u.a.]; [Stuttgart]" "Scholastic Inc.; Klett [Vertrieb]" HG 831 B852 T1 HG 831 B852 T1 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
1618808435 3219566375 2008 "0-590-09242-1; 978-3-12-589047-3" "Brown, Margaret Wise *1910-1952* ; ID: gnd/119076233" Goodnight moon Goodnight moon [Repr.] "New York [u. a.]; [Stuttgart]" "Scholastic; Klett [Vertrieb]" HG 831 B879 H9 HG 831 B879 H9 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
1618198742 3214380303 2004 978-3-12-589070-1 Buehner, Caralyn Snowmen at night Snowmen at night "New York; [Stuttgart]" "Scholastic; Klett [Vertrieb]" HG 831 B928 HG 831 B928 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
1618798065 3219473229 2001 "0-439-32116-6; 978-3-12-589058-9" Cain, Janan The way I feel The way I feel 1. pr. "New York [u. a.]; [Stuttgart]" "Scholastic; Klett [Vertrieb]" HG 831 C135 HG 831 C135 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
583229573 322809071X 2006 "0-590-72852-0; 978-3-12-589078-7" "Carle, Eric *1929-2021* ; ID: gnd/118853295" Today is monday Today is monday "New York, NY [u.a.]; [Stuttgart]" "Scholastic; Klett [Vertrieb]" HG 831 C278 T6 HG 831 C278 T6 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
1618793381 3219438016 1993 "0-590-47067-1; 978-3-12-589054-1" "Cauley, Lorinda Bryan *1951-* ; ID: gnd/1067345280" Clap your hands Clap your hands [Nachdr.] "New York [u. a.]; [Stuttgart]" "Scholastic; Klett [Vertrieb]" HG 831 C372 HG 831 C372 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
1155867009 2380261067 1992 "Fassett, James H. *1869-* ; ID: gnd/173200257" The pancake The pancake Stuttgart Pädagogische Forschungsstelle beim Bund der Freien Waldorfschulen HG 831 F249 HG 831 F249 Handbibliothek-HB Englisch DE-Frei129
|
||||
1618803751 3219520251 2007 "0-516-23890-6; 978-3-12-589051-0" "McKissack, Pat *1944-2017* ; ID: gnd/132034573" Bugs! Bugs! [repr.] "New York [u. a.]; [Stuttgart]" "Scholastic; Klett [Vertrieb]" HG 831 M478 C9 HG 831 M478 C9 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
1618806114 321954309X 2007 "0-516-22262-7; 978-3-12-589045-9" Meister, Cari Game day Game day [repr.] "New York [u. a.]; [Stuttgart]" "Scholastic; Klett [Vertrieb]" HG 831 M515 HG 831 M515 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
1618806823 3219550185 1993 "0-590-48071-5; 978-3-12-589050-3" "Packard, David *1912-1996* ; ID: gnd/119407280" The ball game The ball game "New York [u. a.]; [Stuttgart]" "Scholastic; Klett [Vertrieb]" HG 831 P119 HG 831 P119 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
1618807668 3219557937 2008 "0-439-59889-3; 978-3-12-589049-7" Parker, Marjorie Blain Hello, school bus! Hello, school bus! [repr.] "New York [u. a.]; [Stuttgart]" "Scholastic; Klett [Vertrieb]" HG 831 P242 HG 831 P242 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
1618804553 3219528171 2008 "0-516-22008-X; 978-3-12-589048-0" Rau, Dana Meachen Feet Feet [repr.] "New York [u. a.]; [Stuttgart]" "Scholastic; Klett [Vertrieb]" HG 831 R239 HG 831 R239 Handbibliothek-HB Englisch "DE-15; DE-Frei129"
|
||||
1188028480 245582733X 2005 3-12-578010-1 "Dhami, Narinder *1958-* ; ID: gnd/115689362" "Bend it like Beckham / Dhami, Narinder *1958-* ; ID: gnd/115689362 ; [Hauptbd.]" 1. Aufl. "Stuttgart; Düsseldorf; Leipzig" Klett HN 9990 D533 HN 9990 D533 Handbibliothek-HB Englisch DE-Frei129
|
||||
1383021198 2524745635 2008 "3-12-578011-X; 978-3-12-578011-8" "Dhami, Narinder *1958-* ; ID: gnd/115689362" "Bend it like Beckham / Dhami, Narinder *1958-* ; ID: gnd/115689362 ; Teacher's guide" 1. Aufl., [Nachdr.] "Stuttgart; Düsseldorf; Leipzig" Klett HN 9990 D533 L HN 9990 D533 L Handbibliothek-HB Englisch DE-Frei129
|
||||
1182489168 2444797663 2004 3-12-578150-7 "Seedfolks ; [Hauptband]" 1. Aufl., [Nachdr.] - 2004. "Stuttgart; Düsseldorf; Leipzig" Klett HU 9800 F596 HU 9800 F596 Handbibliothek-HB Englisch DE-Frei129
|
||||
160782969X 3131801727 1997 3-12-580160-5 California California 1. Aufl., [Nachdr.] Stuttgart Klett MA 16/299 MA 16/299 Handbibliothek-HB Englisch DE-Frei129
|
||||
1463797036 2768623059 2006 3-12-578140-X "The Giver ; [Hauptband]" 1. Aufl., Nachdr. "Stuttgart; Düsseldorf; Leipzig" Klett Handbibliothek-HB Englisch DE-Frei129
|
||||
1169141366 2412392692 1979 Senfter, Alfons Jahwes Land Jahwes Land : Bilder aus dem Land der Bibel 6. Aufl. Freiburg [u.a.] Christophorus-Verlag [u.a.] BC 6000 S476 (6) BC 6000 S476 (6) Handbibliothek-HB Evangelische Theologie "DE-31; DE-Frei129; DE-Rch1"
|
||||
1109713185 2233095782 1984 "3-7806-0208-3; 3-419-50570-1" "9 x 11 neue Kinderlieder zur Bibel ; Lieder für Schule, Gottesdienst und Familie" "9 x 11 neue Kinderlieder zur Bibel ; Lieder für Schule, Gottesdienst und Familie" "Kinderlieder zur Bibel ; 2" 6. Aufl. Lahr/Schwarzwald Kaufmann BU 4950 W336 -2(6) BU 4950 W336 -2(6) Handbibliothek-HB Evangelische Theologie DE-Frei129
|
||||
014943786 3239297604 1980 "3-545-26113-1; 3-7806-0240-7; 3-491-79270-3" "Block, Detlev *1934-2022* ; ID: gnd/118511777" Gut, daß du da bist Gut, daß du da bist : Gebete für Kinder 3. Aufl. "Lahr; Düsseldorf" "Kaufmann; Patmos-Verl." BU 5400 B651 (3) BU 5400 B651 (3) Handbibliothek-HB Evangelische Theologie "DE-715; DE-Hv111; DE-Frei129"
|
||||
500941262 3127799640 1994 3-438-01592-7 Die Bibel in Auswahl Die Bibel in Auswahl 2. Aufl. Stuttgart Deutsche Bibelges. BC 2555 A618 (2) BC 2555 A618 (2) Handbibliothek-HB Evangelische Theologie "DE-Va1; DE-H99; DE-Frei129; DE-125"
|
||||
1622972449 3248447257 1998 3-438-01664-8 Gute Nachricht Bibel "Gute Nachricht Bibel : Altes und Neues Testament; mit den Spätschriften des Alten Testaments (Deuterokanonische Schriften/Apokrypen)" 2. Aufl. Stuttgart Dt. Bibelges. BC 3000 G983 (2) BC 3000 G983 (2) Handbibliothek-HB Evangelische Theologie DE-Frei129
|
||||
1618805304 3219534619 2008 978-3-936086-41-6 "Dohmen, Caspar *1967-* ; ID: gnd/136480489" Let's make money Let's make money : was macht die Bank mit unserem Geld? [Das Buch zum Film] 3. Aufl. [Freiburg im Breisgau] Orange Press QK 600 D655 (3) QK 600 D655 (3) Handbibliothek-HB Geographie "DE-14; DE-Frei129"
|
||||
1143449258 2347996967 1984 "Rudloff, Hans$cvon *1922-* ; ID: gnd/116670614" Einführung in die Probleme der Wetter- und Klimakunde Einführung in die Probleme der Wetter- und Klimakunde : Vorlesungen aus dem Sommersemester, speziell für die Lehrerausbildung [Freiburg] RB 10423 R916 RB 10423 R916 Handbibliothek-HB Geographie DE-Frei129
|
||||
1352466147 2573715876 19XX Energiegemeinden im Naturpark Südschwarzwald Energiegemeinden im Naturpark Südschwarzwald : Eine Informationsbroschüre des Arbeitskreises Energie im Naturpark Südschwarzwald Freiburg triolog RB 10699 A664 RB 10699 A664 Handbibliothek-HB Geographie DE-Frei129
|
||||
1352465043 2573713385 2007 Goldgrube Energieeffizienz Goldgrube Energieeffizienz "Solar Region ; 4" Freiburg fesa RB 10699 F654 RB 10699 F654 Handbibliothek-HB Geographie DE-Frei129
|
||||
1383858918 2616114437 2009 "Falk, Gregor C. *1967-* ; ID: gnd/173188311" Bangladesch - ein Reisetagebuch Bangladesch - ein Reisetagebuch Freiburg Gregor C. Falk RR 40075 F191 RR 40075 F191 Handbibliothek-HB Geographie DE-Frei129
|
||||
1616445815 3200265051 1995 3-12-484400-9 Alexander-Weltatlas Alexander-Weltatlas Neue Grundausgabe Baden-Württemberg, 1. Aufl.,10. [Dr.] Stuttgart [u.a.] Klett HB Geographie Handbibliothek-HB Geographie DE-Frei129
|
||||
326821015 3117429026 2004 "0-521-78609-6; 3-12-580470-1" Geography for AS Geography for AS 1. publ., repr. "Cambridge; [Stuttgart]" "Cambridge Univ. Press; Klett" HD 245 II H325 HD 245 II H325 Handbibliothek-HB Geographie "DE-84; DE-3; DE-Frei129"
|
||||
385526083 3183969963 2004 3-12-580320-9 "Landesinstitut für Schule und Weiterbildung ; ID: gnd/2077344-4" Bilingual geography "Bilingual geography : polar regions ; hot deserts ; tropical rain forests ; California" 1. Aufl., [Nachdr.] Stuttgart Klett-Schulbuchverl. HD 245 M946 HD 245 M946 Handbibliothek-HB Geographie "DE-84; DE-7; DE-291-309; DE-Frei129"
|
||||
239812069 3253924475 1998 "3-12-517380-9; 3-12-517225-X" Pons-Großwörterbuch für Experten und Universität Pons-Großwörterbuch für Experten und Universität : Französisch-deutsch, [deutsch-französisch] 1. Aufl., [unveränd.] Nachdruck "Stuttgart; Düsseldorf; Leipzig" Klett ID 6850 S362 ID 6850 S362 Handbibliothek-HB Geographie "DE-18; DE-8; DE-27; DE-7; DE-7; DE-Wim2; DE-3; DE-3; DE-564; DE-564; DE-B1565; DE-517; DE-517; DE-21-108; DE-21-34; DE-291-307; DE-291-307; DE-14; DE-352; DE-93; DE-93-180; DE-Frei129; DE-Sp3; DE-Mh39; DE-1252"
|
||||
011030488 3197381491 1977 3-12-140400-8 "Ashauer, Günter *1934-2007* ; ID: gnd/115515755" Grundwissen Wirtschaft Grundwissen Wirtschaft 3. Aufl., 61 Dr. Stuttgart Klett QB 300 A819 (3) QB 300 A819 (3) Handbibliothek-HB Geographie DE-Frei129
|
||||
1121518753 2526625041 1994 3-12-409500-6 Die Geographie als Wissenschaft, die Erde und ihre Darstellung, Geologie Die Geographie als Wissenschaft, die Erde und ihre Darstellung, Geologie "Geovokabeln ; 1" 1. Aufl., 3. [Dr.]. Stuttgart Klett-Schulbuchverl. RB 10006 W198 -1 RB 10006 W198 -1 Handbibliothek-HB Geographie "DE-14; DE-Frei129; DE-105"
|
||||
1120317711 2526625718 1994 3-12-409510-3 Geomorphologie Geomorphologie "Geovokabeln ; 2" 1. Aufl., 3. [Dr.] - 1994. Stuttgart Klett-Schulbuchverl. RB 10006 W198 -2 RB 10006 W198 -2 Handbibliothek-HB Geographie "DE-14; DE-15-292; DE-Frei129; DE-105"
|
||||
1110144784 2526626226 1993 3-12-409520-0 Klimatologie, Landschaftszonen Klimatologie, Landschaftszonen "Geovokabeln ; 3" 1. Aufl., 2. [Dr.] - 1993. Stuttgart Klett-Schulbuchverl. RB 10006 W198 -3 RB 10006 W198 -3 Handbibliothek-HB Geographie "DE-15; DE-Frei129"
|
||||
1121519164 252662648X 1994 3-12-409530-8 Bodenkunde, Ökologie Bodenkunde, Ökologie "Geovokabeln ; 4" 1. Aufl., 3. [Dr.]. Stuttgart Klett-Schulbuchverl. RB 10006 W198 -4 RB 10006 W198 -4 Handbibliothek-HB Geographie "DE-14; DE-Frei129; DE-105"
|
||||
1120317894 2526626730 1994 3-12-409540-5 Wirtschaftsgeographie Wirtschaftsgeographie "Geovokabeln ; 5" 1. Aufl., 3. [Dr.] - 1994. Stuttgart Klett-Schulbuchverl. RB 10006 W198 -5 RB 10006 W198 -5 Handbibliothek-HB Geographie "DE-14; DE-15-292; DE-Frei129; DE-105"
|
||||
1121520146 2526626978 1994 3-12-409550-2 Siedlungsgeographie, Raumordnung Siedlungsgeographie, Raumordnung "Geovokabeln ; 6" 1. Aufl., 3. [Dr.]. Stuttgart Klett-Schulbuchverl. RB 10006 W198 -6 RB 10006 W198 -6 Handbibliothek-HB Geographie "DE-14; DE-Frei129; DE-105"
|
||||
1121520294 2526627249 1994 3-12-409560-X Bevölkerungsgeographie, die Dritte Welt Bevölkerungsgeographie, die Dritte Welt "Geovokabeln ; 7" 1. Aufl., 3. [Dr.]. Stuttgart Klett-Schulbuchverl. RB 10006 W198 -7 RB 10006 W198 -7 Handbibliothek-HB Geographie "DE-14; DE-Frei129"
|
||||
1121520405 2526627427 1994 3-12-409570-7 Alphabetisches Register Alphabetisches Register "Geovokabeln ; 8" 1. Aufl., 3. [Dr.]. Stuttgart Klett-Schulbuchverl. RB 10006 W198 -8 RB 10006 W198 -8 Handbibliothek-HB Geographie "DE-14; DE-Frei129"
|
||||
564987352 3168021911 1977 3-12-403210-1 Grundwissen Erdkunde A/B Grundwissen Erdkunde A/B 2., überarb. Aufl., 5. Dr. Stuttgart Klett RB 10063 B897 (2) RB 10063 B897 (2) Handbibliothek-HB Geographie "DE-547; DE-Bs78; DE-Frei129; DE-Stg272"
|
||||
1326614509 2515074707 1977 3-12-767310-8 Das Tropenklima Das Tropenklima "Schwerpunktprogramm Geographie ; (trop)" 2. Aufl., [Nachdr.] Stuttgart Klett RB 10063 S415 -2(2) RB 10063 S415 -2(2) Handbibliothek-HB Geographie DE-Frei129
|
||||
1624890326 3258825742 1998 3-12-491000-1 Alexander-Schulatlas Alexander-Schulatlas 2. Aufl., Nachdr. Stuttgart [u.a.] Klett Perthes RB 10226 A374 (2) RB 10226 A374 (2) Handbibliothek-HB Geographie DE-Frei129
|
||||
137311598X 2592764585 2008 Schandera, Bernd "Pädagogische Hochschule Ludwigsburg ; ID: gnd/31703-2" Bildungsmanagement im Klimawandel Bildungsmanagement im Klimawandel Ludwigsburg Pädagog. Hochschule RB 10438 S299 RB 10438 S299 Handbibliothek-HB Geographie DE-Frei129
|
||||
1344491073 2556773286 1992 3-12-996503-3 Windenergie Windenergie "Folienmappe Alternative Energie ; 1" 1. Aufl., 1. Dr. Stuttgart Klett RB 10696 F665 -1 RB 10696 F665 -1 Handbibliothek-HB Geographie DE-Frei129
|
||||
1619356759 3224140089 1997 3-623-18608-2 Kulturerdteile Kulturerdteile : Zur Arbeit mit der Wanderkarte und dem Poster Kulturerdteile 1. Aufl. "Gotha; Stuttgart" Klett-Perthes RB 10850 N548 RB 10850 N548 Handbibliothek-HB Geographie "DE-Frei129; DE-Zi4"
|
||||
1611274516 3158572958 1988 3-12-997770-8 Folienbuch Klima- und Landschaftszonen der Erde "Folienbuch Klima- und Landschaftszonen der Erde : 65 Folienbilder für die Tageslichtprojektion; mit Erläuterungen und Arbeitsblättern für die praktische Schülerarbeit" 1. Aufl., 8. [Dr.] Stuttgart Klett RB 10878 A466 RB 10878 A466 Handbibliothek-HB Geographie DE-Frei129
|
||||
1350747122 2571264885 1986 3-12-281760-8 Bundesrepublik Deutschland und DDR Bundesrepublik Deutschland und DDR "Rund um die Welt ; 2a, [Hauptbd.]" 1. Aufl. , 2. Dr. Stuttgart Klett RC 20053 K89 RC 20053 K89 Handbibliothek-HB Geographie DE-Frei129
|
||||
1332617743 2529073813 1995 3-623-50719-9 Die Huerta in Südostspanien Die Huerta in Südostspanien : 8 Folien (11 Bilder, 1 Karte) für die Tageslichtprojektion, 2 Arbeitsblätter und Erläuterungen 1. Aufl. "Gotha; Stuttgart" Klett-Perthes RO 20053 W198 RO 20053 W198 Handbibliothek-HB Geographie "DE-547; DE-Frei129"
|
||||
1152016229 2369588225 2000 3-89312-561-2 Mittelalter Mittelalter "I love Geschichte ; 1" 4. Aufl. Lichtenau Freiarbeit-Verl. HB Geschichte Handbibliothek-HB Geschichte DE-Frei129
|
||||
1112057366 2621770894 1989 Römelsberger, Kurt "Geschichtsrätsel / Römelsberger, Kurt ; 1" 1. Aufl. Lichtenau Freiarbeit-Verl. NB 8500 R715 -1 NB 8500 R715 -1 Handbibliothek-HB Geschichte DE-Frei129
|
||||
1112057811 2242882988 1989 Römelsberger, Kurt "Geschichtsrätsel / Römelsberger, Kurt ; 2" 1. Aufl. Lichtenau Freiarbeit-Verl. NB 8500 R715 -3 NB 8500 R715 -3 Handbibliothek-HB Geschichte DE-Frei129
|
||||
1181306280 244222058X 2003 3-12-122110-8 "Damals, heute, morgen. - Baden-Württemberg ; 9, [Schulerbd.]" 1. Aufl., [Nachdr.]. "Stuttgart; Leipzig" Klett, Schulbuchverl. HB Geschichte Handbibliothek-HB Geschichte DE-Frei129
|
||||
118130606X 2442220180 2003 3-12-122150-7 "Damals, heute, morgen. - Baden-Württemberg ; 7, [Schulerbd.]" 1. Aufl., [Nachdr.]. "Stuttgart; Leipzig" Klett, Schulbuchverl. HB Geschichte Handbibliothek-HB Geschichte DE-Frei129
|
||||
1181306159 2442220334 2002 3-12-122190-6 "Damals, heute, morgen. - Baden-Württemberg ; 8, [Schulerbd.]" 1. Aufl., [Nachdr.]. "Stuttgart; Leipzig" Klett, Schulbuchverl. HB Geschichte Handbibliothek-HB Geschichte DE-Frei129
|
||||
115291779X 2371960160 1999 3-12-122140-X "Damals, heute, morgen. - Baden-Württemberg ; 6, [Schulerbd.]" 1. Aufl., [Nachdr.]. "Stuttgart; Leipzig" Klett, Schulbuchverl. HB Geschichte Handbibliothek-HB Geschichte DE-Frei129
|
||||
1153710110 2374311155 1997 3-12-122180-9 "Damals, heute, morgen. - Baden-Württemberg ; 10, [Schulerbd.]" 1. Aufl., [Nachdr.]. "Stuttgart; Leipzig" Klett, Schulbuchverl. HB Geschichte Handbibliothek-HB Geschichte DE-Frei129
|
||||
378858076 3209938628 2003 3-12-927883-4 Stuhrmann, Claudia Mittelalter "Mittelalter : 20 Arbeitsblätter mit didaktisch-methodischen Kommentaren ; Sekundarstufe I" 4. Aufl., 1. [Dr.] "Stuttgart; München; Düsseldorf; Leipzig" Klett NB 8800 S933 NB 8800 S933 Handbibliothek-HB Geschichte "DE-Va1; DE-H155; DE-Frei129"
|
||||
392436779 3199944485 2003 3-12-927881-8 Der Absolutismus "Der Absolutismus : 24 Arbeitsblätter mit didaktisch-methodischen Kommentaren ; Sekundarstufe I" 4. Aufl. "Stuttgart; Düsseldorf; Leipzig" Klett NB 8900 M217 (4) NB 8900 M217 (4) Handbibliothek-HB Geschichte "DE-H155; DE-Frei129"
|
||||
1619675358 3226678329 2009 978-3-937928-16-6 "Denffer, Ahmad$cvon *1949-* ; ID: gnd/11579767X" Gebete für muslimische Kinder Gebete für muslimische Kinder Karlsruhe Andalusia Verlag BU 1850 D392 BU 1850 D392 Handbibliothek-HB Islamische Religionspädagogik "DE-700; DE-Frei129"
|
||||
1566617081 2992196614 2008 "Katholische Kirche$bErzdiözese Freiburg$bSeelsorgeamt ; ID: gnd/67064-9" 'Geheimcode Evangelium' 'Geheimcode Evangelium' : ein Schlüssel zu Jesu 'Guter Nachricht' : geistlicher Übungsweg zur Fastenzeit : 1. Baustein eines 'Pilgerweges der Erneuerung' Freiburg Erzbischöfliches Seelsorgeamt BK 5500 K19 BK 5500 K19 Handbibliothek-HB Katholische Theologie "DE-31; DE-Frei129; DE-2559"
|
||||
1158152582 2386673413 1996 "3-88671-861-1; 3-907145-16-X" Malblock Blatt 33 - 64 Malblock Blatt 33 - 64 "Mandalas zum Ausmalen ; 2" 3. Aufl. Eschbach Verl. am Eschbach BU 4000 M693 -2(3) BU 4000 M693 -2(3) Handbibliothek-HB Katholische Theologie DE-Frei129
|
||||
1132007267 2314923073 1993 3-460-32683-2 Klassenstufe 8 Klassenstufe 8 "Wege der Freiheit ; 8" 1. Aufl., 6. Dr. [um 1993]. Stuttgart Verl. Kath. Bibelwerk BU 2800 F863 -8 BU 2800 F863 -8 Handbibliothek-HB Katholische Theologie DE-Frei129
|
||||
1155728130 2379881383 1975 3-87029-045-5 Gottes Zelt unterwegs "Gottes Zelt unterwegs : die Stiftshütte nach Exodus = 2. Mose 26 ff und 35 ff; ein Modell der Stiftshütte zum Bemalen, Aufbauen und Zusammenkleben" "Möckmühl; Stuttgart" Aue BU 4000 M693 -22 BU 4000 M693 -22 Handbibliothek-HB Katholische Theologie DE-Frei129
|
||||
1155729528 2379884838 1978 3-87029-011-0 Martin Luther und die deutsche Reformation Martin Luther und die deutsche Reformation : Kartenskizze mit 20 Ereigniskärtchen zum Ausmalen und Aufstellen "Möckmühl; Stuttgart" Aue BU 4000 M693 -3 BU 4000 M693 -3 Handbibliothek-HB Katholische Theologie DE-Frei129
|
||||
1155729293 2379884382 1978 3-87029-012-9 Der Tempel in Jerusalem zur Zeit von Jesus Der Tempel in Jerusalem zur Zeit von Jesus : ein Modellierbogen des herodianischen Tempels zum Aufbauen und Zusammenkleben "Möckmühl; Stuttgart" Aue BU 4000 M693 -4 BU 4000 M693 -4 Handbibliothek-HB Katholische Theologie DE-Frei129
|
||||
1155680049 2379843910 1983 3-87029-111-7 Die Synagoge Die Synagoge : das Versammlungs- Gebetshaus der Juden "Möckmühl; Stuttgart" Aue BU 4000 M693 -50 BU 4000 M693 -50 Handbibliothek-HB Katholische Theologie DE-Frei129
|
||||
1182147674 2444076680 1995 3-438-04319-X Pfeffer, Rüdiger "Jesus, der Galiläer / Pfeffer, Rüdiger ; 1" 2. Aufl. Stuttgart Dt. Bibelges. BU 4900 P524 -1(2) BU 4900 P524 -1(2) Handbibliothek-HB Katholische Theologie "DE-14; DE-Frei129"
|
||||
1333958285 2532141832 2006 "3-619-35240-2; 978-3-619-35240-1" "Das Mathebuch. - [Neuausg.], Ausg. für Baden-Württemberg und Nordrhein-Westfalen ; 3, [Schülerbd.]" 1. Aufl., 2. Dr. Offenburg Mildenberger HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
133412728X 2532411244 2005 3-619-25240-8 "Das Mathebuch. - [Neuausg.], Ausg. für Baden-Württemberg und Nordrhein-Westfalen ; 2, [Schülerbd.]" 1. Aufl., 2. Dr. Offenburg Mildenberger HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1320403204 2501320271 2005 3-619-35263-1 "Das Mathebuch ; 3, Handbuch" überarb. u. erw. Aufl. Offenburg Mildenberger HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1447605365 2734923750 2009 978-3-619-35363-7 "Mathetiger ; 3,Handbuch" 2. Aufl. Offenburg Mildenberger SM 370 N481 -3 SM 370 N481 -3 Handbibliothek-HB Mathematik DE-Frei129
|
||||
1151399477 2367932433 1999 Bechen, Peter LRS - Lese-Rechtschreib- und Rechenschwäche LRS - Lese-Rechtschreib- und Rechenschwäche : Ratgeber für die Suche nach Hilfe und den Weg zur Selbsthilfe Neue [2.] Aufl., aktualis. u. stark erw. Stuttgart Aktion Bildungsinformation DT 2100 B391 (2) DT 2100 B391 (2) Handbibliothek-HB Mathematik DE-Frei129
|
||||
1383414939 2615140272 2009 978-3-12-746361-3 "Einblicke Mathematik. - Baden-Württemberg, [Neubearb. 2004] ; 2,[Schülerbuch]" 1. Aufl., 4. Dr. "Stuttgart; Düsseldorf; Leipzig" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1383203954 2615122460 2009 3-12-746352-9 "Einblicke Mathematik. - Baden-Württemberg, [Neubearb. 2004] ; 1, Serviceblatter" 1. Aufl., 3. Dr. "Stuttgart; Düsseldorf; Leipzig" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1383204187 2615123173 2008 3-12-746363-4 "Einblicke Mathematik. - Baden-Württemberg, [Neubearb. 2004] ; 2, Lehrerband" 1. Aufl., 2. Dr. "Stuttgart; Düsseldorf; Leipzig" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1383119570 2614911895 2007 3-12-738700-8 Mit Delphi-Klassen arbeiten Mit Delphi-Klassen arbeiten "Objektorientierte Programmierung mit Delphi ; 1" 1. Aufl., 7. Dr. "Stuttgart; Düsseldorf; Leipzig" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1345183631 2558227122 2007 "978-3-264-83667-7; 978-3-292-00406-2" Grundansprüche Grundansprüche "Mathbu.ch ; 7, Arbeitsheft mit CD-ROM" 3. Aufl., Nachdr. "Bern; Zug; [Stuttgart; Leipzig]" "Schulverl. blmv; Klett und Balmer; Klett" HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1345171080 2558197010 2007 "3-292-00407-1; 978-3-292-00407-9; 3-264-83668-8; 978-3-264-83668-4; 3-12-722274-2" "Mathbu.ch ; 7+, Arbeitsheft" 3. Aufl., Nachr. "Bern; Zug; [Stuttgart; Leipzig]" "Schulverlag blmv; Klett und Balmer; Klett" HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1345167091 2558187953 2006 "3-292-00246-X; 3-264-83396-4; 3-12-722292-0" "Mathbu.ch ; 9+, Arbeitsheft" 1. Aufl., Nachdr. "Bern; Zug; [Stuttgart; Leipzig]" "Schulverl. blmv; Klett und Balmer; Klett" HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1336148004 253698575X 2006 "3-292-00242-7; 978-3-292-00242-6; 3-264-83391-3; 978-3-264-83391-1" "Mathbu.ch ; 8+, Arbeitsheft" 2. Aufl., Nachdr. "Bern; Zug; [Stuttgart; Leipzig]" "Schulverl. blmv; Klett und Balmer; Klett" HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1335815600 2536216888 2006 3-264-83518-5 erweiterte Ansprüche erweiterte Ansprüche "Mathbu.ch ; 9+, Begleitband mit CD-ROM" "Bern; Zug; [Stuttgart; Leipzig]" "Schulverl. blmv; Klett und Balmer; Klett" HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1335815392 2536216314 2006 3-264-83395-6 Grundansprüche Grundansprüche "Mathbu.ch ; 9, Arbeitsheft" 1. Aufl., Nachdr. "Bern; Zug; [Stuttgart; Leipzig]" "Schulverl. blmv; Klett und Balmer; Klett" HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1335814752 2536214753 2006 "3-264-83394-8; 978-3-292-00244-0; 3-292-00244-3" Mathematik im 9., Schuljahr Mathematik im 9., Schuljahr : Grundanforderungen "Mathbu.ch ; 9, Lernumgebungen" "Bern; Zug; [Stuttgart; Leipzig]" "Schulverl. blmv; Klett und Balmer; Klett" HB Mathematik Handbibliothek-HB Mathematik "DE-15; DE-Frei129"
|
||||
1335814612 2536214451 2006 3-264-83392-1 "Mathbu.ch ; 8, Begleitband mit CD-ROM" "Bern; Zug; [Stuttgart; Leipzig]" "Schulverl. blmv; Klett und Balmer; Klett" HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1335814515 2536214222 2006 3-264-83387-5 "Mathbu.ch ; 7, Begleitbuch mit CD-ROM" "Bern; Zug; [Stuttgart; Leipzig]" "Schulverl. blmv; Klett und Balmer; Klett" HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1335814434 253621396X 2006 3-264-83667-X Grundansprüche Grundansprüche "Mathbu.ch ; 7, Arbeitsheft mit CD-ROM" "Bern; Zug; [Stuttgart; Leipzig]" "Schulverl. blmv; Klett und Balmer; Klett" HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1437425755 2716852871 2005 3-12-741900-7 "Schnittpunkt. - Baden-Württemberg ; 9, [Hauptbd.]" "1. Aufl.; 10. Dr." "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
133410400X 2532354771 2005 3-12-746351-0 "Einblicke Mathematik. - Baden-Württemberg, [Neubearb. 2004] ; 1,[Schülerbuch]" 1. Aufl., 2. Dr. "Stuttgart; Düsseldorf; Leipzig" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1171165757 2417714906 2002 3-12-745770-7 "Einblicke Mathematik. - [Baden-Württemberg] ; 9, [Hauptband]" 1. Aufl., 3. Dr. "Stuttgart; Leipzig; Düsseldorf" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
117039745X 241560612X 2002 3-12-745570-4 "Einblicke Mathematik. - [Baden-Württemberg] ; 7, [Hauptband]" 1. Aufl., 3. Dr., Euro-Ausg. "Stuttgart; Leipzig; Düsseldorf" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1170397271 2415605743 2002 3-12-745470-8 "Einblicke Mathematik. - [Baden-Württemberg] ; 6, [Hauptbd.]" 1. Aufl., 2. Dr., Euro-Ausg. "Stuttgart; Leipzig; Düsseldorf" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1170397220 2415605670 2002 3-12-745473-2 "Einblicke Mathematik. - [Baden-Württemberg] ; 6, Lehrerbd." 1. Aufl., 2. Dr., Euro-Ausg. "Stuttgart; Leipzig; Düsseldorf" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1170397115 2415605344 2002 3-12-745370-1 "Einblicke Mathematik. - [Baden-Württemberg] ; 5, [Schulerbuch]" 1. Aufl., 3. [Dr.] - 2002. "Stuttgart; Leipzig; Düsseldorf" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1170396860 2415604798 2001 3-12-740600-2 1. Aufl., 9. Dr., Euro-Ausg 1. Aufl., 9. Dr., Euro-Ausg "Schnittpunkt. - Baden-Württemberg ; 6, [Hauptbd.]" "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1140921347 2340571510 1998 3-12-199520-0 "Das Zahlenbuch. - Ziffern in Schulausgangsschrift, Rechtschreibreform ; 2, [Hauptbd.]" 1. Aufl., 3. [Dr.], Rechtschreibreform. "Leipzig; Stuttgart" Klett-Grundschulverl. HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1136291431 2621854281 1997 3-12-741903-1 "Schnittpunkt. - Baden-Württemberg ; 9, [Lehrerbd.]" 1. Aufl., 2. [Dr.]. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1132493889 2316584683 1997 3-12-200029-6 "Das Zahlenbuch. - [Allgemeine Ausgabe] ; 2, Lehrerband" 1. Aufl., 3. [Dr.] - 1997. "Stuttgart; Leipzig" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1132096022 2621840833 1997 3-12-200121-7 "Das Zahlenbuch. - [Allgemeine Ausgabe] ; 2, Ubungsheft" 1. Aufl., [Nachdr.], Rechtschreibreform. "Stuttgart; Leipzig" Klett HB Mathematik Handbibliothek-HB Mathematik "DE-14; DE-Frei129"
|
||||
1132095956 2315252504 1997 3-12-200111-X "Das Zahlenbuch. - [Allgemeine Ausgabe] ; 1, Ubungsheft" 1. Aufl., [Nachdr.], Rechtschreibreform. "Stuttgart; Leipzig" Klett HB Mathematik Handbibliothek-HB Mathematik "DE-14; DE-Frei129"
|
||||
1129899047 2307920722 1997 3-12-743470-7 "Einblicke Mathematik ; 8, [Hauptbd.]" 1. Aufl., 3. [Dr.] - 1997. "Stuttgart; Leipzig" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
115955224X 2390549977 1996 3-12-718733-5 Tabellenkalkulation/Diagramme Tabellenkalkulation/Diagramme "Grundbildung mit Works ; Arbeitsheft" 1. Aufl. "Stuttgart; Leipzig" Klett HB Mathematik Handbibliothek-HB Mathematik DE-Frei129
|
||||
1619392496 3224445351 1988 3-476-50033-0 Wahrscheinlichkeitsrechnung Wahrscheinlichkeitsrechnung : (für Grundkurse) Stuttgart Metzler SM 330 A467 SM 330 A467 Handbibliothek-HB Mathematik DE-Frei129
|
||||
186890613 3251800515 1992 3-12-722310-2 Eigenmann, Paul Geometrische Denkaufgaben Geometrische Denkaufgaben 1. Aufl., [6. Dr.] Stuttgart Klett SM 613 E34 SM 613 E34 Handbibliothek-HB Mathematik "DE-8; DE-27; DE-547; DE-7; DE-3; DE-Au3; DE-291-406; DE-14; DE-Frei129"
|
||||
1111187592 2239264977 1992 3-12-711010-3 2025-10-07 00:00:00 2025-10-07 00:00:00 "Mathematikaufgaben ; [Sekundarstufe I]" 1. Aufl., 3. [Dr.]. Stuttgart Klett SM 700 S354 -1 SM 700 S354 -1 Handbibliothek-HB Mathematik "DE-Ch1; DE-Frei129; DE-105"
|
||||
511093446 3250676462 2006 "978-3-12-199071-9; 3-12-199071-3" "Spiegel, Hartmut *1944-* ; ID: gnd/124936857" Spiegeln mit dem Spiegel Spiegeln mit dem Spiegel 2. Aufl., 10. [Dr.], reformierte Rechtschreibung "Leipzig; Stuttgart [u.a.]" Klett-Grundschulverl. SM 770 S755 (2) SM 770 S755 (2) Handbibliothek-HB Mathematik "DE-3; DE-3; DE-Luen4; DE-Au3; DE-517; DE-517; DE-517; DE-517; DE-517; DE-517; DE-517; DE-517; DE-Frei129"
|
||||
1115862618 2257799852 1995 3-12-199091-8 Vom Einspluseins zum Einmaleins Vom Einspluseins zum Einmaleins "Handbuch produktiver Rechenübungen ; 1" 2. überarb. Aufl., 8. [Dr.]. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. SM 770 W832 -1(2)*... SM 770 W832 -1(2)*... Handbibliothek-HB Mathematik "DE-15; DE-Frei129"
|
||||
1125722584 2294093267 1996 3-12-199092-6 Vom halbschriftlichen zum schriftlichen Rechnen Vom halbschriftlichen zum schriftlichen Rechnen "Handbuch produktiver Rechenübungen ; 2" 1. Aufl., [4. Dr.]. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. SM 770 W832 -2*... SM 770 W832 -2*... Handbibliothek-HB Mathematik DE-Frei129
|
||||
1117395707 2263829490 1995 3-12-199092-6 Vom halbschriftlichen zum schriftlichen Rechnen Vom halbschriftlichen zum schriftlichen Rechnen "Handbuch produktiver Rechenübungen ; 2" 1. Aufl., 3. [Dr.]. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. SM 770 W832 -2*... SM 770 W832 -2*... Handbibliothek-HB Mathematik "DE-15; DE-Frei129"
|
||||
1406154938 2660968497 2009 3-12-200430-5 "Das Zahlenbuch. - [Neubearb.] ; 3, [Schulerb.]" "1. Aufl.; [Nachdr.]" "Leipzig; Stuttgart; Düsseldorf" Klett Grundschulverl. HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1406156841 2660973954 2008 3-12-200420-8 "Das Zahlenbuch. - [Neubearb.] ; 2, [Schulerb.]" 1. Aufl., [Nachdr.] "Leipzig; Stuttgart; Düsseldorf" Klett Grundschulverl. HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1346885648 2562415612 2007 3-12-200440-2 "Das Zahlenbuch. - [Neubearb.] ; 4, [Schülerbd.]" 1. Aufl., 3. Dr. "Leipzig; Stuttgart; Düsseldorf" Klett Grundschulverl. HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1346884897 2562414446 2007 3-12-200420-8 "Das Zahlenbuch. - [Neubearb.] ; 2, [Schulerb.]" 1. Aufl., 6. Dr. "Leipzig; Stuttgart; Düsseldorf" Klett Grundschulverl. HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1346884420 2562413717 2007 3-12-200410-0 "Das Zahlenbuch. - [Neubearb.] ; 1, [Schulerb.]" 1. Aufl., 6. Dr. "Leipzig; Stuttgart; Düsseldorf" Klett Grundschulverl. HB Projekt Leuders Handbibliothek-HB Projekt Leuders "DE-15; DE-Frei129"
|
||||
1346875685 2562396359 2007 3-12-200449-6 "Das Zahlenbuch. - [Neubearb.] ; 4, Lehrerbd." 1. Aufl., Dr. 3 "Leipzig; Stuttgart; Düsseldorf" Klett Grundschulverl. HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1346863741 2562365917 2007 3-12-720240-7 "Mathe live ; 8, [Schulerbd.]" 1. Aufl., Dr. 6 "Stuttgart; Düsseldorf; Leipzig" Klett HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1346885168 2562414934 2006 3-12-200430-5 "Das Zahlenbuch. - [Neubearb.] ; 3, [Schulerb.]" 1. Aufl., 2. Dr. "Leipzig; Stuttgart; Düsseldorf" Klett Grundschulverl. HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1346878110 2562400771 2006 3-12-720263-6 "Mathe live ; 9, Grundkurs, Lehrerbd." 1. Aufl., 2. Dr. "Stuttgart; Düsseldorf; Leipzig" Klett HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1346864519 2562367499 2006 3-12-720280-6 "Mathe live ; 10, Grundkurs, [Schulerbd.]" 1. Aufl., 3. Dr. "Stuttgart; Düsseldorf; Leipzig" Klett HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1346864314 2562367235 2006 3-12-720250-4 "Mathe live ; 9, Erweiterungskurs, [Hauptbd.]" 1. Aufl., 4. Dr. "Stuttgart; Düsseldorf; Leipzig" Klett HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1346880174 2562405307 2005 3-12-720273-3 "Mathe live ; 10, Erweiterungskurs, Lehrerbd." 1. Aufl., 2. Dr. "Stuttgart; Düsseldorf; Leipzig" Klett HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1346865124 2562368452 2005 3-12-720270-9 "Mathe live ; 10, Erweiterungskurs [Hauptbd.]" 1. Aufl., 3. Dr. "Stuttgart; Düsseldorf; Leipzig" Klett HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1346864195 2562367103 2004 3-12-720260-1 "Mathe live ; 9, Grundkurs, [Hauptbd.]" 1. Aufl., 2. Dr. "Stuttgart; Düsseldorf; Leipzig" Klett HB Projekt Leuders Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
134443875X 2562411579 2007 3-12-199091-8 Vom Einspluseins zum Einmaleins Vom Einspluseins zum Einmaleins "Handbuch produktiver Rechenübungen ; 1" 2., überar. Aufl., 20. Dr. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. SM 770 W832 -1(2) SM 770 W832 -1(2) Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1325328952 2562412486 2005 3-12-199092-6 Vom halbschriftlichen zum schriftlichen Rechnen Vom halbschriftlichen zum schriftlichen Rechnen "Handbuch produktiver Rechenübungen ; 2" 1. Aufl., 13. Dr. "Stuttgart; Düsseldorf; Berlin; Leipzig" Klett-Schulbuchverl. SM 770 W832 -2*... SM 770 W832 -2*... Handbibliothek-HB Projekt Leuders DE-Frei129
|
||||
1606834428 3123897893 2006 "3-421-05147-X; 978-3-421-05147-9" Gedichte fürs Gedächtnis Gedichte fürs Gedächtnis : zum Inwendig-Lernen und Auswendig-Sagen 17. Aufl. Stuttgart Dt. Verl.-Anst. GE 6733 H148 (17) GE 6733 H148 (17) Handbibliothek-HB Sprecherziehung "DE-Hil6; DE-Frei129"
|
||||
1112381503 2244210820 1992 3-12-755130-4 Klassenstufe 5/6 Klassenstufe 5/6 "Elementare Technik. - Ausgabe Baden-Württemberg ; 1, Lehrerinformationen" [Neubearb.], 1. Aufl., 3. Dr Stuttgart Klett ZG 9000 B865 L -1 ZG 9000 B865 L -1 Handbibliothek-HB Technik DE-Frei129
|
||||
1119749603 2272812198 1991 3-12-755230-0 Klassenstufe 7/8 Klassenstufe 7/8 "Elementare Technik. - Ausgabe Baden-Württemberg ; 2, Lehrerinformationen" [Neubearb.], 1. Aufl., 2. Dr. Stuttgart Klett Handbibliothek-HB Technik DE-Frei129
|
||||
1187641863 2608584128 1991 "Fippinger, Franz *1932-2013* ; ID: gnd/122845536" Allgemeiner Schulleistungstest für 3. Klassen Allgemeiner Schulleistungstest für 3. Klassen : AST 3 2., völlig neu bearb. Aufl. Weinheim [u.a.] Beltz CT 4000 F521 (2) CT 4000 F521 (2) Handbibliothek-HB Testbibliothek Psychologie "DE-291; DE-291-187; DE-Frei129; DE-L245"
|
||||
1154423956 2608583431 1991 Mannheimer Schuleingangs-Diagnostikum "Mannheimer Schuleingangs-Diagnostikum : MSD; Anleitung zur Durchführung, Auswertung, Interpretation und Förderung" 3., überarb. Aufl. Weinheim [u.a.] Beltz CT 4000 J22 (3) CT 4000 J22 (3) Handbibliothek-HB Testbibliothek Psychologie "DE-14; DE-Frei129"
|
||||
137992846X 2608551327 2003 "Grissemann, Hans *1924-2002* ; ID: gnd/132495317" Antwortbl Antwortbl "Zürcher Leseverständnistest ZLVT / Grissemann, Hans *1924-2002* ; ID: gnd/132495317 ; (Antw 2)" Nachdr. d. 2. Aufl. "Bern; Stuttgart; Toronto" Huber CT 4000 G869 Z(2) CT 4000 G869 Z(2) Handbibliothek-HB Testbibliothek Psychologie DE-Frei129
|
||||
1669128288 3497552690 2005 978-3-925206-09-2 "Temel Türkçe ; 6,[Arbeitsbuch]" "Oberhausen; Hückelhoven" "Ortado?u; Anadolu" Büro Kalkavan-Aydin Büro Kalkavan-Aydin o.A. DE-Frei129
|
||||
1350661554 2785707117 1919 5. Schuljahr 5. Schuljahr : Heft 2 "Rechenbuch für badische Volks- und Mittelschulen ; 5" Bühl Konkordia MA 14/833,1 MA 14/833,1 DE-Frei129
|
||||
1350661295 2785706986 1919 4. Schuljahr 4. Schuljahr : Heft 1 "Rechenbuch für badische Volks- und Mittelschulen ; 4" Bühl Konkordia MA 14/833,1 MA 14/833,1 DE-Frei129
|
||||
1350661007 2785706838 1919 3. Schuljahr 3. Schuljahr "Rechenbuch für badische Volks- und Mittelschulen ; 3" Neubearb. Bühl Konkordia MA 14/833,1 MA 14/833,1 DE-Frei129
|
||||
1350660787 278570665X 1919 2. Schuljahr 2. Schuljahr "Rechenbuch für badische Volks- und Mittelschulen ; 2" Neubearb. Bühl Konkordia MA 14/833,1 MA 14/833,1 DE-Frei129
|
||||
1472113039 2785708792 1919 8. Schuljahr 8. Schuljahr : Heft 5 "Rechenbuch für badische Volks- und Mittelschulen ; 8" Neubearb. Bühl Konkordia MA 14/833,2 MA 14/833,2 DE-Frei129
|
||||
1472112938 2785708741 1919 7. Schuljahr 7. Schuljahr : Heft 4 "Rechenbuch für badische Volks- und Mittelschulen ; 7" Neubearb. Bühl Konkordia MA 14/833,2 MA 14/833,2 DE-Frei129
|
||||
1442476168 2009 "978-3-936318-80-7; 978-3-87125-753-7" Paffe, Markus Grundlehrgang Grundlehrgang : Arbeitsbuch mit praktischen Übungen und projektbezogenen Aufgaben "Steuern mit der LOGO! ; 1" 3., überarb. Aufl. "Duderstadt; Konstanz" "EPV, Elektronik-Praktiker-Verl.-Ges.; Christiani" DE-31
|
||||
385300972 2004 3-926642-35-1 "Fischer, Klaus *1949-* ; ID: gnd/121192369" Einstein Einstein Orig.-Ausg. "Freiburg im Breisgau; Basel; Wien" Herder "DE-84; DE-Wim2; DE-33; DE-Stg117; DE-Zi4; DE-Mh34; DE-D210"
|
||||
376911352 2004 3-937252-13-4 Bertsch, Susan Die tolle Knolle Die tolle Knolle : fächerübergreifende Unterrichtsmappe rund um die Kartoffel 3. überarb. und erw. Aufl. Neuried Care-Line "DE-115; DE-115; DE-H155; DE-Lg1"
|
||||
1620196271 2001 3-89111-165-7 "Winkler, Gerhard *1955-* ; ID: gnd/122736788" Bewerbungsunterlagen Bewerbungsunterlagen : gut, besser, am besten oder wie man seine Unterlagen ständig optimiert 2. Aufl. Lichtenau AOL-Verl.
|
||||
1173439390 2000 "Sozialdienst Katholischer Frauen$bReferat Kinder- und Jugendhilfe ; ID: gnd/5254118-6" Tagespflege für Kinder - eine Herausforderung für die katholische Kirche, die Caritas und ihre Fachverbände Tagespflege für Kinder - eine Herausforderung für die katholische Kirche, die Caritas und ihre Fachverbände Freiburg Dt. Caritasverb. "DE-Frei26; DE-Frei26; DE-Frei26"
|
||||
1164313819 2000 3-89312-560-4 Industrialisierung Industrialisierung "I love Geschichte ; 3" 5. Aufl. Lichtenau Freiarbeit-Verl. DE-Hb6
|
||||
1125422459 1997 3-89111-355-2 Grimm, Helga Pflanzen, Tiere, Welt entdecken Pflanzen, Tiere, Welt entdecken "... und weiter geht's mit allen Sinnen / Grimm, Helga ; 2" 2. Aufl. Lichtenau AOL-Verlag "DE-15; DE-He76"
|
||||
1112396470 4317499576 1993 3-89312-631-7 "Lück, Eckhard *1953-* ; ID: gnd/122905059" Alltagsphysik - oder: warum ist der Himmel blau? Alltagsphysik - oder: warum ist der Himmel blau? [2. Aufl.] Lichtenau Freiarbeit-Verl. DE-Frei129
|
||||
14786996X 1993 3-89085-494-X "Janus, Ludwig *1939-* ; ID: gnd/129005053" Die Psychoanalyse der vorgeburtlichen Lebenszeit und der Geburt Die Psychoanalyse der vorgeburtlichen Lebenszeit und der Geburt 3. Aufl. Pfaffenweiler Centaurus-Verl.-Ges. "DE-18; DE-18-302; DE-Luen4; DE-He76"
|
||||
1623349451 1985 3-7806-0224-5 "Steinwede, Dietrich *1930-* ; ID: gnd/120515199" Jesus aus Nazareth Jesus aus Nazareth : ein Sachbilderbuch "Lahr; Düsseldorf" "Kaufmann; Patmos-Verl." "DE-291-348; DE-L245; DE-He134"
|
||||
1408218046 2665633574 2008 "978-3-12-581140-9; 978-3-12-581240-6" "Red Line ; 4, [Schülerb.]" 1. Aufl. "Stuttgart; Leipzig" Klett Fre O 150: 2,4 Fre O 150: 2,4 DE-Frei129
|
||||
1160677425 2790826552 1955 Neutestamentliche Texte für die Mittelstufe Neutestamentliche Texte für die Mittelstufe "Arbeitshilfe für die evangelische Unterweisung ; 2,2" 2. Aufl. Möckmühl Aue-Verl. MA 14/1471,2 MA 14/1471,2 "DE-15; DE-Frei129; DE-Due72"
|
||||
142232429X 2824310278 1991 3-12-194401-0 1. Aufl., 3. [Dr.] 1. Aufl., 3. [Dr.] "Unser Rechenbuch Nußknacker. - Ausg. A, Regionalausgabe 2 (Baden-Württemberg) ; 4" Stuttgart Klett Math O 200: 33 ,4 Math O 200: 33 ,4 DE-Frei129
|
||||
1444874799 3816572537 2009 978-3-12-588060-3 "Playway. - Ausg. für Deutschland ; 4, Pupil's book" 2. Aufl. "Rum/Innsbruck; Stuttgart" "Helbling; Klett" DE-Frei129
|
||||
162249878X 2006 3-938538-03-1 Lösungen zu den Klassenarbeits- und Abiturprüfungsaufgaben im Leistungskurs VBRW Lösungen zu den Klassenarbeits- und Abiturprüfungsaufgaben im Leistungskurs VBRW : [Volkswirtschaftslehre, Betriebswirtschaftslehre mit Wirtschaftlichem Rechnungswesen] 49., durchges. u. erw. Aufl. mit der Abiturprüfung 2006 Schwäbisch Gmünd Bahnmayer
|
||||
1622498704 2006 3-938538-02-3 Klassenarbeits- und Abiturprüfungsaufgaben im Leistungskurs VBRW Klassenarbeits- und Abiturprüfungsaufgaben im Leistungskurs VBRW : [Volkswirtschaftslehre, Betriebswirtschaftslehre mit Wirtschaftlichem Rechnungswesen] 49., durchges. u. erw. Aufl. mit der Abiturprüfung Schwäbisch Gmünd Bahnmayer
|
||||
1169532381 2001 3-7751-3389-5 Israel Israel "Israel ; Buch" 4. Aufl. Holzgerlingen Hänssler DE-Kon7
|
||||
1618066382 2000 3-12-925652-0 "Ader, Wolfgang ; ID: gnd/1137268425" Stundenblätter Französische Kurzgeschichten Stundenblätter Französische Kurzgeschichten : Klasse 10 und 11 4. Aufl. "Stuttgart; Düsseldorf; Leipzig" Klett DE-Rtw2
|
||||
1393619347 3750215103 1997 Alsace Alsace "Régions de France - hier et aujourd'hui ; 1" Tübingen DIFF DE-Frei129
|
||||
1116769484 1978 Handreichungen zum Grundkurs: Der Mensch als Person Handreichungen zum Grundkurs: Der Mensch als Person Stuttgart Landesstelle für Erz. u. Unterr. DE-Rtw2
|
||||
569
uv.lock
generated
569
uv.lock
generated
@@ -2,6 +2,28 @@ version = 1
|
||||
revision = 3
|
||||
requires-python = ">=3.13"
|
||||
|
||||
[[package]]
|
||||
name = "astroid"
|
||||
version = "4.0.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/b7/22/97df040e15d964e592d3a180598ace67e91b7c559d8298bdb3c949dc6e42/astroid-4.0.2.tar.gz", hash = "sha256:ac8fb7ca1c08eb9afec91ccc23edbd8ac73bb22cbdd7da1d488d9fb8d6579070", size = 405714, upload-time = "2025-11-09T21:21:18.373Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/93/ac/a85b4bfb4cf53221513e27f33cc37ad158fce02ac291d18bee6b49ab477d/astroid-4.0.2-py3-none-any.whl", hash = "sha256:d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b", size = 276354, upload-time = "2025-11-09T21:21:16.54Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "beautifulsoup4"
|
||||
version = "4.14.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "soupsieve" },
|
||||
{ name = "typing-extensions" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bibapi"
|
||||
version = "0.1.0"
|
||||
@@ -11,64 +33,113 @@ dependencies = [
|
||||
{ name = "requests" },
|
||||
]
|
||||
|
||||
[package.optional-dependencies]
|
||||
all = [
|
||||
{ name = "beautifulsoup4" },
|
||||
{ name = "requests" },
|
||||
]
|
||||
catalogue = [
|
||||
{ name = "beautifulsoup4" },
|
||||
{ name = "requests" },
|
||||
]
|
||||
sru = [
|
||||
{ name = "requests" },
|
||||
]
|
||||
webrequest = [
|
||||
{ name = "beautifulsoup4" },
|
||||
{ name = "ratelimit" },
|
||||
{ name = "requests" },
|
||||
]
|
||||
|
||||
[package.dev-dependencies]
|
||||
test = [
|
||||
dev = [
|
||||
{ name = "beautifulsoup4" },
|
||||
{ name = "mypy" },
|
||||
{ name = "pylint" },
|
||||
{ name = "pytest" },
|
||||
{ name = "pytest-cov" },
|
||||
{ name = "pytest-mock" },
|
||||
{ name = "ratelimit" },
|
||||
{ name = "types-pysocks" },
|
||||
{ name = "types-regex" },
|
||||
{ name = "types-requests" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
requires-dist = [
|
||||
{ name = "beautifulsoup4", marker = "extra == 'catalogue'", specifier = ">=4.12.0" },
|
||||
{ name = "bibapi", extras = ["catalogue"], marker = "extra == 'webrequest'" },
|
||||
{ name = "bibapi", extras = ["sru", "catalogue"], marker = "extra == 'all'" },
|
||||
{ name = "ratelimit", marker = "extra == 'webrequest'", specifier = ">=2.2.0" },
|
||||
{ name = "regex", specifier = ">=2025.9.18" },
|
||||
{ name = "requests", specifier = ">=2.32.5" },
|
||||
{ name = "requests", marker = "extra == 'catalogue'", specifier = ">=2.32.5" },
|
||||
{ name = "requests", marker = "extra == 'sru'", specifier = ">=2.32.5" },
|
||||
]
|
||||
provides-extras = ["sru", "catalogue", "webrequest", "all"]
|
||||
|
||||
[package.metadata.requires-dev]
|
||||
test = [
|
||||
dev = [
|
||||
{ name = "beautifulsoup4", specifier = ">=4.12.0" },
|
||||
{ name = "mypy", specifier = ">=1.18.2" },
|
||||
{ name = "pylint", specifier = ">=4.0.3" },
|
||||
{ name = "pytest", specifier = ">=8.4.2" },
|
||||
{ name = "pytest-cov", specifier = ">=7.0.0" },
|
||||
{ name = "pytest-mock", specifier = ">=3.15.1" },
|
||||
{ name = "ratelimit", specifier = ">=2.2.0" },
|
||||
{ name = "types-pysocks", specifier = ">=1.7.1.20251001" },
|
||||
{ name = "types-regex", specifier = ">=2025.9.18.20250921" },
|
||||
{ name = "types-requests", specifier = ">=2.32.4.20250913" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "certifi"
|
||||
version = "2025.10.5"
|
||||
version = "2025.11.12"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/4c/5b/b6ce21586237c77ce67d01dc5507039d444b630dd76611bbca2d8e5dcd91/certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43", size = 164519, upload-time = "2025-10-05T04:12:15.808Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "charset-normalizer"
|
||||
version = "3.4.3"
|
||||
version = "3.4.4"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -82,63 +153,72 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "coverage"
|
||||
version = "7.10.7"
|
||||
version = "7.13.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/b6/45/2c665ca77ec32ad67e25c77daf1cee28ee4558f3bc571cdbaf88a00b9f23/coverage-7.13.0.tar.gz", hash = "sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936", size = 820905, upload-time = "2025-12-08T13:14:38.055Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload-time = "2025-09-21T20:01:56.629Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload-time = "2025-09-21T20:01:58.203Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload-time = "2025-09-21T20:01:59.748Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload-time = "2025-09-21T20:02:01.192Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload-time = "2025-09-21T20:02:02.701Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload-time = "2025-09-21T20:02:04.185Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload-time = "2025-09-21T20:02:06.034Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload-time = "2025-09-21T20:02:07.619Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload-time = "2025-09-21T20:02:10.34Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload-time = "2025-09-21T20:02:12.122Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload-time = "2025-09-21T20:02:13.919Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload-time = "2025-09-21T20:02:15.57Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload-time = "2025-09-21T20:02:17.395Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload-time = "2025-09-21T20:02:18.936Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload-time = "2025-09-21T20:02:20.44Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload-time = "2025-09-21T20:02:22.313Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload-time = "2025-09-21T20:02:24.287Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload-time = "2025-09-21T20:02:26.133Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload-time = "2025-09-21T20:02:27.716Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload-time = "2025-09-21T20:02:29.216Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload-time = "2025-09-21T20:02:31.226Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload-time = "2025-09-21T20:02:32.823Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload-time = "2025-09-21T20:02:34.86Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload-time = "2025-09-21T20:02:37.034Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload-time = "2025-09-21T20:02:39.011Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload-time = "2025-09-21T20:02:40.939Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload-time = "2025-09-21T20:02:42.527Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload-time = "2025-09-21T20:02:44.468Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload-time = "2025-09-21T20:02:46.503Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload-time = "2025-09-21T20:02:48.689Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload-time = "2025-09-21T20:02:50.31Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload-time = "2025-09-21T20:02:51.971Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload-time = "2025-09-21T20:02:53.858Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload-time = "2025-09-21T20:02:55.807Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload-time = "2025-09-21T20:02:57.784Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload-time = "2025-09-21T20:02:59.431Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload-time = "2025-09-21T20:03:01.324Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload-time = "2025-09-21T20:03:03.4Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload-time = "2025-09-21T20:03:05.111Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload-time = "2025-09-21T20:03:06.795Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload-time = "2025-09-21T20:03:08.495Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload-time = "2025-09-21T20:03:10.172Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload-time = "2025-09-21T20:03:11.861Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload-time = "2025-09-21T20:03:13.539Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload-time = "2025-09-21T20:03:15.584Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload-time = "2025-09-21T20:03:17.673Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload-time = "2025-09-21T20:03:19.36Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload-time = "2025-09-21T20:03:21.007Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload-time = "2025-09-21T20:03:23.12Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload-time = "2025-09-21T20:03:24.769Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload-time = "2025-09-21T20:03:26.93Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload-time = "2025-09-21T20:03:28.672Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7c/cc/bce226595eb3bf7d13ccffe154c3c487a22222d87ff018525ab4dd2e9542/coverage-7.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf", size = 218297, upload-time = "2025-12-08T13:13:10.977Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3b/9f/73c4d34600aae03447dff3d7ad1d0ac649856bfb87d1ca7d681cfc913f9e/coverage-7.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a", size = 218673, upload-time = "2025-12-08T13:13:12.562Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/63/ab/8fa097db361a1e8586535ae5073559e6229596b3489ec3ef2f5b38df8cb2/coverage-7.13.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74", size = 249652, upload-time = "2025-12-08T13:13:13.909Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/90/3a/9bfd4de2ff191feb37ef9465855ca56a6f2f30a3bca172e474130731ac3d/coverage-7.13.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6", size = 252251, upload-time = "2025-12-08T13:13:15.553Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/df/61/b5d8105f016e1b5874af0d7c67542da780ccd4a5f2244a433d3e20ceb1ad/coverage-7.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b", size = 253492, upload-time = "2025-12-08T13:13:16.849Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f3/b8/0fad449981803cc47a4694768b99823fb23632150743f9c83af329bb6090/coverage-7.13.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232", size = 249850, upload-time = "2025-12-08T13:13:18.142Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9a/e9/8d68337c3125014d918cf4327d5257553a710a2995a6a6de2ac77e5aa429/coverage-7.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971", size = 251633, upload-time = "2025-12-08T13:13:19.56Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/55/14/d4112ab26b3a1bc4b3c1295d8452dcf399ed25be4cf649002fb3e64b2d93/coverage-7.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d", size = 249586, upload-time = "2025-12-08T13:13:20.883Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2c/a9/22b0000186db663b0d82f86c2f1028099ae9ac202491685051e2a11a5218/coverage-7.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137", size = 249412, upload-time = "2025-12-08T13:13:22.22Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a1/2e/42d8e0d9e7527fba439acdc6ed24a2b97613b1dc85849b1dd935c2cffef0/coverage-7.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511", size = 251191, upload-time = "2025-12-08T13:13:23.899Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a4/af/8c7af92b1377fd8860536aadd58745119252aaaa71a5213e5a8e8007a9f5/coverage-7.13.0-cp313-cp313-win32.whl", hash = "sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1", size = 220829, upload-time = "2025-12-08T13:13:25.182Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/58/f9/725e8bf16f343d33cbe076c75dc8370262e194ff10072c0608b8e5cf33a3/coverage-7.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a", size = 221640, upload-time = "2025-12-08T13:13:26.836Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8a/ff/e98311000aa6933cc79274e2b6b94a2fe0fe3434fca778eba82003675496/coverage-7.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6", size = 220269, upload-time = "2025-12-08T13:13:28.116Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cf/cf/bbaa2e1275b300343ea865f7d424cc0a2e2a1df6925a070b2b2d5d765330/coverage-7.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a", size = 218990, upload-time = "2025-12-08T13:13:29.463Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/21/1d/82f0b3323b3d149d7672e7744c116e9c170f4957e0c42572f0366dbb4477/coverage-7.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8", size = 219340, upload-time = "2025-12-08T13:13:31.524Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fb/e3/fe3fd4702a3832a255f4d43013eacb0ef5fc155a5960ea9269d8696db28b/coverage-7.13.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053", size = 260638, upload-time = "2025-12-08T13:13:32.965Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ad/01/63186cb000307f2b4da463f72af9b85d380236965574c78e7e27680a2593/coverage-7.13.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071", size = 262705, upload-time = "2025-12-08T13:13:34.378Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7c/a1/c0dacef0cc865f2455d59eed3548573ce47ed603205ffd0735d1d78b5906/coverage-7.13.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e", size = 265125, upload-time = "2025-12-08T13:13:35.73Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ef/92/82b99223628b61300bd382c205795533bed021505eab6dd86e11fb5d7925/coverage-7.13.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493", size = 259844, upload-time = "2025-12-08T13:13:37.69Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cf/2c/89b0291ae4e6cd59ef042708e1c438e2290f8c31959a20055d8768349ee2/coverage-7.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0", size = 262700, upload-time = "2025-12-08T13:13:39.525Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bf/f9/a5f992efae1996245e796bae34ceb942b05db275e4b34222a9a40b9fbd3b/coverage-7.13.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e", size = 260321, upload-time = "2025-12-08T13:13:41.172Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4c/89/a29f5d98c64fedbe32e2ac3c227fbf78edc01cc7572eee17d61024d89889/coverage-7.13.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c", size = 259222, upload-time = "2025-12-08T13:13:43.282Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b3/c3/940fe447aae302a6701ee51e53af7e08b86ff6eed7631e5740c157ee22b9/coverage-7.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e", size = 261411, upload-time = "2025-12-08T13:13:44.72Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/eb/31/12a4aec689cb942a89129587860ed4d0fd522d5fda81237147fde554b8ae/coverage-7.13.0-cp313-cp313t-win32.whl", hash = "sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46", size = 221505, upload-time = "2025-12-08T13:13:46.332Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/65/8c/3b5fe3259d863572d2b0827642c50c3855d26b3aefe80bdc9eba1f0af3b0/coverage-7.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39", size = 222569, upload-time = "2025-12-08T13:13:47.79Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b0/39/f71fa8316a96ac72fc3908839df651e8eccee650001a17f2c78cdb355624/coverage-7.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e", size = 220841, upload-time = "2025-12-08T13:13:49.243Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f8/4b/9b54bedda55421449811dcd5263a2798a63f48896c24dfb92b0f1b0845bd/coverage-7.13.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256", size = 218343, upload-time = "2025-12-08T13:13:50.811Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/59/df/c3a1f34d4bba2e592c8979f924da4d3d4598b0df2392fbddb7761258e3dc/coverage-7.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a", size = 218672, upload-time = "2025-12-08T13:13:52.284Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/07/62/eec0659e47857698645ff4e6ad02e30186eb8afd65214fd43f02a76537cb/coverage-7.13.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9", size = 249715, upload-time = "2025-12-08T13:13:53.791Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/23/2d/3c7ff8b2e0e634c1f58d095f071f52ed3c23ff25be524b0ccae8b71f99f8/coverage-7.13.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19", size = 252225, upload-time = "2025-12-08T13:13:55.274Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/aa/ac/fb03b469d20e9c9a81093575003f959cf91a4a517b783aab090e4538764b/coverage-7.13.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be", size = 253559, upload-time = "2025-12-08T13:13:57.161Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/29/62/14afa9e792383c66cc0a3b872a06ded6e4ed1079c7d35de274f11d27064e/coverage-7.13.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb", size = 249724, upload-time = "2025-12-08T13:13:58.692Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/31/b7/333f3dab2939070613696ab3ee91738950f0467778c6e5a5052e840646b7/coverage-7.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8", size = 251582, upload-time = "2025-12-08T13:14:00.642Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/81/cb/69162bda9381f39b2287265d7e29ee770f7c27c19f470164350a38318764/coverage-7.13.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b", size = 249538, upload-time = "2025-12-08T13:14:02.556Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e0/76/350387b56a30f4970abe32b90b2a434f87d29f8b7d4ae40d2e8a85aacfb3/coverage-7.13.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9", size = 249349, upload-time = "2025-12-08T13:14:04.015Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/86/0d/7f6c42b8d59f4c7e43ea3059f573c0dcfed98ba46eb43c68c69e52ae095c/coverage-7.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927", size = 251011, upload-time = "2025-12-08T13:14:05.505Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d7/f1/4bb2dff379721bb0b5c649d5c5eaf438462cad824acf32eb1b7ca0c7078e/coverage-7.13.0-cp314-cp314-win32.whl", hash = "sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f", size = 221091, upload-time = "2025-12-08T13:14:07.127Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ba/44/c239da52f373ce379c194b0ee3bcc121020e397242b85f99e0afc8615066/coverage-7.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc", size = 221904, upload-time = "2025-12-08T13:14:08.542Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/89/1f/b9f04016d2a29c2e4a0307baefefad1a4ec5724946a2b3e482690486cade/coverage-7.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b", size = 220480, upload-time = "2025-12-08T13:14:10.958Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/16/d4/364a1439766c8e8647860584171c36010ca3226e6e45b1753b1b249c5161/coverage-7.13.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28", size = 219074, upload-time = "2025-12-08T13:14:13.345Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ce/f4/71ba8be63351e099911051b2089662c03d5671437a0ec2171823c8e03bec/coverage-7.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe", size = 219342, upload-time = "2025-12-08T13:14:15.02Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5e/25/127d8ed03d7711a387d96f132589057213e3aef7475afdaa303412463f22/coverage-7.13.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657", size = 260713, upload-time = "2025-12-08T13:14:16.907Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fd/db/559fbb6def07d25b2243663b46ba9eb5a3c6586c0c6f4e62980a68f0ee1c/coverage-7.13.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff", size = 262825, upload-time = "2025-12-08T13:14:18.68Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/37/99/6ee5bf7eff884766edb43bd8736b5e1c5144d0fe47498c3779326fe75a35/coverage-7.13.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3", size = 265233, upload-time = "2025-12-08T13:14:20.55Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d8/90/92f18fe0356ea69e1f98f688ed80cec39f44e9f09a1f26a1bbf017cc67f2/coverage-7.13.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b", size = 259779, upload-time = "2025-12-08T13:14:22.367Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/90/5d/b312a8b45b37a42ea7d27d7d3ff98ade3a6c892dd48d1d503e773503373f/coverage-7.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d", size = 262700, upload-time = "2025-12-08T13:14:24.309Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/63/f8/b1d0de5c39351eb71c366f872376d09386640840a2e09b0d03973d791e20/coverage-7.13.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e", size = 260302, upload-time = "2025-12-08T13:14:26.068Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/aa/7c/d42f4435bc40c55558b3109a39e2d456cddcec37434f62a1f1230991667a/coverage-7.13.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940", size = 259136, upload-time = "2025-12-08T13:14:27.604Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b8/d3/23413241dc04d47cfe19b9a65b32a2edd67ecd0b817400c2843ebc58c847/coverage-7.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2", size = 261467, upload-time = "2025-12-08T13:14:29.09Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/13/e6/6e063174500eee216b96272c0d1847bf215926786f85c2bd024cf4d02d2f/coverage-7.13.0-cp314-cp314t-win32.whl", hash = "sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7", size = 221875, upload-time = "2025-12-08T13:14:31.106Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3b/46/f4fb293e4cbe3620e3ac2a3e8fd566ed33affb5861a9b20e3dd6c1896cbc/coverage-7.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc", size = 222982, upload-time = "2025-12-08T13:14:33.1Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/68/62/5b3b9018215ed9733fbd1ae3b2ed75c5de62c3b55377a52cae732e1b7805/coverage-7.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a", size = 221016, upload-time = "2025-12-08T13:14:34.601Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8d/4c/1968f32fb9a2604645827e11ff84a31e59d532e01995f904723b4f5328b3/coverage-7.13.0-py3-none-any.whl", hash = "sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904", size = 210068, upload-time = "2025-12-08T13:14:36.236Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dill"
|
||||
version = "0.4.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976, upload-time = "2025-04-16T00:41:48.867Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668, upload-time = "2025-04-16T00:41:47.671Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -152,37 +232,97 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "iniconfig"
|
||||
version = "2.1.0"
|
||||
version = "2.3.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "isort"
|
||||
version = "7.0.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/63/53/4f3c058e3bace40282876f9b553343376ee687f3c35a525dc79dbd450f88/isort-7.0.0.tar.gz", hash = "sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187", size = 805049, upload-time = "2025-10-11T13:30:59.107Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/7f/ed/e3705d6d02b4f7aea715a353c8ce193efd0b5db13e204df895d38734c244/isort-7.0.0-py3-none-any.whl", hash = "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1", size = 94672, upload-time = "2025-10-11T13:30:57.665Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "librt"
|
||||
version = "0.7.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/b3/d9/6f3d3fcf5e5543ed8a60cc70fa7d50508ed60b8a10e9af6d2058159ab54e/librt-0.7.3.tar.gz", hash = "sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798", size = 144549, upload-time = "2025-12-06T19:04:45.553Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/93/7d/e0ce1837dfb452427db556e6d4c5301ba3b22fe8de318379fbd0593759b9/librt-0.7.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed", size = 55742, upload-time = "2025-12-06T19:03:52.459Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/be/c0/3564262301e507e1d5cf31c7d84cb12addf0d35e05ba53312494a2eba9a4/librt-0.7.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc", size = 57163, upload-time = "2025-12-06T19:03:53.516Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/be/ac/245e72b7e443d24a562f6047563c7f59833384053073ef9410476f68505b/librt-0.7.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e", size = 165840, upload-time = "2025-12-06T19:03:54.918Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/98/af/587e4491f40adba066ba39a450c66bad794c8d92094f936a201bfc7c2b5f/librt-0.7.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5", size = 174827, upload-time = "2025-12-06T19:03:56.082Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/78/21/5b8c60ea208bc83dd00421022a3874330685d7e856404128dc3728d5d1af/librt-0.7.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055", size = 189612, upload-time = "2025-12-06T19:03:57.507Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/da/2f/8b819169ef696421fb81cd04c6cdf225f6e96f197366001e9d45180d7e9e/librt-0.7.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292", size = 184584, upload-time = "2025-12-06T19:03:58.686Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6c/fc/af9d225a9395b77bd7678362cb055d0b8139c2018c37665de110ca388022/librt-0.7.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910", size = 178269, upload-time = "2025-12-06T19:03:59.769Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6c/d8/7b4fa1683b772966749d5683aa3fd605813defffe157833a8fa69cc89207/librt-0.7.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093", size = 199852, upload-time = "2025-12-06T19:04:00.901Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/77/e8/4598413aece46ca38d9260ef6c51534bd5f34b5c21474fcf210ce3a02123/librt-0.7.3-cp313-cp313-win32.whl", hash = "sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe", size = 47936, upload-time = "2025-12-06T19:04:02.054Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/af/80/ac0e92d5ef8c6791b3e2c62373863827a279265e0935acdf807901353b0e/librt-0.7.3-cp313-cp313-win_amd64.whl", hash = "sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0", size = 54965, upload-time = "2025-12-06T19:04:03.224Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f1/fd/042f823fcbff25c1449bb4203a29919891ca74141b68d3a5f6612c4ce283/librt-0.7.3-cp313-cp313-win_arm64.whl", hash = "sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a", size = 48350, upload-time = "2025-12-06T19:04:04.234Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3e/ae/c6ecc7bb97134a71b5241e8855d39964c0e5f4d96558f0d60593892806d2/librt-0.7.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93", size = 55175, upload-time = "2025-12-06T19:04:05.308Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cf/bc/2cc0cb0ab787b39aa5c7645cd792433c875982bdf12dccca558b89624594/librt-0.7.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e", size = 56881, upload-time = "2025-12-06T19:04:06.674Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8e/87/397417a386190b70f5bf26fcedbaa1515f19dce33366e2684c6b7ee83086/librt-0.7.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207", size = 163710, upload-time = "2025-12-06T19:04:08.437Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c9/37/7338f85b80e8a17525d941211451199845093ca242b32efbf01df8531e72/librt-0.7.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f", size = 172471, upload-time = "2025-12-06T19:04:10.124Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3b/e0/741704edabbfae2c852fedc1b40d9ed5a783c70ed3ed8e4fe98f84b25d13/librt-0.7.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678", size = 186804, upload-time = "2025-12-06T19:04:11.586Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f4/d1/0a82129d6ba242f3be9af34815be089f35051bc79619f5c27d2c449ecef6/librt-0.7.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218", size = 181817, upload-time = "2025-12-06T19:04:12.802Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4f/32/704f80bcf9979c68d4357c46f2af788fbf9d5edda9e7de5786ed2255e911/librt-0.7.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620", size = 175602, upload-time = "2025-12-06T19:04:14.004Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f7/6d/4355cfa0fae0c062ba72f541d13db5bc575770125a7ad3d4f46f4109d305/librt-0.7.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e", size = 196497, upload-time = "2025-12-06T19:04:15.487Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2e/eb/ac6d8517d44209e5a712fde46f26d0055e3e8969f24d715f70bd36056230/librt-0.7.3-cp314-cp314-win32.whl", hash = "sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3", size = 44678, upload-time = "2025-12-06T19:04:16.688Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e9/93/238f026d141faf9958da588c761a0812a1a21c98cc54a76f3608454e4e59/librt-0.7.3-cp314-cp314-win_amd64.whl", hash = "sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010", size = 51689, upload-time = "2025-12-06T19:04:17.726Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/52/44/43f462ad9dcf9ed7d3172fe2e30d77b980956250bd90e9889a9cca93df2a/librt-0.7.3-cp314-cp314-win_arm64.whl", hash = "sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e", size = 44662, upload-time = "2025-12-06T19:04:18.771Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/1d/35/fed6348915f96b7323241de97f26e2af481e95183b34991df12fd5ce31b1/librt-0.7.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a", size = 57347, upload-time = "2025-12-06T19:04:19.812Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9a/f2/045383ccc83e3fea4fba1b761796584bc26817b6b2efb6b8a6731431d16f/librt-0.7.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a", size = 59223, upload-time = "2025-12-06T19:04:20.862Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/77/3f/c081f8455ab1d7f4a10dbe58463ff97119272ff32494f21839c3b9029c2c/librt-0.7.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f", size = 183861, upload-time = "2025-12-06T19:04:21.963Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/1d/f5/73c5093c22c31fbeaebc25168837f05ebfd8bf26ce00855ef97a5308f36f/librt-0.7.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e", size = 194594, upload-time = "2025-12-06T19:04:23.14Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/78/b8/d5f17d4afe16612a4a94abfded94c16c5a033f183074fb130dfe56fc1a42/librt-0.7.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e", size = 206759, upload-time = "2025-12-06T19:04:24.328Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/36/2e/021765c1be85ee23ffd5b5b968bb4cba7526a4db2a0fc27dcafbdfc32da7/librt-0.7.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70", size = 203210, upload-time = "2025-12-06T19:04:25.544Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/77/f0/9923656e42da4fd18c594bd08cf6d7e152d4158f8b808e210d967f0dcceb/librt-0.7.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712", size = 196708, upload-time = "2025-12-06T19:04:26.725Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fc/0b/0708b886ac760e64d6fbe7e16024e4be3ad1a3629d19489a97e9cf4c3431/librt-0.7.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42", size = 217212, upload-time = "2025-12-06T19:04:27.892Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5d/7f/12a73ff17bca4351e73d585dd9ebf46723c4a8622c4af7fe11a2e2d011ff/librt-0.7.3-cp314-cp314t-win32.whl", hash = "sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd", size = 45586, upload-time = "2025-12-06T19:04:29.116Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e2/df/8decd032ac9b995e4f5606cde783711a71094128d88d97a52e397daf2c89/librt-0.7.3-cp314-cp314t-win_amd64.whl", hash = "sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f", size = 53002, upload-time = "2025-12-06T19:04:30.173Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/de/0c/6605b6199de8178afe7efc77ca1d8e6db00453bc1d3349d27605c0f42104/librt-0.7.3-cp314-cp314t-win_arm64.whl", hash = "sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b", size = 45647, upload-time = "2025-12-06T19:04:31.302Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mccabe"
|
||||
version = "0.7.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mypy"
|
||||
version = "1.18.2"
|
||||
version = "1.19.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "librt" },
|
||||
{ name = "mypy-extensions" },
|
||||
{ name = "pathspec" },
|
||||
{ name = "typing-extensions" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846, upload-time = "2025-09-19T00:11:10.519Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/f9/b5/b58cdc25fadd424552804bf410855d52324183112aa004f0732c5f6324cf/mypy-1.19.0.tar.gz", hash = "sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528", size = 3579025, upload-time = "2025-11-28T15:49:01.26Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728, upload-time = "2025-09-19T00:10:01.33Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758, upload-time = "2025-09-19T00:10:42.607Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342, upload-time = "2025-09-19T00:11:00.371Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709, upload-time = "2025-09-19T00:11:03.358Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806, upload-time = "2025-09-19T00:10:26.073Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262, upload-time = "2025-09-19T00:10:40.035Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775, upload-time = "2025-09-19T00:10:03.814Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852, upload-time = "2025-09-19T00:10:51.631Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242, upload-time = "2025-09-19T00:11:07.955Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683, upload-time = "2025-09-19T00:09:55.572Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749, upload-time = "2025-09-19T00:10:44.827Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959, upload-time = "2025-09-19T00:10:37.344Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367, upload-time = "2025-09-19T00:10:15.489Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cb/0d/a1357e6bb49e37ce26fcf7e3cc55679ce9f4ebee0cd8b6ee3a0e301a9210/mypy-1.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e", size = 13191993, upload-time = "2025-11-28T15:47:22.336Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5d/75/8e5d492a879ec4490e6ba664b5154e48c46c85b5ac9785792a5ec6a4d58f/mypy-1.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d", size = 12174411, upload-time = "2025-11-28T15:44:55.492Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/71/31/ad5dcee9bfe226e8eaba777e9d9d251c292650130f0450a280aec3485370/mypy-1.19.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba", size = 12727751, upload-time = "2025-11-28T15:44:14.169Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/77/06/b6b8994ce07405f6039701f4b66e9d23f499d0b41c6dd46ec28f96d57ec3/mypy-1.19.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364", size = 13593323, upload-time = "2025-11-28T15:46:34.699Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/68/b1/126e274484cccdf099a8e328d4fda1c7bdb98a5e888fa6010b00e1bbf330/mypy-1.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee", size = 13818032, upload-time = "2025-11-28T15:46:18.286Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f8/56/53a8f70f562dfc466c766469133a8a4909f6c0012d83993143f2a9d48d2d/mypy-1.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53", size = 10120644, upload-time = "2025-11-28T15:47:43.99Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b0/f4/7751f32f56916f7f8c229fe902cbdba3e4dd3f3ea9e8b872be97e7fc546d/mypy-1.19.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d", size = 13185236, upload-time = "2025-11-28T15:45:20.696Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/35/31/871a9531f09e78e8d145032355890384f8a5b38c95a2c7732d226b93242e/mypy-1.19.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18", size = 12213902, upload-time = "2025-11-28T15:46:10.117Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/58/b8/af221910dd40eeefa2077a59107e611550167b9994693fc5926a0b0f87c0/mypy-1.19.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7", size = 12738600, upload-time = "2025-11-28T15:44:22.521Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/11/9f/c39e89a3e319c1d9c734dedec1183b2cc3aefbab066ec611619002abb932/mypy-1.19.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f", size = 13592639, upload-time = "2025-11-28T15:48:08.55Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/97/6d/ffaf5f01f5e284d9033de1267e6c1b8f3783f2cf784465378a86122e884b/mypy-1.19.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835", size = 13799132, upload-time = "2025-11-28T15:47:06.032Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fe/b0/c33921e73aaa0106224e5a34822411bea38046188eb781637f5a5b07e269/mypy-1.19.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1", size = 10269832, upload-time = "2025-11-28T15:47:29.392Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/09/0e/fe228ed5aeab470c6f4eb82481837fadb642a5aa95cc8215fd2214822c10/mypy-1.19.0-py3-none-any.whl", hash = "sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9", size = 2469714, upload-time = "2025-11-28T15:45:33.22Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -212,6 +352,15 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "platformdirs"
|
||||
version = "4.5.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pluggy"
|
||||
version = "1.6.0"
|
||||
@@ -230,9 +379,27 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pylint"
|
||||
version = "4.0.4"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "astroid" },
|
||||
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||
{ name = "dill" },
|
||||
{ name = "isort" },
|
||||
{ name = "mccabe" },
|
||||
{ name = "platformdirs" },
|
||||
{ name = "tomlkit" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/5a/d2/b081da1a8930d00e3fc06352a1d449aaf815d4982319fab5d8cdb2e9ab35/pylint-4.0.4.tar.gz", hash = "sha256:d9b71674e19b1c36d79265b5887bf8e55278cbe236c9e95d22dc82cf044fdbd2", size = 1571735, upload-time = "2025-11-30T13:29:04.315Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/a6/92/d40f5d937517cc489ad848fc4414ecccc7592e4686b9071e09e64f5e378e/pylint-4.0.4-py3-none-any.whl", hash = "sha256:63e06a37d5922555ee2c20963eb42559918c20bd2b21244e4ef426e7c43b92e0", size = 536425, upload-time = "2025-11-30T13:29:02.53Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pytest"
|
||||
version = "8.4.2"
|
||||
version = "9.0.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||
@@ -241,9 +408,9 @@ dependencies = [
|
||||
{ name = "pluggy" },
|
||||
{ name = "pygments" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -261,67 +428,85 @@ wheels = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "2025.9.18"
|
||||
name = "pytest-mock"
|
||||
version = "3.15.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/49/d3/eaa0d28aba6ad1827ad1e716d9a93e1ba963ada61887498297d3da715133/regex-2025.9.18.tar.gz", hash = "sha256:c5ba23274c61c6fef447ba6a39333297d0c247f53059dba0bca415cac511edc4", size = 400917, upload-time = "2025-09-19T00:38:35.79Z" }
|
||||
dependencies = [
|
||||
{ name = "pytest" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/68/14/eb014d26be205d38ad5ad20d9a80f7d201472e08167f0bb4361e251084a9/pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f", size = 34036, upload-time = "2025-09-16T16:37:27.081Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/d2/c7/5c48206a60ce33711cf7dcaeaed10dd737733a3569dc7e1dce324dd48f30/regex-2025.9.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2a40f929cd907c7e8ac7566ac76225a77701a6221bca937bdb70d56cb61f57b2", size = 485955, upload-time = "2025-09-19T00:36:26.822Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e9/be/74fc6bb19a3c491ec1ace943e622b5a8539068771e8705e469b2da2306a7/regex-2025.9.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c90471671c2cdf914e58b6af62420ea9ecd06d1554d7474d50133ff26ae88feb", size = 289583, upload-time = "2025-09-19T00:36:28.577Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/25/c4/9ceaa433cb5dc515765560f22a19578b95b92ff12526e5a259321c4fc1a0/regex-2025.9.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a351aff9e07a2dabb5022ead6380cff17a4f10e4feb15f9100ee56c4d6d06af", size = 287000, upload-time = "2025-09-19T00:36:30.161Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7d/e6/68bc9393cb4dc68018456568c048ac035854b042bc7c33cb9b99b0680afa/regex-2025.9.18-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc4b8e9d16e20ddfe16430c23468a8707ccad3365b06d4536142e71823f3ca29", size = 797535, upload-time = "2025-09-19T00:36:31.876Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6a/1c/ebae9032d34b78ecfe9bd4b5e6575b55351dc8513485bb92326613732b8c/regex-2025.9.18-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b8cdbddf2db1c5e80338ba2daa3cfa3dec73a46fff2a7dda087c8efbf12d62f", size = 862603, upload-time = "2025-09-19T00:36:33.344Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3b/74/12332c54b3882557a4bcd2b99f8be581f5c6a43cf1660a85b460dd8ff468/regex-2025.9.18-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a276937d9d75085b2c91fb48244349c6954f05ee97bba0963ce24a9d915b8b68", size = 910829, upload-time = "2025-09-19T00:36:34.826Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/86/70/ba42d5ed606ee275f2465bfc0e2208755b06cdabd0f4c7c4b614d51b57ab/regex-2025.9.18-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92a8e375ccdc1256401c90e9dc02b8642894443d549ff5e25e36d7cf8a80c783", size = 802059, upload-time = "2025-09-19T00:36:36.664Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/da/c5/fcb017e56396a7f2f8357412638d7e2963440b131a3ca549be25774b3641/regex-2025.9.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0dc6893b1f502d73037cf807a321cdc9be29ef3d6219f7970f842475873712ac", size = 786781, upload-time = "2025-09-19T00:36:38.168Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c6/ee/21c4278b973f630adfb3bcb23d09d83625f3ab1ca6e40ebdffe69901c7a1/regex-2025.9.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a61e85bfc63d232ac14b015af1261f826260c8deb19401c0597dbb87a864361e", size = 856578, upload-time = "2025-09-19T00:36:40.129Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/87/0b/de51550dc7274324435c8f1539373ac63019b0525ad720132866fff4a16a/regex-2025.9.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ef86a9ebc53f379d921fb9a7e42b92059ad3ee800fcd9e0fe6181090e9f6c23", size = 849119, upload-time = "2025-09-19T00:36:41.651Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/60/52/383d3044fc5154d9ffe4321696ee5b2ee4833a28c29b137c22c33f41885b/regex-2025.9.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d3bc882119764ba3a119fbf2bd4f1b47bc56c1da5d42df4ed54ae1e8e66fdf8f", size = 788219, upload-time = "2025-09-19T00:36:43.575Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/20/bd/2614fc302671b7359972ea212f0e3a92df4414aaeacab054a8ce80a86073/regex-2025.9.18-cp313-cp313-win32.whl", hash = "sha256:3810a65675845c3bdfa58c3c7d88624356dd6ee2fc186628295e0969005f928d", size = 264517, upload-time = "2025-09-19T00:36:45.503Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/07/0f/ab5c1581e6563a7bffdc1974fb2d25f05689b88e2d416525271f232b1946/regex-2025.9.18-cp313-cp313-win_amd64.whl", hash = "sha256:16eaf74b3c4180ede88f620f299e474913ab6924d5c4b89b3833bc2345d83b3d", size = 275481, upload-time = "2025-09-19T00:36:46.965Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/49/22/ee47672bc7958f8c5667a587c2600a4fba8b6bab6e86bd6d3e2b5f7cac42/regex-2025.9.18-cp313-cp313-win_arm64.whl", hash = "sha256:4dc98ba7dd66bd1261927a9f49bd5ee2bcb3660f7962f1ec02617280fc00f5eb", size = 268598, upload-time = "2025-09-19T00:36:48.314Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e8/83/6887e16a187c6226cb85d8301e47d3b73ecc4505a3a13d8da2096b44fd76/regex-2025.9.18-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fe5d50572bc885a0a799410a717c42b1a6b50e2f45872e2b40f4f288f9bce8a2", size = 489765, upload-time = "2025-09-19T00:36:49.996Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/51/c5/e2f7325301ea2916ff301c8d963ba66b1b2c1b06694191df80a9c4fea5d0/regex-2025.9.18-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b9d9a2d6cda6621551ca8cf7a06f103adf72831153f3c0d982386110870c4d3", size = 291228, upload-time = "2025-09-19T00:36:51.654Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/91/60/7d229d2bc6961289e864a3a3cfebf7d0d250e2e65323a8952cbb7e22d824/regex-2025.9.18-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:13202e4c4ac0ef9a317fff817674b293c8f7e8c68d3190377d8d8b749f566e12", size = 289270, upload-time = "2025-09-19T00:36:53.118Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3c/d7/b4f06868ee2958ff6430df89857fbf3d43014bbf35538b6ec96c2704e15d/regex-2025.9.18-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:874ff523b0fecffb090f80ae53dc93538f8db954c8bb5505f05b7787ab3402a0", size = 806326, upload-time = "2025-09-19T00:36:54.631Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d6/e4/bca99034a8f1b9b62ccf337402a8e5b959dd5ba0e5e5b2ead70273df3277/regex-2025.9.18-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d13ab0490128f2bb45d596f754148cd750411afc97e813e4b3a61cf278a23bb6", size = 871556, upload-time = "2025-09-19T00:36:56.208Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6d/df/e06ffaf078a162f6dd6b101a5ea9b44696dca860a48136b3ae4a9caf25e2/regex-2025.9.18-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:05440bc172bc4b4b37fb9667e796597419404dbba62e171e1f826d7d2a9ebcef", size = 913817, upload-time = "2025-09-19T00:36:57.807Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9e/05/25b05480b63292fd8e84800b1648e160ca778127b8d2367a0a258fa2e225/regex-2025.9.18-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5514b8e4031fdfaa3d27e92c75719cbe7f379e28cacd939807289bce76d0e35a", size = 811055, upload-time = "2025-09-19T00:36:59.762Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/70/97/7bc7574655eb651ba3a916ed4b1be6798ae97af30104f655d8efd0cab24b/regex-2025.9.18-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:65d3c38c39efce73e0d9dc019697b39903ba25b1ad45ebbd730d2cf32741f40d", size = 794534, upload-time = "2025-09-19T00:37:01.405Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b4/c2/d5da49166a52dda879855ecdba0117f073583db2b39bb47ce9a3378a8e9e/regex-2025.9.18-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ae77e447ebc144d5a26d50055c6ddba1d6ad4a865a560ec7200b8b06bc529368", size = 866684, upload-time = "2025-09-19T00:37:03.441Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bd/2d/0a5c4e6ec417de56b89ff4418ecc72f7e3feca806824c75ad0bbdae0516b/regex-2025.9.18-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e3ef8cf53dc8df49d7e28a356cf824e3623764e9833348b655cfed4524ab8a90", size = 853282, upload-time = "2025-09-19T00:37:04.985Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f4/8e/d656af63e31a86572ec829665d6fa06eae7e144771e0330650a8bb865635/regex-2025.9.18-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9feb29817df349c976da9a0debf775c5c33fc1c8ad7b9f025825da99374770b7", size = 797830, upload-time = "2025-09-19T00:37:06.697Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/db/ce/06edc89df8f7b83ffd321b6071be4c54dc7332c0f77860edc40ce57d757b/regex-2025.9.18-cp313-cp313t-win32.whl", hash = "sha256:168be0d2f9b9d13076940b1ed774f98595b4e3c7fc54584bba81b3cc4181742e", size = 267281, upload-time = "2025-09-19T00:37:08.568Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/83/9a/2b5d9c8b307a451fd17068719d971d3634ca29864b89ed5c18e499446d4a/regex-2025.9.18-cp313-cp313t-win_amd64.whl", hash = "sha256:d59ecf3bb549e491c8104fea7313f3563c7b048e01287db0a90485734a70a730", size = 278724, upload-time = "2025-09-19T00:37:10.023Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3d/70/177d31e8089a278a764f8ec9a3faac8d14a312d622a47385d4b43905806f/regex-2025.9.18-cp313-cp313t-win_arm64.whl", hash = "sha256:dbef80defe9fb21310948a2595420b36c6d641d9bea4c991175829b2cc4bc06a", size = 269771, upload-time = "2025-09-19T00:37:13.041Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/44/b7/3b4663aa3b4af16819f2ab6a78c4111c7e9b066725d8107753c2257448a5/regex-2025.9.18-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c6db75b51acf277997f3adcd0ad89045d856190d13359f15ab5dda21581d9129", size = 486130, upload-time = "2025-09-19T00:37:14.527Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/80/5b/4533f5d7ac9c6a02a4725fe8883de2aebc713e67e842c04cf02626afb747/regex-2025.9.18-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8f9698b6f6895d6db810e0bda5364f9ceb9e5b11328700a90cae573574f61eea", size = 289539, upload-time = "2025-09-19T00:37:16.356Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b8/8d/5ab6797c2750985f79e9995fad3254caa4520846580f266ae3b56d1cae58/regex-2025.9.18-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29cd86aa7cb13a37d0f0d7c21d8d949fe402ffa0ea697e635afedd97ab4b69f1", size = 287233, upload-time = "2025-09-19T00:37:18.025Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cb/1e/95afcb02ba8d3a64e6ffeb801718ce73471ad6440c55d993f65a4a5e7a92/regex-2025.9.18-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c9f285a071ee55cd9583ba24dde006e53e17780bb309baa8e4289cd472bcc47", size = 797876, upload-time = "2025-09-19T00:37:19.609Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c8/fb/720b1f49cec1f3b5a9fea5b34cd22b88b5ebccc8c1b5de9cc6f65eed165a/regex-2025.9.18-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5adf266f730431e3be9021d3e5b8d5ee65e563fec2883ea8093944d21863b379", size = 863385, upload-time = "2025-09-19T00:37:21.65Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a9/ca/e0d07ecf701e1616f015a720dc13b84c582024cbfbb3fc5394ae204adbd7/regex-2025.9.18-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1137cabc0f38807de79e28d3f6e3e3f2cc8cfb26bead754d02e6d1de5f679203", size = 910220, upload-time = "2025-09-19T00:37:23.723Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b6/45/bba86413b910b708eca705a5af62163d5d396d5f647ed9485580c7025209/regex-2025.9.18-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7cc9e5525cada99699ca9223cce2d52e88c52a3d2a0e842bd53de5497c604164", size = 801827, upload-time = "2025-09-19T00:37:25.684Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b8/a6/740fbd9fcac31a1305a8eed30b44bf0f7f1e042342be0a4722c0365ecfca/regex-2025.9.18-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bbb9246568f72dce29bcd433517c2be22c7791784b223a810225af3b50d1aafb", size = 786843, upload-time = "2025-09-19T00:37:27.62Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/80/a7/0579e8560682645906da640c9055506465d809cb0f5415d9976f417209a6/regex-2025.9.18-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6a52219a93dd3d92c675383efff6ae18c982e2d7651c792b1e6d121055808743", size = 857430, upload-time = "2025-09-19T00:37:29.362Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8d/9b/4dc96b6c17b38900cc9fee254fc9271d0dde044e82c78c0811b58754fde5/regex-2025.9.18-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:ae9b3840c5bd456780e3ddf2f737ab55a79b790f6409182012718a35c6d43282", size = 848612, upload-time = "2025-09-19T00:37:31.42Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b3/6a/6f659f99bebb1775e5ac81a3fb837b85897c1a4ef5acffd0ff8ffe7e67fb/regex-2025.9.18-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d488c236ac497c46a5ac2005a952c1a0e22a07be9f10c3e735bc7d1209a34773", size = 787967, upload-time = "2025-09-19T00:37:34.019Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/61/35/9e35665f097c07cf384a6b90a1ac11b0b1693084a0b7a675b06f760496c6/regex-2025.9.18-cp314-cp314-win32.whl", hash = "sha256:0c3506682ea19beefe627a38872d8da65cc01ffa25ed3f2e422dffa1474f0788", size = 269847, upload-time = "2025-09-19T00:37:35.759Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/af/64/27594dbe0f1590b82de2821ebfe9a359b44dcb9b65524876cd12fabc447b/regex-2025.9.18-cp314-cp314-win_amd64.whl", hash = "sha256:57929d0f92bebb2d1a83af372cd0ffba2263f13f376e19b1e4fa32aec4efddc3", size = 278755, upload-time = "2025-09-19T00:37:37.367Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/30/a3/0cd8d0d342886bd7d7f252d701b20ae1a3c72dc7f34ef4b2d17790280a09/regex-2025.9.18-cp314-cp314-win_arm64.whl", hash = "sha256:6a4b44df31d34fa51aa5c995d3aa3c999cec4d69b9bd414a8be51984d859f06d", size = 271873, upload-time = "2025-09-19T00:37:39.125Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/99/cb/8a1ab05ecf404e18b54348e293d9b7a60ec2bd7aa59e637020c5eea852e8/regex-2025.9.18-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b176326bcd544b5e9b17d6943f807697c0cb7351f6cfb45bf5637c95ff7e6306", size = 489773, upload-time = "2025-09-19T00:37:40.968Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/93/3b/6543c9b7f7e734d2404fa2863d0d710c907bef99d4598760ed4563d634c3/regex-2025.9.18-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0ffd9e230b826b15b369391bec167baed57c7ce39efc35835448618860995946", size = 291221, upload-time = "2025-09-19T00:37:42.901Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cd/91/e9fdee6ad6bf708d98c5d17fded423dcb0661795a49cba1b4ffb8358377a/regex-2025.9.18-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec46332c41add73f2b57e2f5b642f991f6b15e50e9f86285e08ffe3a512ac39f", size = 289268, upload-time = "2025-09-19T00:37:44.823Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/94/a6/bc3e8a918abe4741dadeaeb6c508e3a4ea847ff36030d820d89858f96a6c/regex-2025.9.18-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b80fa342ed1ea095168a3f116637bd1030d39c9ff38dc04e54ef7c521e01fc95", size = 806659, upload-time = "2025-09-19T00:37:46.684Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2b/71/ea62dbeb55d9e6905c7b5a49f75615ea1373afcad95830047e4e310db979/regex-2025.9.18-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4d97071c0ba40f0cf2a93ed76e660654c399a0a04ab7d85472239460f3da84b", size = 871701, upload-time = "2025-09-19T00:37:48.882Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6a/90/fbe9dedb7dad24a3a4399c0bae64bfa932ec8922a0a9acf7bc88db30b161/regex-2025.9.18-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0ac936537ad87cef9e0e66c5144484206c1354224ee811ab1519a32373e411f3", size = 913742, upload-time = "2025-09-19T00:37:51.015Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f0/1c/47e4a8c0e73d41eb9eb9fdeba3b1b810110a5139a2526e82fd29c2d9f867/regex-2025.9.18-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dec57f96d4def58c422d212d414efe28218d58537b5445cf0c33afb1b4768571", size = 811117, upload-time = "2025-09-19T00:37:52.686Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2a/da/435f29fddfd015111523671e36d30af3342e8136a889159b05c1d9110480/regex-2025.9.18-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:48317233294648bf7cd068857f248e3a57222259a5304d32c7552e2284a1b2ad", size = 794647, upload-time = "2025-09-19T00:37:54.626Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/23/66/df5e6dcca25c8bc57ce404eebc7342310a0d218db739d7882c9a2b5974a3/regex-2025.9.18-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:274687e62ea3cf54846a9b25fc48a04459de50af30a7bd0b61a9e38015983494", size = 866747, upload-time = "2025-09-19T00:37:56.367Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/82/42/94392b39b531f2e469b2daa40acf454863733b674481fda17462a5ffadac/regex-2025.9.18-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a78722c86a3e7e6aadf9579e3b0ad78d955f2d1f1a8ca4f67d7ca258e8719d4b", size = 853434, upload-time = "2025-09-19T00:37:58.39Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a8/f8/dcc64c7f7bbe58842a8f89622b50c58c3598fbbf4aad0a488d6df2c699f1/regex-2025.9.18-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:06104cd203cdef3ade989a1c45b6215bf42f8b9dd705ecc220c173233f7cba41", size = 798024, upload-time = "2025-09-19T00:38:00.397Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/20/8d/edf1c5d5aa98f99a692313db813ec487732946784f8f93145e0153d910e5/regex-2025.9.18-cp314-cp314t-win32.whl", hash = "sha256:2e1eddc06eeaffd249c0adb6fafc19e2118e6308c60df9db27919e96b5656096", size = 273029, upload-time = "2025-09-19T00:38:02.383Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a7/24/02d4e4f88466f17b145f7ea2b2c11af3a942db6222429c2c146accf16054/regex-2025.9.18-cp314-cp314t-win_amd64.whl", hash = "sha256:8620d247fb8c0683ade51217b459cb4a1081c0405a3072235ba43a40d355c09a", size = 282680, upload-time = "2025-09-19T00:38:04.102Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/1f/a3/c64894858aaaa454caa7cc47e2f225b04d3ed08ad649eacf58d45817fad2/regex-2025.9.18-cp314-cp314t-win_arm64.whl", hash = "sha256:b7531a8ef61de2c647cdf68b3229b071e46ec326b3138b2180acb4275f470b01", size = 273034, upload-time = "2025-09-19T00:38:05.807Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", size = 10095, upload-time = "2025-09-16T16:37:25.734Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ratelimit"
|
||||
version = "2.2.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251, upload-time = "2018-12-17T18:55:49.675Z" }
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "2025.11.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/cc/a9/546676f25e573a4cf00fe8e119b78a37b6a8fe2dc95cda877b30889c9c45/regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01", size = 414669, upload-time = "2025-11-03T21:34:22.089Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/e1/a7/dda24ebd49da46a197436ad96378f17df30ceb40e52e859fc42cac45b850/regex-2025.11.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c1e448051717a334891f2b9a620fe36776ebf3dd8ec46a0b877c8ae69575feb4", size = 489081, upload-time = "2025-11-03T21:31:55.9Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/19/22/af2dc751aacf88089836aa088a1a11c4f21a04707eb1b0478e8e8fb32847/regex-2025.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b5aca4d5dfd7fbfbfbdaf44850fcc7709a01146a797536a8f84952e940cca76", size = 291123, upload-time = "2025-11-03T21:31:57.758Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a3/88/1a3ea5672f4b0a84802ee9891b86743438e7c04eb0b8f8c4e16a42375327/regex-2025.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:04d2765516395cf7dda331a244a3282c0f5ae96075f728629287dfa6f76ba70a", size = 288814, upload-time = "2025-11-03T21:32:01.12Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fb/8c/f5987895bf42b8ddeea1b315c9fedcfe07cadee28b9c98cf50d00adcb14d/regex-2025.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d9903ca42bfeec4cebedba8022a7c97ad2aab22e09573ce9976ba01b65e4361", size = 798592, upload-time = "2025-11-03T21:32:03.006Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/99/2a/6591ebeede78203fa77ee46a1c36649e02df9eaa77a033d1ccdf2fcd5d4e/regex-2025.11.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:639431bdc89d6429f6721625e8129413980ccd62e9d3f496be618a41d205f160", size = 864122, upload-time = "2025-11-03T21:32:04.553Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/94/d6/be32a87cf28cf8ed064ff281cfbd49aefd90242a83e4b08b5a86b38e8eb4/regex-2025.11.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f117efad42068f9715677c8523ed2be1518116d1c49b1dd17987716695181efe", size = 912272, upload-time = "2025-11-03T21:32:06.148Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/62/11/9bcef2d1445665b180ac7f230406ad80671f0fc2a6ffb93493b5dd8cd64c/regex-2025.11.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4aecb6f461316adf9f1f0f6a4a1a3d79e045f9b71ec76055a791affa3b285850", size = 803497, upload-time = "2025-11-03T21:32:08.162Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e5/a7/da0dc273d57f560399aa16d8a68ae7f9b57679476fc7ace46501d455fe84/regex-2025.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3b3a5f320136873cc5561098dfab677eea139521cb9a9e8db98b7e64aef44cbc", size = 787892, upload-time = "2025-11-03T21:32:09.769Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/da/4b/732a0c5a9736a0b8d6d720d4945a2f1e6f38f87f48f3173559f53e8d5d82/regex-2025.11.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75fa6f0056e7efb1f42a1c34e58be24072cb9e61a601340cc1196ae92326a4f9", size = 858462, upload-time = "2025-11-03T21:32:11.769Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/0c/f5/a2a03df27dc4c2d0c769220f5110ba8c4084b0bfa9ab0f9b4fcfa3d2b0fc/regex-2025.11.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:dbe6095001465294f13f1adcd3311e50dd84e5a71525f20a10bd16689c61ce0b", size = 850528, upload-time = "2025-11-03T21:32:13.906Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d6/09/e1cd5bee3841c7f6eb37d95ca91cdee7100b8f88b81e41c2ef426910891a/regex-2025.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:454d9b4ae7881afbc25015b8627c16d88a597479b9dea82b8c6e7e2e07240dc7", size = 789866, upload-time = "2025-11-03T21:32:15.748Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/eb/51/702f5ea74e2a9c13d855a6a85b7f80c30f9e72a95493260193c07f3f8d74/regex-2025.11.3-cp313-cp313-win32.whl", hash = "sha256:28ba4d69171fc6e9896337d4fc63a43660002b7da53fc15ac992abcf3410917c", size = 266189, upload-time = "2025-11-03T21:32:17.493Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8b/00/6e29bb314e271a743170e53649db0fdb8e8ff0b64b4f425f5602f4eb9014/regex-2025.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:bac4200befe50c670c405dc33af26dad5a3b6b255dd6c000d92fe4629f9ed6a5", size = 277054, upload-time = "2025-11-03T21:32:19.042Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/25/f1/b156ff9f2ec9ac441710764dda95e4edaf5f36aca48246d1eea3f1fd96ec/regex-2025.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:2292cd5a90dab247f9abe892ac584cb24f0f54680c73fcb4a7493c66c2bf2467", size = 270325, upload-time = "2025-11-03T21:32:21.338Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/20/28/fd0c63357caefe5680b8ea052131acbd7f456893b69cc2a90cc3e0dc90d4/regex-2025.11.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1eb1ebf6822b756c723e09f5186473d93236c06c579d2cc0671a722d2ab14281", size = 491984, upload-time = "2025-11-03T21:32:23.466Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/df/ec/7014c15626ab46b902b3bcc4b28a7bae46d8f281fc7ea9c95e22fcaaa917/regex-2025.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1e00ec2970aab10dc5db34af535f21fcf32b4a31d99e34963419636e2f85ae39", size = 292673, upload-time = "2025-11-03T21:32:25.034Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/23/ab/3b952ff7239f20d05f1f99e9e20188513905f218c81d52fb5e78d2bf7634/regex-2025.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a4cb042b615245d5ff9b3794f56be4138b5adc35a4166014d31d1814744148c7", size = 291029, upload-time = "2025-11-03T21:32:26.528Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/21/7e/3dc2749fc684f455f162dcafb8a187b559e2614f3826877d3844a131f37b/regex-2025.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44f264d4bf02f3176467d90b294d59bf1db9fe53c141ff772f27a8b456b2a9ed", size = 807437, upload-time = "2025-11-03T21:32:28.363Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/1b/0b/d529a85ab349c6a25d1ca783235b6e3eedf187247eab536797021f7126c6/regex-2025.11.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7be0277469bf3bd7a34a9c57c1b6a724532a0d235cd0dc4e7f4316f982c28b19", size = 873368, upload-time = "2025-11-03T21:32:30.4Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7d/18/2d868155f8c9e3e9d8f9e10c64e9a9f496bb8f7e037a88a8bed26b435af6/regex-2025.11.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0d31e08426ff4b5b650f68839f5af51a92a5b51abd8554a60c2fbc7c71f25d0b", size = 914921, upload-time = "2025-11-03T21:32:32.123Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2d/71/9d72ff0f354fa783fe2ba913c8734c3b433b86406117a8db4ea2bf1c7a2f/regex-2025.11.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e43586ce5bd28f9f285a6e729466841368c4a0353f6fd08d4ce4630843d3648a", size = 812708, upload-time = "2025-11-03T21:32:34.305Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e7/19/ce4bf7f5575c97f82b6e804ffb5c4e940c62609ab2a0d9538d47a7fdf7d4/regex-2025.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f9397d561a4c16829d4e6ff75202c1c08b68a3bdbfe29dbfcdb31c9830907c6", size = 795472, upload-time = "2025-11-03T21:32:36.364Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/03/86/fd1063a176ffb7b2315f9a1b08d17b18118b28d9df163132615b835a26ee/regex-2025.11.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:dd16e78eb18ffdb25ee33a0682d17912e8cc8a770e885aeee95020046128f1ce", size = 868341, upload-time = "2025-11-03T21:32:38.042Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/12/43/103fb2e9811205e7386366501bc866a164a0430c79dd59eac886a2822950/regex-2025.11.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:ffcca5b9efe948ba0661e9df0fa50d2bc4b097c70b9810212d6b62f05d83b2dd", size = 854666, upload-time = "2025-11-03T21:32:40.079Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7d/22/e392e53f3869b75804762c7c848bd2dd2abf2b70fb0e526f58724638bd35/regex-2025.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c56b4d162ca2b43318ac671c65bd4d563e841a694ac70e1a976ac38fcf4ca1d2", size = 799473, upload-time = "2025-11-03T21:32:42.148Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4f/f9/8bd6b656592f925b6845fcbb4d57603a3ac2fb2373344ffa1ed70aa6820a/regex-2025.11.3-cp313-cp313t-win32.whl", hash = "sha256:9ddc42e68114e161e51e272f667d640f97e84a2b9ef14b7477c53aac20c2d59a", size = 268792, upload-time = "2025-11-03T21:32:44.13Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e5/87/0e7d603467775ff65cd2aeabf1b5b50cc1c3708556a8b849a2fa4dd1542b/regex-2025.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7a7c7fdf755032ffdd72c77e3d8096bdcb0eb92e89e17571a196f03d88b11b3c", size = 280214, upload-time = "2025-11-03T21:32:45.853Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8d/d0/2afc6f8e94e2b64bfb738a7c2b6387ac1699f09f032d363ed9447fd2bb57/regex-2025.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:df9eb838c44f570283712e7cff14c16329a9f0fb19ca492d21d4b7528ee6821e", size = 271469, upload-time = "2025-11-03T21:32:48.026Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/31/e9/f6e13de7e0983837f7b6d238ad9458800a874bf37c264f7923e63409944c/regex-2025.11.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9697a52e57576c83139d7c6f213d64485d3df5bf84807c35fa409e6c970801c6", size = 489089, upload-time = "2025-11-03T21:32:50.027Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a3/5c/261f4a262f1fa65141c1b74b255988bd2fa020cc599e53b080667d591cfc/regex-2025.11.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e18bc3f73bd41243c9b38a6d9f2366cd0e0137a9aebe2d8ff76c5b67d4c0a3f4", size = 291059, upload-time = "2025-11-03T21:32:51.682Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8e/57/f14eeb7f072b0e9a5a090d1712741fd8f214ec193dba773cf5410108bb7d/regex-2025.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:61a08bcb0ec14ff4e0ed2044aad948d0659604f824cbd50b55e30b0ec6f09c73", size = 288900, upload-time = "2025-11-03T21:32:53.569Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3c/6b/1d650c45e99a9b327586739d926a1cd4e94666b1bd4af90428b36af66dc7/regex-2025.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9c30003b9347c24bcc210958c5d167b9e4f9be786cb380a7d32f14f9b84674f", size = 799010, upload-time = "2025-11-03T21:32:55.222Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/99/ee/d66dcbc6b628ce4e3f7f0cbbb84603aa2fc0ffc878babc857726b8aab2e9/regex-2025.11.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e1e592789704459900728d88d41a46fe3969b82ab62945560a31732ffc19a6d", size = 864893, upload-time = "2025-11-03T21:32:57.239Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bf/2d/f238229f1caba7ac87a6c4153d79947fb0261415827ae0f77c304260c7d3/regex-2025.11.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6538241f45eb5a25aa575dbba1069ad786f68a4f2773a29a2bd3dd1f9de787be", size = 911522, upload-time = "2025-11-03T21:32:59.274Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bd/3d/22a4eaba214a917c80e04f6025d26143690f0419511e0116508e24b11c9b/regex-2025.11.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce22519c989bb72a7e6b36a199384c53db7722fe669ba891da75907fe3587db", size = 803272, upload-time = "2025-11-03T21:33:01.393Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/84/b1/03188f634a409353a84b5ef49754b97dbcc0c0f6fd6c8ede505a8960a0a4/regex-2025.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:66d559b21d3640203ab9075797a55165d79017520685fb407b9234d72ab63c62", size = 787958, upload-time = "2025-11-03T21:33:03.379Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/99/6a/27d072f7fbf6fadd59c64d210305e1ff865cc3b78b526fd147db768c553b/regex-2025.11.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:669dcfb2e38f9e8c69507bace46f4889e3abbfd9b0c29719202883c0a603598f", size = 859289, upload-time = "2025-11-03T21:33:05.374Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9a/70/1b3878f648e0b6abe023172dacb02157e685564853cc363d9961bcccde4e/regex-2025.11.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:32f74f35ff0f25a5021373ac61442edcb150731fbaa28286bbc8bb1582c89d02", size = 850026, upload-time = "2025-11-03T21:33:07.131Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/dd/d5/68e25559b526b8baab8e66839304ede68ff6727237a47727d240006bd0ff/regex-2025.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e6c7a21dffba883234baefe91bc3388e629779582038f75d2a5be918e250f0ed", size = 789499, upload-time = "2025-11-03T21:33:09.141Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fc/df/43971264857140a350910d4e33df725e8c94dd9dee8d2e4729fa0d63d49e/regex-2025.11.3-cp314-cp314-win32.whl", hash = "sha256:795ea137b1d809eb6836b43748b12634291c0ed55ad50a7d72d21edf1cd565c4", size = 271604, upload-time = "2025-11-03T21:33:10.9Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/01/6f/9711b57dc6894a55faf80a4c1b5aa4f8649805cb9c7aef46f7d27e2b9206/regex-2025.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f95fbaa0ee1610ec0fc6b26668e9917a582ba80c52cc6d9ada15e30aa9ab9ad", size = 280320, upload-time = "2025-11-03T21:33:12.572Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f1/7e/f6eaa207d4377481f5e1775cdeb5a443b5a59b392d0065f3417d31d80f87/regex-2025.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:dfec44d532be4c07088c3de2876130ff0fbeeacaa89a137decbbb5f665855a0f", size = 273372, upload-time = "2025-11-03T21:33:14.219Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c3/06/49b198550ee0f5e4184271cee87ba4dfd9692c91ec55289e6282f0f86ccf/regex-2025.11.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ba0d8a5d7f04f73ee7d01d974d47c5834f8a1b0224390e4fe7c12a3a92a78ecc", size = 491985, upload-time = "2025-11-03T21:33:16.555Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ce/bf/abdafade008f0b1c9da10d934034cb670432d6cf6cbe38bbb53a1cfd6cf8/regex-2025.11.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:442d86cf1cfe4faabf97db7d901ef58347efd004934da045c745e7b5bd57ac49", size = 292669, upload-time = "2025-11-03T21:33:18.32Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f9/ef/0c357bb8edbd2ad8e273fcb9e1761bc37b8acbc6e1be050bebd6475f19c1/regex-2025.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fd0a5e563c756de210bb964789b5abe4f114dacae9104a47e1a649b910361536", size = 291030, upload-time = "2025-11-03T21:33:20.048Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/79/06/edbb67257596649b8fb088d6aeacbcb248ac195714b18a65e018bf4c0b50/regex-2025.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf3490bcbb985a1ae97b2ce9ad1c0f06a852d5b19dde9b07bdf25bf224248c95", size = 807674, upload-time = "2025-11-03T21:33:21.797Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f4/d9/ad4deccfce0ea336296bd087f1a191543bb99ee1c53093dcd4c64d951d00/regex-2025.11.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3809988f0a8b8c9dcc0f92478d6501fac7200b9ec56aecf0ec21f4a2ec4b6009", size = 873451, upload-time = "2025-11-03T21:33:23.741Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/13/75/a55a4724c56ef13e3e04acaab29df26582f6978c000ac9cd6810ad1f341f/regex-2025.11.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f4ff94e58e84aedb9c9fce66d4ef9f27a190285b451420f297c9a09f2b9abee9", size = 914980, upload-time = "2025-11-03T21:33:25.999Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/67/1e/a1657ee15bd9116f70d4a530c736983eed997b361e20ecd8f5ca3759d5c5/regex-2025.11.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eb542fd347ce61e1321b0a6b945d5701528dca0cd9759c2e3bb8bd57e47964d", size = 812852, upload-time = "2025-11-03T21:33:27.852Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b8/6f/f7516dde5506a588a561d296b2d0044839de06035bb486b326065b4c101e/regex-2025.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2d5919075a1f2e413c00b056ea0c2f065b3f5fe83c3d07d325ab92dce51d6", size = 795566, upload-time = "2025-11-03T21:33:32.364Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d9/dd/3d10b9e170cc16fb34cb2cef91513cf3df65f440b3366030631b2984a264/regex-2025.11.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3f8bf11a4827cc7ce5a53d4ef6cddd5ad25595d3c1435ef08f76825851343154", size = 868463, upload-time = "2025-11-03T21:33:34.459Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f5/8e/935e6beff1695aa9085ff83195daccd72acc82c81793df480f34569330de/regex-2025.11.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:22c12d837298651e5550ac1d964e4ff57c3f56965fc1812c90c9fb2028eaf267", size = 854694, upload-time = "2025-11-03T21:33:36.793Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/92/12/10650181a040978b2f5720a6a74d44f841371a3d984c2083fc1752e4acf6/regex-2025.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ba394a3dda9ad41c7c780f60f6e4a70988741415ae96f6d1bf6c239cf01379", size = 799691, upload-time = "2025-11-03T21:33:39.079Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/67/90/8f37138181c9a7690e7e4cb388debbd389342db3c7381d636d2875940752/regex-2025.11.3-cp314-cp314t-win32.whl", hash = "sha256:4bf146dca15cdd53224a1bf46d628bd7590e4a07fbb69e720d561aea43a32b38", size = 274583, upload-time = "2025-11-03T21:33:41.302Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8f/cd/867f5ec442d56beb56f5f854f40abcfc75e11d10b11fdb1869dd39c63aaf/regex-2025.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:adad1a1bcf1c9e76346e091d22d23ac54ef28e1365117d99521631078dfec9de", size = 284286, upload-time = "2025-11-03T21:33:43.324Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/20/31/32c0c4610cbc070362bf1d2e4ea86d1ea29014d400a6d6c2486fcfd57766/regex-2025.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c54f768482cef41e219720013cd05933b6f971d9562544d691c68699bf2b6801", size = 274741, upload-time = "2025-11-03T21:33:45.557Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -339,6 +524,54 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "soupsieve"
|
||||
version = "2.8"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tomlkit"
|
||||
version = "0.13.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload-time = "2025-06-05T07:13:44.947Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "types-pysocks"
|
||||
version = "1.7.1.20251001"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/24/d7/421deaee04ffe69dc1449cbf57dc4d4d92e8f966f4a35b482ea3811b7980/types_pysocks-1.7.1.20251001.tar.gz", hash = "sha256:50a0e737d42527abbec09e891c64f76a9f66f302e673cd149bc112c15764869f", size = 8785, upload-time = "2025-10-01T03:04:13.85Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/36/07/6a8aafa0fa5fc0880a37c98b41348bf91bc28f76577bdac68f78bcf8a124/types_pysocks-1.7.1.20251001-py3-none-any.whl", hash = "sha256:dd9abcfc7747aeddf1bab270c8daab3a1309c3af9e07c8c2c52038ab8539f06c", size = 9620, upload-time = "2025-10-01T03:04:13.042Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "types-regex"
|
||||
version = "2025.11.3.20251106"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/da/91/510649fdd4cfa800b22063974785eb69877e339815a3fa798f978d7f1634/types_regex-2025.11.3.20251106.tar.gz", hash = "sha256:5f9828ed39a5a52727b637f93f7f0f909d56fa2211604ecc213fcebb509b9d50", size = 12838, upload-time = "2025-11-06T03:06:47.487Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/ac/08/8ad634e76e06398689bb8a6c346e4623a3cee274a94448d85984efc5e375/types_regex-2025.11.3.20251106-py3-none-any.whl", hash = "sha256:bbc37f8c2a81770f81ac8c36857ad81c7c88782ab157803f21de42f3fffc2d89", size = 11102, upload-time = "2025-11-06T03:06:46.611Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "types-requests"
|
||||
version = "2.32.4.20250913"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "urllib3" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/36/27/489922f4505975b11de2b5ad07b4fe1dca0bca9be81a703f26c5f3acfce5/types_requests-2.32.4.20250913.tar.gz", hash = "sha256:abd6d4f9ce3a9383f269775a9835a4c24e5cd6b9f647d64f88aa4613c33def5d", size = 23113, upload-time = "2025-09-13T02:40:02.309Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/2a/20/9a227ea57c1285986c4cf78400d0a91615d25b24e257fd9e2969606bdfae/types_requests-2.32.4.20250913-py3-none-any.whl", hash = "sha256:78c9c1fffebbe0fa487a418e0fa5252017e9c60d1a2da394077f1780f655d7e1", size = 20658, upload-time = "2025-09-13T02:40:01.115Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typing-extensions"
|
||||
version = "4.15.0"
|
||||
@@ -350,9 +583,9 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "urllib3"
|
||||
version = "2.5.0"
|
||||
version = "2.6.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/5e/1d/0f3a93cca1ac5e8287842ed4eebbd0f7a991315089b1a0b01c7788aa7b63/urllib3-2.6.1.tar.gz", hash = "sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f", size = 432678, upload-time = "2025-12-08T15:25:26.773Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bc/56/190ceb8cb10511b730b564fb1e0293fa468363dbad26145c34928a60cb0c/urllib3-2.6.1-py3-none-any.whl", hash = "sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b", size = 131138, upload-time = "2025-12-08T15:25:25.51Z" },
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user