%global _empty_manifest_terminate_build 0
Name: python-toolbox
Version: 1.11.0
Release: 1
Summary: Extends Python with useful features.
License: MIT
URL: https://github.com/synchronizing/toolbox
Source0: https://mirrors.nju.edu.cn/pypi/web/packages/54/42/27357827649818b5b6cc86c1b90138e4016b1dd6e469c6b05ae0374ed95e/toolbox-1.11.0.tar.gz
BuildArch: noarch
%description
# 🧰 Toolbox
Toolbox is a small (~0.2MB) set of tools that expands the [Python Standard Library](https://docs.python.org/3/library/).
## Installing
```
pip install toolbox
```
## Documentation
Documentation can be found [**here**](http://synchronizing.github.io/toolbox/).
## Tools
### `asyncio`
future_lru_cache
— lru_cache
for async functions.
```python
from toolbox import future_lru_cache
import asyncio
@future_lru_cache
async def func():
await asyncio.sleep(10)
return 42
async def main():
await func() # Runs once.
await func() # Returns cached value.
asyncio.run(main())
````
to_thread
— Run a synchronous function in a separate thread.
```python
from toolbox import to_thread
import asyncio
import time
def func():
time.sleep(2)
return "Hello world"
async def main():
await to_thread(func)
asyncio.run(main())
````
awaitable
— Convert synchronous function to an async function via thread.
Leverages the `to_thread` function above.
```python
from toolbox import awaitable
import asyncio
import time
@awaitable
def func():
time.sleep(2)
return "Hello world"
async def main():
await func()
asyncio.run(func())
```
tls_handshake
— Perform TLS handshake with a stream reader & writer.
```python
from toolbox import tls_handshake
import asyncio
async def client():
reader, writer = await asyncio.open_connection("httpbin.org", 443, ssl=False)
await tls_handshake(reader=reader, writer=writer)
# Communication is now encrypted.
asyncio.run(client())
```
CoroutineClass
— Class pattern for implementing object-based coroutines.
Pattern for creating a coroutine-like class that has multiple ways to start it.
```python
from toolbox import CoroutineClass
import asyncio
class Coroutine(CoroutineClass):
def __init__(self, run: bool = False):
super().__init__(run=run)
# Default entry function.
async def entry(self):
await asyncio.sleep(1)
return "Hello world"
# Start coroutine outside Python async context.
def iomain():
# via __init__
coro = Coroutine(run=True)
print(coro.result) # Hello world
# via .run()
coro = Coroutine()
result = coro.run()
print(result) # Hello world
# Start coroutine inside Python async context.
async def aiomain():
# via __init__
coro = Coroutine(run=True)
await asyncio.sleep(1)
coro.stop()
print(coro.result) # None - because process was stopped before completion.
# via .run()
coro = Coroutine()
coro.run()
await asyncio.sleep(1)
result = coro.stop() # None - because coroutine was stopped before completion.
print(result) # Hello world
# via await
coro = Coroutine()
result = await coro # You can also start, and await later.
print(result) # Hello World
# via context manager
async with Coroutine() as coro:
result = await coro
print(result) # Hello World
```
### `builtins`
classproperty
— Decorator for defining a method as a property and classmethod.
Allows access to computed class attributes.
```python
from toolbox import classproperty
class Animal:
@classproperty
def dog(cls):
return "whoof!"
print(Animal.dog) # 'whoof!'
```
### `collections`
Item
— An interface for type-agnostic operations between different types.
```python
from toolbox import Item
item = Item(100)
print(item == b"100" == "100" == 100) # True
```
nestednamedtuple
— Creates a nested namedtuple
.
```python
from toolbox import nestednamedtuple
nt = nestednamedtuple({"hello": {"ola": "mundo"}})
print(nt) # namedtupled(hello=namedtupled(ola='mundo'))
print(nt.hello.ola) # mundo
```
fdict
— Forces nestednamedtuple
to not convert dict
to namedtuple
.
```python
from toolbox import nestednamedtuple, fdict
d = {"hello": "world"}
nt = nestednamedtuple({"forced": fdict(d), "notforced": d})
print(nt.notforced) # namedtupled(hello='world')
print(nt.forced) # {'hello': 'world'}
```
BidirectionalDict
— Dictionary with two-way capabilities.
```python
from toolbox import BidirectionalDict
d = BidirectionalDict({"hello": "world"})
print(d) # {'hello': 'world', 'world': 'hello'}
```
ObjectDict
— Dictionary that can be accessed as though it was an object.
```python
from toolbox import ObjectDict
d = ObjectDict({"hello": "world"})
print(d.hello) # 'world'
```
OverloadedDict
— Dictionary that can be added or subtracted to.
```python
from toolbox import OverloadedDict
d1 = OverloadedDict({"hello": "world"})
d2 = OverloadedDict({"ola": "mundo"})
d1 += d2
print(d1) # {'hello': 'world', 'ola': 'mundo'}
d1 -= d2
print(d1) # {'hello': 'world'}
```
UnderscoreAccessDict
— Dictionary with underscore access.
```python
from toolbox import UnderscoreAccessDict
d = UnderscoreAccessDict({"hello": "world"})
print(d.hello) # 'world'
```
FrozenDict
— Dictionary that is frozen.
```python
from toolbox import FrozenDict
d = FrozenDict({"hello": "world"})
d["hello"] = "mundo" # KeyError: Cannot set key and value because this is a frozen dictionary.
```
MultiEntryDict
— Dictionary that can have multiple entries for the same key.
```python
from toolbox import MultiEntryDict
d = MultiEntryDict({"hello": "world"})
d["hello"] = "mundo"
print(d) # {'hello': ['world', 'mundo']}
```
ItemDict
— Dictionary that utilizes Item
for key and values.
```python
from toolbox import ItemDict, Item
d = ItemDict({"100": "one hundred"})
print(d[100]) # one hundred
print(d[100] == d['100'] == d[b'100'] == d[Item(100)]) # True
```
All `*Dict` types above can be combined together (as mixins) to create unique dictionary types.
### `config`
make_config
— Stores configuration dictionary in-memory.
Creates a global configuration that can be accessed by other portions of the code via `conf` or `config` function calls. Minimizes the need to create `Config` objects and pass them around different modules, classes, functions, etc.
```python
from toolbox import make_config
make_config(hello="world")
```
config
— Access in-memory configuration as dictionary.
```python
from toolbox import config
print(config()['hello']) # 'world'
```
conf
— Access in-memory configuration as nestednametuple
.
```python
from toolbox import conf
print(conf().hello) # 'world'
```
### `functools`
timeout
— Decorator to add timeout for synchronous and asychronous functions.
Decorator that adds support for synchronous and asynchronous function timeout. Quits function after an amount of time passes.
```python
from toolbox import timeout
import asyncio
import time
@timeout(seconds=1)
def func():
time.sleep(15)
@timeout(seconds=1)
async def func():
await asyncio.sleep(15)
```
### `pdb`
sprinkle
— Prints the line and file that this function was just called from.
```python
from toolbox.pdb.sprinkle import sprinkle
sprinkle() # >>> 3 this_file.py
sprinkle("hello", "world") # >>> 4 this_file.py hello world
```
### `pkgutil`
search_package
— Searches for packages installed in the system.
```python
from toolbox import search_package
print(search_package("toolbox", method="is"))
# {'toolbox': }
```
### `sockets`
is_ip
— Checks if a string is an IP address.
```python
from toolbox import is_ip
print(is_ip('127.0.0.1')) # True
print(is_ip('localhost')) # False
```
### `string`
ANSI Formatting — Color formatting.
Check documentation [here](https://synchronizing.github.io/toolbox/module/string.html#color) for further information on all built-in formats.
```python
from toolbox import bold, red
print(red("This text is red!"))
print(bold("This text is bolded!"))
```
Format
— Persistent ANSI formatter that takes a custom ANSI code.
```python
from toolbox import Format
bold = Format(code=1)
print(bold("hello world"))
```
Style
— Persistent ANSI formatter that allows multiple ANSI codes.
```python
from toolbox import Style, red, bold
error = Style(red, bold)
print(error("This is red & bolded error."))
```
supports_color
— Check's if the user's terminal supports color.
```python
from toolbox import supports_color
print(supports_color()) # True
```
strip_ansi
— Removes ANSI codes from string.
```python
from toolbox import strip_ansi
print(strip_ansi("\x1b[1mhello world\x1b[0m")) # hello world
```
### `textwrap`
unindent
— Removes indent and white-space from docstrings.
```python
from toolbox import unindent
def test():
text = """
hello world
this is a test
"""
print(text)
text = unindent(
"""
hello world
this is a test
"""
)
print(text)
test()
# hello world
# this is a test
#
# hello world
# this is a test
```
%package -n python3-toolbox
Summary: Extends Python with useful features.
Provides: python-toolbox
BuildRequires: python3-devel
BuildRequires: python3-setuptools
BuildRequires: python3-pip
%description -n python3-toolbox
# 🧰 Toolbox
Toolbox is a small (~0.2MB) set of tools that expands the [Python Standard Library](https://docs.python.org/3/library/).
## Installing
```
pip install toolbox
```
## Documentation
Documentation can be found [**here**](http://synchronizing.github.io/toolbox/).
## Tools
### `asyncio`
future_lru_cache
— lru_cache
for async functions.
```python
from toolbox import future_lru_cache
import asyncio
@future_lru_cache
async def func():
await asyncio.sleep(10)
return 42
async def main():
await func() # Runs once.
await func() # Returns cached value.
asyncio.run(main())
````
to_thread
— Run a synchronous function in a separate thread.
```python
from toolbox import to_thread
import asyncio
import time
def func():
time.sleep(2)
return "Hello world"
async def main():
await to_thread(func)
asyncio.run(main())
````
awaitable
— Convert synchronous function to an async function via thread.
Leverages the `to_thread` function above.
```python
from toolbox import awaitable
import asyncio
import time
@awaitable
def func():
time.sleep(2)
return "Hello world"
async def main():
await func()
asyncio.run(func())
```
tls_handshake
— Perform TLS handshake with a stream reader & writer.
```python
from toolbox import tls_handshake
import asyncio
async def client():
reader, writer = await asyncio.open_connection("httpbin.org", 443, ssl=False)
await tls_handshake(reader=reader, writer=writer)
# Communication is now encrypted.
asyncio.run(client())
```
CoroutineClass
— Class pattern for implementing object-based coroutines.
Pattern for creating a coroutine-like class that has multiple ways to start it.
```python
from toolbox import CoroutineClass
import asyncio
class Coroutine(CoroutineClass):
def __init__(self, run: bool = False):
super().__init__(run=run)
# Default entry function.
async def entry(self):
await asyncio.sleep(1)
return "Hello world"
# Start coroutine outside Python async context.
def iomain():
# via __init__
coro = Coroutine(run=True)
print(coro.result) # Hello world
# via .run()
coro = Coroutine()
result = coro.run()
print(result) # Hello world
# Start coroutine inside Python async context.
async def aiomain():
# via __init__
coro = Coroutine(run=True)
await asyncio.sleep(1)
coro.stop()
print(coro.result) # None - because process was stopped before completion.
# via .run()
coro = Coroutine()
coro.run()
await asyncio.sleep(1)
result = coro.stop() # None - because coroutine was stopped before completion.
print(result) # Hello world
# via await
coro = Coroutine()
result = await coro # You can also start, and await later.
print(result) # Hello World
# via context manager
async with Coroutine() as coro:
result = await coro
print(result) # Hello World
```
### `builtins`
classproperty
— Decorator for defining a method as a property and classmethod.
Allows access to computed class attributes.
```python
from toolbox import classproperty
class Animal:
@classproperty
def dog(cls):
return "whoof!"
print(Animal.dog) # 'whoof!'
```
### `collections`
Item
— An interface for type-agnostic operations between different types.
```python
from toolbox import Item
item = Item(100)
print(item == b"100" == "100" == 100) # True
```
nestednamedtuple
— Creates a nested namedtuple
.
```python
from toolbox import nestednamedtuple
nt = nestednamedtuple({"hello": {"ola": "mundo"}})
print(nt) # namedtupled(hello=namedtupled(ola='mundo'))
print(nt.hello.ola) # mundo
```
fdict
— Forces nestednamedtuple
to not convert dict
to namedtuple
.
```python
from toolbox import nestednamedtuple, fdict
d = {"hello": "world"}
nt = nestednamedtuple({"forced": fdict(d), "notforced": d})
print(nt.notforced) # namedtupled(hello='world')
print(nt.forced) # {'hello': 'world'}
```
BidirectionalDict
— Dictionary with two-way capabilities.
```python
from toolbox import BidirectionalDict
d = BidirectionalDict({"hello": "world"})
print(d) # {'hello': 'world', 'world': 'hello'}
```
ObjectDict
— Dictionary that can be accessed as though it was an object.
```python
from toolbox import ObjectDict
d = ObjectDict({"hello": "world"})
print(d.hello) # 'world'
```
OverloadedDict
— Dictionary that can be added or subtracted to.
```python
from toolbox import OverloadedDict
d1 = OverloadedDict({"hello": "world"})
d2 = OverloadedDict({"ola": "mundo"})
d1 += d2
print(d1) # {'hello': 'world', 'ola': 'mundo'}
d1 -= d2
print(d1) # {'hello': 'world'}
```
UnderscoreAccessDict
— Dictionary with underscore access.
```python
from toolbox import UnderscoreAccessDict
d = UnderscoreAccessDict({"hello": "world"})
print(d.hello) # 'world'
```
FrozenDict
— Dictionary that is frozen.
```python
from toolbox import FrozenDict
d = FrozenDict({"hello": "world"})
d["hello"] = "mundo" # KeyError: Cannot set key and value because this is a frozen dictionary.
```
MultiEntryDict
— Dictionary that can have multiple entries for the same key.
```python
from toolbox import MultiEntryDict
d = MultiEntryDict({"hello": "world"})
d["hello"] = "mundo"
print(d) # {'hello': ['world', 'mundo']}
```
ItemDict
— Dictionary that utilizes Item
for key and values.
```python
from toolbox import ItemDict, Item
d = ItemDict({"100": "one hundred"})
print(d[100]) # one hundred
print(d[100] == d['100'] == d[b'100'] == d[Item(100)]) # True
```
All `*Dict` types above can be combined together (as mixins) to create unique dictionary types.
### `config`
make_config
— Stores configuration dictionary in-memory.
Creates a global configuration that can be accessed by other portions of the code via `conf` or `config` function calls. Minimizes the need to create `Config` objects and pass them around different modules, classes, functions, etc.
```python
from toolbox import make_config
make_config(hello="world")
```
config
— Access in-memory configuration as dictionary.
```python
from toolbox import config
print(config()['hello']) # 'world'
```
conf
— Access in-memory configuration as nestednametuple
.
```python
from toolbox import conf
print(conf().hello) # 'world'
```
### `functools`
timeout
— Decorator to add timeout for synchronous and asychronous functions.
Decorator that adds support for synchronous and asynchronous function timeout. Quits function after an amount of time passes.
```python
from toolbox import timeout
import asyncio
import time
@timeout(seconds=1)
def func():
time.sleep(15)
@timeout(seconds=1)
async def func():
await asyncio.sleep(15)
```
### `pdb`
sprinkle
— Prints the line and file that this function was just called from.
```python
from toolbox.pdb.sprinkle import sprinkle
sprinkle() # >>> 3 this_file.py
sprinkle("hello", "world") # >>> 4 this_file.py hello world
```
### `pkgutil`
search_package
— Searches for packages installed in the system.
```python
from toolbox import search_package
print(search_package("toolbox", method="is"))
# {'toolbox': }
```
### `sockets`
is_ip
— Checks if a string is an IP address.
```python
from toolbox import is_ip
print(is_ip('127.0.0.1')) # True
print(is_ip('localhost')) # False
```
### `string`
ANSI Formatting — Color formatting.
Check documentation [here](https://synchronizing.github.io/toolbox/module/string.html#color) for further information on all built-in formats.
```python
from toolbox import bold, red
print(red("This text is red!"))
print(bold("This text is bolded!"))
```
Format
— Persistent ANSI formatter that takes a custom ANSI code.
```python
from toolbox import Format
bold = Format(code=1)
print(bold("hello world"))
```
Style
— Persistent ANSI formatter that allows multiple ANSI codes.
```python
from toolbox import Style, red, bold
error = Style(red, bold)
print(error("This is red & bolded error."))
```
supports_color
— Check's if the user's terminal supports color.
```python
from toolbox import supports_color
print(supports_color()) # True
```
strip_ansi
— Removes ANSI codes from string.
```python
from toolbox import strip_ansi
print(strip_ansi("\x1b[1mhello world\x1b[0m")) # hello world
```
### `textwrap`
unindent
— Removes indent and white-space from docstrings.
```python
from toolbox import unindent
def test():
text = """
hello world
this is a test
"""
print(text)
text = unindent(
"""
hello world
this is a test
"""
)
print(text)
test()
# hello world
# this is a test
#
# hello world
# this is a test
```
%package help
Summary: Development documents and examples for toolbox
Provides: python3-toolbox-doc
%description help
# 🧰 Toolbox
Toolbox is a small (~0.2MB) set of tools that expands the [Python Standard Library](https://docs.python.org/3/library/).
## Installing
```
pip install toolbox
```
## Documentation
Documentation can be found [**here**](http://synchronizing.github.io/toolbox/).
## Tools
### `asyncio`
future_lru_cache
— lru_cache
for async functions.
```python
from toolbox import future_lru_cache
import asyncio
@future_lru_cache
async def func():
await asyncio.sleep(10)
return 42
async def main():
await func() # Runs once.
await func() # Returns cached value.
asyncio.run(main())
````
to_thread
— Run a synchronous function in a separate thread.
```python
from toolbox import to_thread
import asyncio
import time
def func():
time.sleep(2)
return "Hello world"
async def main():
await to_thread(func)
asyncio.run(main())
````
awaitable
— Convert synchronous function to an async function via thread.
Leverages the `to_thread` function above.
```python
from toolbox import awaitable
import asyncio
import time
@awaitable
def func():
time.sleep(2)
return "Hello world"
async def main():
await func()
asyncio.run(func())
```
tls_handshake
— Perform TLS handshake with a stream reader & writer.
```python
from toolbox import tls_handshake
import asyncio
async def client():
reader, writer = await asyncio.open_connection("httpbin.org", 443, ssl=False)
await tls_handshake(reader=reader, writer=writer)
# Communication is now encrypted.
asyncio.run(client())
```
CoroutineClass
— Class pattern for implementing object-based coroutines.
Pattern for creating a coroutine-like class that has multiple ways to start it.
```python
from toolbox import CoroutineClass
import asyncio
class Coroutine(CoroutineClass):
def __init__(self, run: bool = False):
super().__init__(run=run)
# Default entry function.
async def entry(self):
await asyncio.sleep(1)
return "Hello world"
# Start coroutine outside Python async context.
def iomain():
# via __init__
coro = Coroutine(run=True)
print(coro.result) # Hello world
# via .run()
coro = Coroutine()
result = coro.run()
print(result) # Hello world
# Start coroutine inside Python async context.
async def aiomain():
# via __init__
coro = Coroutine(run=True)
await asyncio.sleep(1)
coro.stop()
print(coro.result) # None - because process was stopped before completion.
# via .run()
coro = Coroutine()
coro.run()
await asyncio.sleep(1)
result = coro.stop() # None - because coroutine was stopped before completion.
print(result) # Hello world
# via await
coro = Coroutine()
result = await coro # You can also start, and await later.
print(result) # Hello World
# via context manager
async with Coroutine() as coro:
result = await coro
print(result) # Hello World
```
### `builtins`
classproperty
— Decorator for defining a method as a property and classmethod.
Allows access to computed class attributes.
```python
from toolbox import classproperty
class Animal:
@classproperty
def dog(cls):
return "whoof!"
print(Animal.dog) # 'whoof!'
```
### `collections`
Item
— An interface for type-agnostic operations between different types.
```python
from toolbox import Item
item = Item(100)
print(item == b"100" == "100" == 100) # True
```
nestednamedtuple
— Creates a nested namedtuple
.
```python
from toolbox import nestednamedtuple
nt = nestednamedtuple({"hello": {"ola": "mundo"}})
print(nt) # namedtupled(hello=namedtupled(ola='mundo'))
print(nt.hello.ola) # mundo
```
fdict
— Forces nestednamedtuple
to not convert dict
to namedtuple
.
```python
from toolbox import nestednamedtuple, fdict
d = {"hello": "world"}
nt = nestednamedtuple({"forced": fdict(d), "notforced": d})
print(nt.notforced) # namedtupled(hello='world')
print(nt.forced) # {'hello': 'world'}
```
BidirectionalDict
— Dictionary with two-way capabilities.
```python
from toolbox import BidirectionalDict
d = BidirectionalDict({"hello": "world"})
print(d) # {'hello': 'world', 'world': 'hello'}
```
ObjectDict
— Dictionary that can be accessed as though it was an object.
```python
from toolbox import ObjectDict
d = ObjectDict({"hello": "world"})
print(d.hello) # 'world'
```
OverloadedDict
— Dictionary that can be added or subtracted to.
```python
from toolbox import OverloadedDict
d1 = OverloadedDict({"hello": "world"})
d2 = OverloadedDict({"ola": "mundo"})
d1 += d2
print(d1) # {'hello': 'world', 'ola': 'mundo'}
d1 -= d2
print(d1) # {'hello': 'world'}
```
UnderscoreAccessDict
— Dictionary with underscore access.
```python
from toolbox import UnderscoreAccessDict
d = UnderscoreAccessDict({"hello": "world"})
print(d.hello) # 'world'
```
FrozenDict
— Dictionary that is frozen.
```python
from toolbox import FrozenDict
d = FrozenDict({"hello": "world"})
d["hello"] = "mundo" # KeyError: Cannot set key and value because this is a frozen dictionary.
```
MultiEntryDict
— Dictionary that can have multiple entries for the same key.
```python
from toolbox import MultiEntryDict
d = MultiEntryDict({"hello": "world"})
d["hello"] = "mundo"
print(d) # {'hello': ['world', 'mundo']}
```
ItemDict
— Dictionary that utilizes Item
for key and values.
```python
from toolbox import ItemDict, Item
d = ItemDict({"100": "one hundred"})
print(d[100]) # one hundred
print(d[100] == d['100'] == d[b'100'] == d[Item(100)]) # True
```
All `*Dict` types above can be combined together (as mixins) to create unique dictionary types.
### `config`
make_config
— Stores configuration dictionary in-memory.
Creates a global configuration that can be accessed by other portions of the code via `conf` or `config` function calls. Minimizes the need to create `Config` objects and pass them around different modules, classes, functions, etc.
```python
from toolbox import make_config
make_config(hello="world")
```
config
— Access in-memory configuration as dictionary.
```python
from toolbox import config
print(config()['hello']) # 'world'
```
conf
— Access in-memory configuration as nestednametuple
.
```python
from toolbox import conf
print(conf().hello) # 'world'
```
### `functools`
timeout
— Decorator to add timeout for synchronous and asychronous functions.
Decorator that adds support for synchronous and asynchronous function timeout. Quits function after an amount of time passes.
```python
from toolbox import timeout
import asyncio
import time
@timeout(seconds=1)
def func():
time.sleep(15)
@timeout(seconds=1)
async def func():
await asyncio.sleep(15)
```
### `pdb`
sprinkle
— Prints the line and file that this function was just called from.
```python
from toolbox.pdb.sprinkle import sprinkle
sprinkle() # >>> 3 this_file.py
sprinkle("hello", "world") # >>> 4 this_file.py hello world
```
### `pkgutil`
search_package
— Searches for packages installed in the system.
```python
from toolbox import search_package
print(search_package("toolbox", method="is"))
# {'toolbox': }
```
### `sockets`
is_ip
— Checks if a string is an IP address.
```python
from toolbox import is_ip
print(is_ip('127.0.0.1')) # True
print(is_ip('localhost')) # False
```
### `string`
ANSI Formatting — Color formatting.
Check documentation [here](https://synchronizing.github.io/toolbox/module/string.html#color) for further information on all built-in formats.
```python
from toolbox import bold, red
print(red("This text is red!"))
print(bold("This text is bolded!"))
```
Format
— Persistent ANSI formatter that takes a custom ANSI code.
```python
from toolbox import Format
bold = Format(code=1)
print(bold("hello world"))
```
Style
— Persistent ANSI formatter that allows multiple ANSI codes.
```python
from toolbox import Style, red, bold
error = Style(red, bold)
print(error("This is red & bolded error."))
```
supports_color
— Check's if the user's terminal supports color.
```python
from toolbox import supports_color
print(supports_color()) # True
```
strip_ansi
— Removes ANSI codes from string.
```python
from toolbox import strip_ansi
print(strip_ansi("\x1b[1mhello world\x1b[0m")) # hello world
```
### `textwrap`
unindent
— Removes indent and white-space from docstrings.
```python
from toolbox import unindent
def test():
text = """
hello world
this is a test
"""
print(text)
text = unindent(
"""
hello world
this is a test
"""
)
print(text)
test()
# hello world
# this is a test
#
# hello world
# this is a test
```
%prep
%autosetup -n toolbox-1.11.0
%build
%py3_build
%install
%py3_install
install -d -m755 %{buildroot}/%{_pkgdocdir}
if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
pushd %{buildroot}
if [ -d usr/lib ]; then
find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
fi
if [ -d usr/lib64 ]; then
find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
fi
if [ -d usr/bin ]; then
find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
fi
if [ -d usr/sbin ]; then
find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
fi
touch doclist.lst
if [ -d usr/share/man ]; then
find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
fi
popd
mv %{buildroot}/filelist.lst .
mv %{buildroot}/doclist.lst .
%files -n python3-toolbox -f filelist.lst
%dir %{python3_sitelib}/*
%files help -f doclist.lst
%{_docdir}/*
%changelog
* Wed May 10 2023 Python_Bot - 1.11.0-1
- Package Spec generated