Ignition is a simple but powerful transport library for Python3 clients using the recently designed Gemini protocol. This project intends to implement all of the transport specifications (sections 1-4) of the Gemini protocol and provide an easy-to-use interface, so as to act as a building block in a larger application.
If you're building a Python3 application that uses Gemini, Ignition is your gateway to the stars, in very much the same way that requests is for HTTP and gopherlib is for Gopher.
In order to provide a best-in-class interface, this library does not implement the other parts of a typical client (including user interface and/or command line interface), and instead focuses on providing a robust programmatic API interface. This project also assumes that different user interfaces will have different requirements for their display of text/gemini files (.gmi), and/or other mime-types, and as such considers this portion of the specification beyond the scope of this project.
In addition, in order to provide stability and simplicity, minimal third-party dependencies are required for Ignition.
Ignition is no longer being updated.
⚠ Ignition supports Python versions 3.7 - 3.12.
Ignition can be installed via PIP. You should install it in alignment with your current development process; if you do not have a build process yet, I recommend you install within a virtual environment
pip install ignition-gemini
If you prefer to install from source, you can clone and install the repository:
git clone https://github.com/cbrews/ignition.git
cd ignition
pip install .
The most basic usage of Ignition allows the user to create a request and get a response back from a remote Gemini capsule:
import ignition
# Fetch capsule content
response = ignition.request('//geminiprotocol.net')
# Get status from remote capsule
print(response.status)
# Get response information from remote capsule
print(response.data())
In all cases, Ignition assumes that the specified endpoint and protocol will respond over the Gemini protocol, so even if you provide a different protocol or port, it will assume that the endpoint is a Gemini capsule.
✅ Ignition supports the following features:
❌ The following Gemini features will not be supported by Ignition:
More advanced request usage:
import ignition
response = ignition.request('/software', referer='//geminiprotocol.net:1965')
print("Got back response %s from %s" % (response.status, response.url))
# Got back a response 20 from gemini://geminiprotocol.net/software
if not response.success():
print("There was an error on the response.")
else:
print(response.data())
Passing a referer:
import ignition
response1 = ignition.request('//geminiprotocol.net')
response2 = ignition.request('software', referer=response1.url)
print(response2)
More advanced response validation:
import ignition
url = '//geminiprotocol.net'
response = ignition.request(url)
if response.is_a(ignition.SuccessResponse):
print('Success!')
print(response.data())
elif response.is_a(ignition.InputResponse):
print('Needs additional input: %s' % (response.data()))
elif response.is_a(ignition.RedirectResponse):
print('Received response, redirect to: %s' % (response.data()))
elif response.is_a(ignition.TempFailureResponse):
print('Error from server: %s' % (response.data()))
elif response.is_a(ignition.PermFailureResponse):
print('Error from server: %s' % (response.data()))
elif response.is_a(ignition.ClientCertRequiredResponse):
print('Client certificate required. %s' % (response.data()))
elif response.is_a(ignition.ErrorResponse):
print('There was an error on the request: %s' % (response.data()))
Finally, the module exposes DEBUG
level logging via standard python capabilities. If you are having trouble with the requests, enable debug-level logging with:
import logging
logging.basicConfig(level=logging.DEBUG)
Full API documentation for Ignition is available here.
Ignition is no longer accepting contributions. Please feel free to fork this repository.
Ignition is licensed under Mozilla Public License 2.0.
Copyright 2020-2024 by Chris Brousseau.
🔭 Happy exploring!