{"id":24589,"library":"sickle","title":"Sickle","description":"A lightweight OAI (Open Archives Initiative) client library for Python, designed to harvest metadata from OAI-PMH compliant repositories. Current version is 0.7.0, with maintenance releases as needed.","status":"active","version":"0.7.0","language":"python","source_language":"en","source_url":"http://github.com/mloesch/sickle","tags":["oai-pmh","metadata harvesting","client"],"install":[{"cmd":"pip install sickle","lang":"bash","label":"Install from PyPI"}],"dependencies":[],"imports":[{"note":"OAIResponse is now top-level in v0.7+","wrong":"from sickle.oaipmh import OAIResponse","symbol":"OAIResponse","correct":"from sickle import OAIResponse"},{"note":"Main class, always from top-level","wrong":null,"symbol":"Sickle","correct":"from sickle import Sickle"}],"quickstart":{"code":"from sickle import Sickle\n\nsickle = Sickle('https://api.example.com/oai', verify=True)\nrecords = sickle.ListRecords(metadataPrefix='oai_dc')\nfor record in records:\n    print(record.header.identifier, record.metadata.get('title', ''))","lang":"python","description":"Basic setup: create a Sickle instance pointing to an OAI-PMH base URL, then iterate over records. Use 'verify=False' for self-signed certs (not recommended)."},"warnings":[{"fix":"Change imports from 'from sickle.oaipmh import OAIResponse' to 'from sickle import OAIResponse'.","message":"In v0.7.0, the 'OAIResponse' class moved from 'sickle.oaipmh' to top-level 'sickle'. Old imports will break.","severity":"breaking","affected_versions":"<0.7.0"},{"fix":"Wrap usage in a 'with Sickle(...) as app:' context manager to ensure cleanup.","message":"The 'ListRecords' iterator internally handles resumption tokens automatically. However, if you manually iterate and break early, the underlying HTTP session may not be cleanly closed. Always use context managers or iterate fully.","severity":"gotcha","affected_versions":"all"},{"fix":"Use 'from requests.adapters import HTTPAdapter' to configure retries.","message":"The 'max_retries' parameter is deprecated in favor of 'retry_status_codes' and 'retry_backoff_factor' via requests adapter.","severity":"deprecated","affected_versions":">=0.7.0"}],"env_vars":null,"last_verified":"2026-05-01T00:00:00.000Z","next_check":"2026-07-30T00:00:00.000Z","problems":[{"fix":"Use 'from sickle import OAIResponse' or access it as 'sickle.oaipmh.OAIResponse' (deprecated).","cause":"Trying to use 'sickle.OAIResponse' directly, but it's not a top-level attribute unless explicitly imported.","error":"AttributeError: module 'sickle' has no attribute 'OAIResponse'"},{"fix":"If you trust the endpoint, pass 'verify=False' to Sickle constructor (not recommended in production). For production, use proper certificates.","cause":"The OAI endpoint uses a self-signed or invalid SSL certificate.","error":"requests.exceptions.SSLError: HTTPSConnectionPool(host='...', port=443): Max retries exceeded with url: ... (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed')))"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}