$
pip install luckydonald-utils
Via pip:
$
pip install --upgrade luckydonald-utils
Using the package:
$
python -m luckydonaldUtils.selfupdate
From python interpreter:
from luckydonaldUtils import selfupdate
- Get the source
- Navigate into the
luckydonaldUtils
folder and run$
python setup.py install
- If you manually downloaded your version, just follow the install steps again using a new version.
- If you cloned the code, navigate into the
luckydonaldUtils
folder and run$
git pull && python setup.py install
(not a complete list)
Related to class manipulations.
-
Singleton
: Metaclass to use, if only the one (the same) instance of a class is needed. (Added in v0.35) -
Kwags
: Extend and set__FIELDS__ = tuple("a", "b", ...)
to be able to use**obj
. (v0.72+)
Utilities for django.
-
csrf
(v0.22-27. Merged intodjangos.requests
in v0.28) -
headers
(added in v0.23)-
@header
: decorator to add/set a header. (added in v0.24) Use like@header('X-Important-Number', '4458')
-
@headers
: decorator to set headers. Use with an dict@headers({'X-Powered-By': 'Magical Unicorns', 'X-Foo': 'Bar!'})
or as kwargs@headers(X_Powered_By="Magical Unicorns", X_Foo="Bar!")
-
@easteregg_headers
: Adds my favorite collection of easter egg headers.
-
-
responses
(added in v0.25)-
json_response(status=None, statusText=None, exception=None, content=None)
: Easier json Responses, also given Exception is rendered as json too. -
@catch_exception
: (v0.26 only) With v0.27, use@render_all_exceptions
,@render_DoOutputException
or@render_specific_exception(exception_class, exception_render_func=None)
. -
@render_all_exceptions
: (v0.27+) Catches all exceptions and renders the exceptione
asHttpResponse(str(e), status=500)
. -
@render_DoOutputException
: (v0.27+) Like@render_all_exceptions
, but only renders a DoOutputException. Useful if something deep in the call stack want to fail with a message. -
@render_specific_exception(exception_class, exception_render_func=None)
: (v0.27+) Like@render_DoOutputException
, but you can specify the Exception you are expecting. Also you can optionally set a function to render that exception instead of using the defaultdef render(response, e): return HttpResponse(str(e), status=500)
-
-
requests
(v0.28+)-
check_csrf(request)
: Manually checks the csrf. ReturnsTrue
orFalse
. (moved here in v0.28) -
GET_to_bool(request, key)
: Parses a GET parameter in the request as bool."true"
becomesTrue
,"false"
becomesFalse
,"null"
becomesNone
.
-
-
middelware
a collection.-
access
:-
AllowFromIPMiddleware
: v0.31+ Allow only given IPs to access, else raises aHttp404
error. Is will be ignored whenDEBUG
isTrue
, orsettings.ALLOW_FROM
isNone
. Set in the settings.py file:ALLOW_FROM = ["134.169.0.0/16"]
Include in yourMIDDLEWARE_CLASSES
:"luckydonaldUtils.djangos.middleware.access.AllowFromIPMiddleware"
-
-
header
:-
EastereggHeadersMiddleware
: v0.34 Sets some funny headers. Include in yourMIDDLEWARE_CLASSES
:"luckydonaldUtils.djangos.middleware.headers.EastereggHeadersMiddleware"
-
-
Exception related stuff.
-
assert_type_or_raise(value, expected_type_clazz_or_tuple, *more_clazzes, exception_clazz=TypeError, parameter_name=None)
: Since 2 v0.53; Addedparameter_name
parameter in v54. A betterassert(isinstance(a, B)
because it supportsNone
(as well as some other types except tuple or list), and an nice exception text.
Collection of things which are file related. (This structure exists since v0.47)
-
files.basics
v0.47+-
mkdir_p(path)
likemkdir -p
v0.43 -
open_folder(folder_path)
tries to open a folder in your system's browser -
open_file_folder(file_path)
tries to open a folder, and select the given file in your system's browser
-
-
files.mime
v0.47+-
guess_extension(mime)
Shortcut for getting extension to a given mime string. -
get_file_mime(file_path=None, file_url=None)
Shortcut to get the mime from either -
get_byte_mime(bytes)
Shortcut to get a mime from bytes in a variable. -
get_file_suffix(file_path=None, file_url=None)
This callsget_file_mime()
to get the mime, and then callsguess_extension()
.
-
-
files.name
v0.47+-
do_a_filename(input_file_name)
Bad attempt to make file names better, by replacing some characters. This is no escaping.
-
-
files.temp
v0.47+-
gettempdir(temp_folder_name="luckydonald-utils")
Gets/creates a folder in the temporary files of the system.
-
-
files.tree
v0.47+-
tree(directory, padding="", print_files=False, level=-1, print_it=True)
(New in v0.47)
-
Utilities for flask. v0.59+
-
flasks.routing
-
route_for
: Basicallyflask.url_for
in reverse. You give a url, it gives you the route and the required arguments. -
get_safe_next
: Checks if the specifiedurl
in like a?next=<url>
parameter is part of our registered routes, and thus seems safe to redirect to.
-
-
flasks.launcher
-
Launcher
: Allowflask
's auto-reload to survive syntax errors and similar exceptions, also show them in the browser.
-
Utilities for importing and import related stuff. v0.77+
-
imports.relative
-
relimport
: Basically likeos.path.relpath
, but for dot delimited import paths.
-
Utilities for the jinja templating engine. v0.64+
-
filters
: Filter for templates.-
br
: Add<br>
to linebreaks.
-
Information about calling functions (Added in v0.35)
-
@caller
: Functions decorated with this will be called with ancall
kwarg, containing information about the function itself, and the caller. If the caller could not be fetched correctly, thecaller
s attributes all will beNone
. -
@cached
: v0.49 Decorator to cache function return values (based on *args and **kwargs). You can specify adatetime.timedelta
inmax_age
after which that function will be called again. -
@deprecated
: Decorator to mark functions as deprecated. A warning will be logged when the function is used. With v0.47 you can specify a message.@deprecated("Reason goes here") def foo(): pass
-
@gone
: Decorator to mark functions as gone. A NotImplementedError will be emitted when the function is used.
(Added in v0.45)
Caches a result, and returns it. Useful in if statements.
In python it is not possible to store the result of an expression in a variable while being inside of an if
:
if (temp=do_something()) == 42:
foo(temp)
And storing it before is not an option?
(you have a very resources-expensive call, or changing values, or are in an elif
)
temp = do_something()
temp2 = do_something_else()
if temp == 42:
foo(temp)
elif temp2:
foo2(temp2)
Somebody need to hold that result for you:
from luckydonaldUtils.holder import Holder
h = Holder()
if h(do_something()) == 42:
foo(h())
elif h(do_something_else()):
foo2(h())
That's what Holder
is for.
All stuff related to list and iterators.
-
: (Added in v0.34) Deprecated since v0.73. Yields a tuple of the iterator result and an integer incrementing each time.iter_with_i (iterator, start_i=0)
for iterator_result, i in iter_with_i(["a","b"])
-
chunks(iterable, size)
: (v0.73+) Yields chunks of aniterable
, using theslice
protocol. That means, the slices are resolved lazy when needed and thus generated, and not loaded up front. End is determined by the actual length of a chunk being less then the specifiedsize
. -
chunks_known_length(iterable, size, length=None)
: (v0.73+) Similar tochunks(...)
but uses a for loop with a previously determined max length to do the slicing, instead of thewhile True
if len < size: break
loop.
Interact with the user.
-
safe_eval (user_input, no_builtins_object=NoBuiltins(eval_safe_builtin_list, eval_safe_builtin_mapping))
: (Added in v0.37) Tries to make a safe execution of user inputted python code. Per default uses ainteractions.NoBuiltins
object withinteractions.eval_safe_builtin_list
as allowed commands.-
user_input
: the string -
no_builtins_object
: aNoBuiltins
object, initialized withinteractions.eval_safe_builtin_list
-
-
NoBuiltins (allowed_builtins, allowed_functions=None, allowed_vars=None)
: (Added in v0.37) Used to allow custom variables.-
allowed_builtins
: List of allowed buildins (strings) -
allowed_functions
: Dict with names of functions and the functions to be called. -
allowed_vars
: Given variables. A Mapping with a dict.
-
-
eval_safe_builtin_list
: (Added in v0.37) A default list of builtin commands/variables considered 'safe'. -
eval_safe_builtin_mapping
: (Added in v0.37) A default list of builtin functions/variables, which are not at__builtin__
s root level, but mapped as if. They are mathematical functions considered 'safe'.
-
ip
: Tools for ip addresses-
binary_ip_to_str(host)
: converts the binary ip to a string.
-
-
mod_wsgi
-
reloader
: Auto reloading capabilities for mod_wsgi environments. (v0.28+)
-
Package of some regular expressions I found useful.
-
github
-
REPO_NAME_REGEX
: Repo name validation. (Since1 v0.40) -
AT_USERNAME_REGEX
: Searches @usernames. (Since v0.40; added match groupuser
in v0.41) -
FILE_URL_REGEX
: Matches github urls pointing to files or directories.(Since1 v0.40; added match groupprotocol
in v54) -
SIMPLE_URL_REGEX
: Matches github urls. (Added in v0.54+) Matching groups:- url: the complete url
- protocol:
'https://'
or'http://'
or empty/non-existent - user: git user or organisation
- repo: the repository
- path: When existent, this is not the project page (root of master)
- kind: blob or tree
- branch: the name of the branch (kind=tree), or the commit hash (kind=blob)
- file: the rest of the filepath (from root of that branch, can be empty)
- protocol:
- hash: Can be non-existent or empty. Everything behind the '#'
- url: the complete url
-
-
url
-
URL_REGEX
: Matching URLs. Based on dperini's MIT licensed Gist (Added in v0.58) -
youtube
:-
YOUTUBE_REGEX
: Matches youtube videos. The matching groupvid
contains the video id.
-
-
Utilities for the telegram bots (pytgbot and/or teleflask).
-
gitinfo
: Parse git meta information written by a deploy script. -
language
: Helper for loading language files (classes). v0.64+ -
peer
: Tools for handling chats and users. v0.74+-
chat
: Tools for chats.-
format
: Formatting related chat tools.-
format_chat(chat: Chat)
: Formats a channel for html, escaping username and title.
-
-
-
user
: Tools for chats.-
format
: Formatting related chat tools.-
format_user(user: User, ...)
: Formats a user for html, escaping html tags where needed. -
retrieve_and_format_user(user_id, ...)
: Retrieves a user from telegram, and formats it withformat_user(...)
.
-
-
rights
: User permission related tools.-
is_admin(...)
: Checks if a user has admin privileges, and optionally a specified right. -
retrieve_and_is_admin(...)
: Retrieves info about a user in a chat from telegram, and callsis_admin(...)
.
-
-
-
String manipulation, etc.
-
split_in_parts(string, parts, strict=False)
: v0.48+ Splits a string in givenparts
pieces.
Additions to the great stuff in the typing
module. Python 3+ it seems.
-
JSONType
: The stuff returned byjson.loads(str)
. v0.73+
compat
v0.58
Detecting versions and stuff. For string compatibility use .encoding
.
-
py2
:True
if is python 2,False
otherwise. -
py3
:True
if is python 3,False
otherwise.
(added in v0.20)
- class
BetterHTTPRequestHandler
- Like the
BaseHTTPRequestHandler
, but without output tostderr
, (why would anyone do that?!?). Instead it goes to loggers. Also some helpfull things. - Changed to use logging
-
log_message
now useslogger.info
-
log_request
writes tologger.debug
, to not spam you on every request. -
log_error
useslogger.error
-
- Added a
write_text(self, msg, content_type="text/plain", is_binary=False)
function to make answering with text/data easy.-
msg
: The text to send to the browser/client. -
content_type
: Optional. If you don't like it to be text, change that here. -
is_binary
: Optional. Text (unicode) needs to be converted to binary. If you already have binary (e.g. an PNG as binary data) you can set that here. - returns nothing.
-
- Modified
translate_path
: Now accepts local fitting paths automatically, e.g. "/path/to/www-dir/foo.png" is valid if that folder exists. Now it won't change the path to "/path/to/www-dir/foo.png/path/to/www-dir/foo.png", like it did before. - Added a
parse_POST
function to get the post request's data fields returned.
- Like the
-
start_a_webserver(handler, port, host="")
. Starts aHTTPServer
, using the givenhandler
.-
handler
: An handler instance, e.g. anBetterHTTPRequestHandler
-
port
: The port where to serve on. For example80
or8080
for HTTP (80
often needs root privileges). -
host
: Optional. A host where to serve on. If an empty string""
(default) is given, all incoming connections are allowed. (you can connect from localhost, from lan, from internet, etc.) - returns: The
HTTPServer
created.
-
-
regex.github.REPO_NAME_REGEX
andregex.github.FILE_URL_REGEX
where already present in v0.38 asregex.urls.github.REPO_NAME_REGEX
andregex.urls.github.GITHUB_FILE_REGEX
. -
exceptions.assert_type_or_raise
was already present in v0.46 asexceptions.assert_or_raise
. - **