A search engine for Pybites content
Project description
Pybites Search
A command line tool to easily search across Pybites content.
Installation
pybites-search is hosted on PyPI and you can install it in a virtual environment like this:
$ pip install pybites-search
How to run it:
$ search --help
Usage: search [OPTIONS] COMMAND [ARGS]...
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --install-completion Install completion for the current shell. │
│ --show-completion Show completion for the current shell, to copy it or customize the installation. │
│ --help Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ all │
│ article │
│ bite │
│ podcast │
│ tip │
│ video │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
$ search article zipfiles
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Title ┃ Url ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ How to Create and Serve Zipfiles from Django │ https://pybit.es/django-zipfiles.html │
└──────────────────────────────────────────────┴───────────────────────────────────────┘
$ search bite fastapi
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Title ┃ Url ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ FastAPI Exception handling │ https://codechalleng.es/bites/343 │
│ FastAPI Hello World │ https://codechalleng.es/bites/336 │
│ A little detour: Pydantic │ https://codechalleng.es/bites/337 │
│ Update and delete food objects │ https://codechalleng.es/bites/340 │
│ Food logging CRUD │ https://codechalleng.es/bites/342 │
│ FastAPI Authentication with JWT (JSON Web Tokens) │ https://codechalleng.es/bites/345 │
│ Return an HTML response │ https://codechalleng.es/bites/344 │
│ Create food objects │ https://codechalleng.es/bites/338 │
│ Retrieve food objects │ https://codechalleng.es/bites/339 │
│ Pydantic part II │ https://codechalleng.es/bites/341 │
└───────────────────────────────────────────────────┴───────────────────────────────────┘
$ search podcast layoff
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Title ┃ Url ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ #101 - Layoff fears, 5 tips to stay in control │ https://www.buzzsprout.com/1501156/12125495-101-layoff-fears-5-tips-to-stay-in-control.mp3 │
└────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────┘
$ search tip unpacking
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Title ┃ Url ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ tuple unpacking │ https://codechalleng.es/tips/tuple-unpacking │
│ regex replace │ https://codechalleng.es/tips/regex-replace │
│ dictionary unpacking │ https://codechalleng.es/tips/dictionary-unpacking │
│ extract dictionary keys and values │ https://codechalleng.es/tips/extract-dictionary-keys-and-values │
│ dataclass from dict │ https://codechalleng.es/tips/dataclass-from-dict │
└────────────────────────────────────┴─────────────────────────────────────────────────────────────────┘
$ search video property
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Title ┃ Url ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Python @property decorator explained │ https://www.youtube.com/watch?v=8BbngXWouzo │
└──────────────────────────────────────┴─────────────────────────────────────────────┘
# and to search across all content channels:
$ search all decouple
Pybites All Content
┌────────────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Pybites Podcast Episodes │ Url │
├────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ #025 - Building Dreams with Python - The AskAGuru Story │ https://www.pybitespodcast.com/1501156/8476666-025-building-dreams-with-python-the-askaguru-story │
├────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Pybites Python Tips │ Url │
├────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ configuration variables │ https://codechalleng.es/tips/configuration-variables │
├────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Pybites YouTube Videos │ Url │
├────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ How to manage environment variables in Django with python-decouple │ https://www.youtube.com/watch?v=LkyhTqDrSxA │
└────────────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────┘
Caching
By default any requests calls to the different Pybites API endpoints are cached for 24 hours, you can change that setting the CACHE_EXPIRATION_SECONDS environment variable.
Changelog
Check out the changelog here
Developer setup instructions
We recommend using uv for development work on this repo. (Preferably installed via one of the standalone installers)
- Check out the repo.
# original repo or make a fork and clone that if you want to contribute
$ git clone git@github.com:PyBites-Open-Source/search.git
- Activate the virtual environment
(This is optional if you run all your commands withuv, but is a safer option if you are new to this workflow)
# Linux and macOS
√ search (main) $ source venv/bin/activate
# Windows
√ search (main) $ .venv\scripts\activate
- Install dependencies (this will automatically include the dev dependency group)
(search) √ search (main) $ uv sync
- Use the tool / run the tests
(search) √ search (main) $ search ...
...
(search) √ search (main) $ uv run pytest -vvv
...
...
configfile: pyproject.toml
plugins: cov-6.2.1
collected 11 items
tests/test_all_content.py::test_all_search_match_content PASSED [ 9%]
tests/test_all_content.py::test_all_search_show_matches PASSED [ 18%]
tests/test_article.py::test_match_article_content PASSED [ 27%]
tests/test_article.py::test_match_article_content_no_results PASSED [ 36%]
tests/test_bite.py::test_match_bite_content PASSED [ 45%]
tests/test_bite.py::test_match_bite_content_no_results PASSED [ 54%]
tests/test_bite.py::test_match_bite_content_timeout PASSED [ 63%]
tests/test_podcast.py::test_match_podcast_content PASSED [ 72%]
tests/test_tip.py::test_match_tip_content PASSED [ 81%]
tests/test_tip.py::test_show_tip_matches PASSED [ 90%]
tests/test_youtube.py::test_match_video_content PASSED [100%]
============================= 11 passed in 0.34s ==============================
6. Code, have fun, contribute ... 💪 🙏
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pybites_search-1.1.0.tar.gz.
File metadata
- Download URL: pybites_search-1.1.0.tar.gz
- Upload date:
- Size: 5.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
529db07d495e960a3da363ffb47979ee850d425b4d51084e89fe99691c6cea14
|
|
| MD5 |
070e483bbf45996cb8a0ea23bdfa1c1d
|
|
| BLAKE2b-256 |
a7023be43cef10008fe72680d91a0025c714ff1cea1529ad638bf092d1cd22e4
|
File details
Details for the file pybites_search-1.1.0-py3-none-any.whl.
File metadata
- Download URL: pybites_search-1.1.0-py3-none-any.whl
- Upload date:
- Size: 9.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ad7200f053f3ceeec4538705c6fdaa36c43f8bbc9d2ab505bfc846f6a38dbd0
|
|
| MD5 |
c3a3f4add73f6548cfdecbd0b36bcea8
|
|
| BLAKE2b-256 |
ee5fa4ab37a7702efb5dd265b8572380690d332e5d74d760cffa283c6f653d01
|