mirror of
https://github.com/kennethreitz/replit-py.git
synced 2026-06-05 23:10:18 +00:00
Pull from master into dev
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
version: v1.0
|
||||
name: Python
|
||||
agent:
|
||||
machine:
|
||||
type: e1-standard-2
|
||||
os_image: ubuntu1804
|
||||
blocks:
|
||||
- name: Lint
|
||||
task:
|
||||
jobs:
|
||||
- name: flake8
|
||||
commands:
|
||||
- sem-version python 3.8
|
||||
- checkout --use-cache
|
||||
- python -m pip install --upgrade poetry
|
||||
- poetry install
|
||||
- git diff origin/master | poetry run flake8 --diff
|
||||
@@ -6,7 +6,7 @@ Replit-py is a python library designed to be run from a repl on [repl.it](https:
|
||||
|
||||
- Fully featured database client for Repl DB
|
||||
- Audio library which can play tones and files
|
||||
- Clear the terminal
|
||||
- Terminal Utillity library which can create and clear colors better than most libaries
|
||||
|
||||
### Documentation
|
||||
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
"""The replit python module."""
|
||||
from . import maqpy
|
||||
from . import termutils
|
||||
from .audio import Audio
|
||||
from .database import db
|
||||
|
||||
|
||||
def clear() -> None:
|
||||
"""Clear the terminal."""
|
||||
print("\033[H\033[2J", end="", flush=True)
|
||||
|
||||
|
||||
|
||||
audio = Audio()
|
||||
|
||||
+22
-22
@@ -58,29 +58,29 @@ class Link(HTMLElement):
|
||||
|
||||
|
||||
class Page(flask.Response):
|
||||
"""Represents an HTML page."""
|
||||
"""Represents an HTML page."""
|
||||
|
||||
def __init__(self, title: str = None, head: str = "", body: str = "") -> None:
|
||||
"""Initialize the class.
|
||||
def __init__(self, title: str = None, head: str = "", body: str = "") -> None:
|
||||
"""Initialize the class.
|
||||
|
||||
Args:
|
||||
title (str): The title of the page. If not provided no title tag will be sent.
|
||||
head (str): The HTML to put in the head of the page. Defaults to nothing.
|
||||
body (str): The HTML to put in the body of the page. Defaults to nothing.
|
||||
"""
|
||||
self.title = title
|
||||
self.head = head
|
||||
self.body = body
|
||||
Args:
|
||||
title (str): The title of the page. If not provided no title tag will be sent.
|
||||
head (str): The HTML to put in the head of the page. Defaults to nothing.
|
||||
body (str): The HTML to put in the body of the page. Defaults to nothing.
|
||||
"""
|
||||
self.title = title
|
||||
self.head = head
|
||||
self.body = body
|
||||
|
||||
title_html = f"<title>{self.title}</title>\n " if self.title else ""
|
||||
super().__init__(
|
||||
title_html = f"<title>{self.title}</title>\n " if self.title else ""
|
||||
super().__init__(
|
||||
f"""<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
{title_html}{self.head}
|
||||
</head>
|
||||
<body>
|
||||
{self.body}
|
||||
</body>
|
||||
</html>"""
|
||||
)
|
||||
<html>
|
||||
<head>
|
||||
{title_html}{self.head}
|
||||
</head>
|
||||
<body>
|
||||
{self.body}
|
||||
</body>
|
||||
</html>"""
|
||||
)
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
"""Pure Python ANSI Color Escape Code generator."""
|
||||
import colorsys
|
||||
|
||||
|
||||
def clear() -> None:
|
||||
"""Clear the terminal."""
|
||||
print("\033[H\033[2J", end="", flush=True)
|
||||
|
||||
|
||||
class Color:
|
||||
"""Dynamic Color: Accepts RGB Color."""
|
||||
|
||||
def __init__(self, r: int, g: int, b: int) -> None:
|
||||
|
||||
"""
|
||||
Generate an ANSI escape code for color
|
||||
|
||||
Args:
|
||||
r (int): Amount of red in color
|
||||
g (int): Amount of green in color
|
||||
b (int): Amount of blue in color
|
||||
|
||||
Raises:
|
||||
ValueError
|
||||
"""
|
||||
|
||||
if r < 0 or g < 0 or b < 0:
|
||||
raise ValueError("No Color Support for colors under 0")
|
||||
if r > 255 or g > 255 or b > 255:
|
||||
raise ValueError("No Color Support for colors over 255")
|
||||
|
||||
self.rgb = (r, g, b)
|
||||
self.fg = f"\033[38;2;{r};{g};{b}m"
|
||||
self.bg = f"\033[48;2;{r};{g};{b}m"
|
||||
|
||||
@classmethod
|
||||
def hexdec(cls, hexvalue: str) -> None:
|
||||
"""
|
||||
Convert Hex Value to RGB
|
||||
then generate an ANSI escape code
|
||||
|
||||
Args:
|
||||
hexvalue (str): The color's hex value
|
||||
|
||||
Raises:
|
||||
ValueError
|
||||
|
||||
Returns:
|
||||
color : RGB colors from Hex Value
|
||||
"""
|
||||
|
||||
try:
|
||||
hexvalue = hexvalue.lstrip("#")
|
||||
r, g, b = tuple(int(hexvalue[i : i + 2], 16) for i in (0, 2, 4))
|
||||
except Exception as e:
|
||||
raise ValueError(f"Error while converting Hex to RGB - {e}")
|
||||
|
||||
return cls(r, g, b)
|
||||
|
||||
@classmethod
|
||||
def hsv(cls, h, s, v) -> None:
|
||||
"""
|
||||
Convert Hex Value to RGB
|
||||
then generate an ANSI escape code
|
||||
|
||||
Args:
|
||||
hexvalue (str): The color's hex value
|
||||
|
||||
Raises:
|
||||
ValueError
|
||||
|
||||
Returns:
|
||||
color : RGB colors from Hex Value
|
||||
"""
|
||||
try:
|
||||
r, g, b = colorsys.hsv_to_rgb(h, s, v)
|
||||
except:
|
||||
raise ValueError("Converting HSV to RGB ran into an error")
|
||||
|
||||
return cls(r, g, b)
|
||||
|
||||
@classmethod
|
||||
def hls(cls, h, l, s):
|
||||
"""
|
||||
Convert Hex Value to RGB
|
||||
then generate an ANSI escape code
|
||||
|
||||
Args:
|
||||
hexvalue (str): The color's hex value
|
||||
|
||||
Raises:
|
||||
ValueError
|
||||
|
||||
Returns:
|
||||
color : RGB colors from Hex Value
|
||||
"""
|
||||
try:
|
||||
r, g, b = colorsys.hls_to_rgb(h, s, v)
|
||||
except:
|
||||
raise ValueError("Converting HLS to RGB ran into an error")
|
||||
|
||||
return cls(r, g, b)
|
||||
|
||||
|
||||
class Bit:
|
||||
def __init__(self, value: int) -> None:
|
||||
"""
|
||||
Use a 8bit colorpallete
|
||||
colors from 0-255 (256 total)
|
||||
|
||||
Args:
|
||||
value (int): A color value from 0 to 255
|
||||
|
||||
Raises:
|
||||
ValueError
|
||||
"""
|
||||
|
||||
if value > 255:
|
||||
raise ValueError("8 Bit Pallete - No Color Support for Colors over 255")
|
||||
if value < 0:
|
||||
raise ValueError("8 Bit Pallete - No Color Support for colors under 0")
|
||||
|
||||
self.fg = f"\033[38;5;{value}m"
|
||||
self.bg = f"\033[48;5;{value}m"
|
||||
|
||||
|
||||
attributes = { # use only repl.it supported ansi codes. Codes such as blink do not work.
|
||||
"reset": 0,
|
||||
"bold": 1,
|
||||
"faint": 2,
|
||||
"italic": 3,
|
||||
"underline": 4,
|
||||
"highlight": 7,
|
||||
}
|
||||
|
||||
|
||||
class Attr:
|
||||
def __init__(self, attrib: str) -> None:
|
||||
"""
|
||||
Custom Attributes such as bold and italic
|
||||
Returns ANSI Escape
|
||||
|
||||
Args:
|
||||
attrib (str): Special Styles for characters
|
||||
|
||||
Raises:
|
||||
ValueError
|
||||
"""
|
||||
|
||||
if attrib in attributes:
|
||||
self.attr = f"\033[{attributes[attrib]}m"
|
||||
else:
|
||||
raise ValueError(f"Attributes - {attrib} is not supported.")
|
||||
|
||||
|
||||
reset = Attr("reset").attr
|
||||
bold = Attr("bold").attr
|
||||
italic = Attr("italic").attr
|
||||
red = Color(255, 0, 0)
|
||||
orange = Color(255, 165, 0)
|
||||
yellow = Color(255, 255, 0)
|
||||
green = Color(0, 255, 0)
|
||||
blue = Color(0, 0, 255)
|
||||
indigo = Color(75, 0, 130)
|
||||
violet = Color(238, 130, 238)
|
||||
purple = Color(128, 0, 128)
|
||||
pink = Color(255, 105, 180)
|
||||
brown = Color(165, 42, 42)
|
||||
brightred = Color(250, 128, 114)
|
||||
brightorange = Color(255, 215, 0)
|
||||
brightyellow = Color(255, 255, 102)
|
||||
brightgreen = Color(102, 255, 102)
|
||||
brightblue = Color(102, 178, 255)
|
||||
brightpurple = Color(178, 102, 255)
|
||||
darkred = Color(139, 0, 0)
|
||||
darkorange = Color(255, 140, 0)
|
||||
darkyellow = Color(204, 204, 0)
|
||||
darkgreen = Color(0, 153, 0)
|
||||
darkblue = Color(0, 0, 204)
|
||||
darkpurple = Color(102, 0, 204)
|
||||
Reference in New Issue
Block a user