From e3d454523cd281bd4ed6f2db939dc4f95646dc94 Mon Sep 17 00:00:00 2001 From: Michael Vieira Date: Mon, 7 Mar 2022 10:29:35 +0100 Subject: [PATCH] Remove the old code to give place to the new one --- README.md | 61 +------------ cambak/__init__.py | 1 - cambak/__main__.py | 51 ----------- cambak/backup.py | 91 -------------------- cambak/cameras/Sony.py | 23 ----- cambak/cameras/__init__.py | 31 ------- cambak/scanner.py | 29 ------- poetry.lock | 170 ------------------------------------- pyproject.toml | 28 ------ 9 files changed, 1 insertion(+), 484 deletions(-) delete mode 100644 cambak/__init__.py delete mode 100644 cambak/__main__.py delete mode 100644 cambak/backup.py delete mode 100644 cambak/cameras/Sony.py delete mode 100644 cambak/cameras/__init__.py delete mode 100644 cambak/scanner.py delete mode 100644 poetry.lock delete mode 100644 pyproject.toml diff --git a/README.md b/README.md index 0bbd0af..2fb7d14 100644 --- a/README.md +++ b/README.md @@ -1,60 +1 @@ -# CamBak -This small tool automate the derushing process of your SD Cards for all your -cameras. - -CamBak sort all your files from your SD Card per date, camera and per type of -media and copy it to your computer or on a network volume. Here's is the -destination architecture: -``` -/ *destination_folder* -├── *date_of_shots (example: 2020-02-13)* -│   └── *camera_name* -│   ├── Pictures -│   ├── RAW -│   └── Videos -``` - -## Supported cameras architectures - * Sony (tested with NEX6 and HDR-AS series, a6400 and AS100V) - -If a camera is not supported, you can create a new file on the `cameras` -folder with the brand name, add a class inherited of `Camera` and add each -paths and extensions for each type of medias (glog can be used for paths). - -Here's is an example for Sony NEX cameras (file `Sony.py`): -```python -class SonyNex(Camera): - """General support for Sony NEX cameras (Alpha 5, 6, 7 and 9)""" - - img_folders = ["DCIM/*MSDCF"] - raw_folders = img_folders - vid_folders = ["PRIVATE/M4ROOT/CLIP"] - - img_extensions = [".JPG"] - raw_extensions = [".ARW"] - vid_extensions = [".MP4"] -``` - -## Usage -``` -➜ python cambak --help -usage: cambak [-h] -t TYPE -n NAME [-f] src dest - -positional arguments: - src Source folder (mounted card/usb camera volume) - dest Destination folder (local, network volume) - -optional arguments: - -h, --help show this help message and exit - -t TYPE, --type TYPE Type of camera - -n NAME, --name NAME Name of the camera - -f, --force Override if file already exists in the dest folder -``` - -Example: -```bash -cambak /mnt/sd-card /mnt/moon-smb/cam-backups -t SonyNex -n A6400 -``` - -## Installation -WIP \ No newline at end of file +# Cambak diff --git a/cambak/__init__.py b/cambak/__init__.py deleted file mode 100644 index 53f33c8..0000000 --- a/cambak/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from cambak.__main__ import main_cli diff --git a/cambak/__main__.py b/cambak/__main__.py deleted file mode 100644 index 4c2fb27..0000000 --- a/cambak/__main__.py +++ /dev/null @@ -1,51 +0,0 @@ -import argparse -import signal - -from cambak.backup import backup_camera -from cambak.cameras import get_all_cameras - - -def keyboardInterruptHandler(signal, frame): - print("KeyboardInterrupt has been caught. Cleaning up...") - exit(125) - - -def main_cli(): - parser = argparse.ArgumentParser() - parser.add_argument( - "src", help="Source folder (mounted card/usb camera volume)", type=str - ) - - parser.add_argument( - "dest", help="Destination folder (local, network volume)", type=str - ) - - parser.add_argument( - "-t", "--type", help="Type of camera", type=str, required=True - ) - parser.add_argument( - "-n", "--name", help="Name of the camera", type=str, required=True - ) - - parser.add_argument( - "-f", - "--force", - action="store_true", - help="Override if file already exists in the dest folder", - ) - - args = parser.parse_args() - cameras_types = get_all_cameras() - - signal.signal(signal.SIGINT, keyboardInterruptHandler) - backup_camera( - args.src, - args.dest, - args.name, - cameras_types.get(args.type, None), - args.force, - ) - - -if __name__ == "__main__": - main_cli() diff --git a/cambak/backup.py b/cambak/backup.py deleted file mode 100644 index ac15cb3..0000000 --- a/cambak/backup.py +++ /dev/null @@ -1,91 +0,0 @@ -import copy as cp - -from os import path, mkdir -from glob import glob -from shutil import copy - -from .cameras import Camera -from .scanner import scan_folder - - -def backup_camera( - src: str, - dest: str, - name: str, - type_: Camera, - force: bool = False, - **kwargs -): - def get_fullpaths(paths): - existing_files = [] - - for p in paths: - fullpaths = glob(path.join(src, p)) - - for fullpath in fullpaths: - if path.isdir(fullpath): - existing_files.append(fullpath) - else: - print("%s not exists. Skipping it.") - - return existing_files - - files = [] - dates = set() - src_path = {} - - # Generate folder pictures fullpaths - src_path["Pictures"] = get_fullpaths(type_.img_folders) - src_path["RAW"] = get_fullpaths(type_.raw_folders) - src_path["Videos"] = get_fullpaths(type_.vid_folders) - - # Check if the dest folder exists - if path.isdir(dest) is False: - raise IOError("Destination folder doesn't exists.") - - # Get all files categorized - for folder_type, folders in src_path.items(): - if folder_type == "Pictures": - extensions = type_.img_extensions - elif folder_type == "RAW": - extensions = type_.raw_extensions - elif folder_type == "Videos": - extensions = type_.vid_extensions - - for p in folders: - files.extend(scan_folder(p, extensions, folder_type)) - - # Get all dates and create all folders - for _, date, _ in files: - if date not in dates: - dates.add(date) - date_path = path.join(dest, date) - - if not path.exists(date_path): - mkdir(date_path) - mkdir(path.join(date_path, name)) - mkdir(path.join(date_path, name, "Pictures")) - mkdir(path.join(date_path, name, "RAW")) - mkdir(path.join(date_path, name, "Videos")) - - total_files = len(files) - remaining_files = cp.copy(total_files) - print("Total of %s files to copy." % total_files) - - # Copy all files in their correct folders - for f, date, f_type in files: - remaining_files -= 1 - dest_path = path.join(dest, date, name, f_type) - basename = path.basename(path.join(dest_path, f)) - - if (force is False and not path.exists(basename)) or (force is True): - try: - print( - "Copying %s - Remaining: %s/%s" - % (f, remaining_files, total_files) - ) - copy(f, dest_path) - except Exception as err: - print( - "!!! Unable to copy %r file. Cause: \n\t%s" % (f, str(err)) - ) diff --git a/cambak/cameras/Sony.py b/cambak/cameras/Sony.py deleted file mode 100644 index d0d7a62..0000000 --- a/cambak/cameras/Sony.py +++ /dev/null @@ -1,23 +0,0 @@ -from . import Camera - - -class SonyNex(Camera): - """General support for Sony NEX cameras (Alpha 5, 6, 7 and 9)""" - - img_folders = ["DCIM/*MSDCF"] - raw_folders = img_folders - vid_folders = ["PRIVATE/M4ROOT/CLIP"] - - img_extensions = [".JPG"] - raw_extensions = [".ARW"] - vid_extensions = [".MP4"] - - -class SonyAlpha(SonyNex): - """Shortcut for Sony Alpha cameras""" - - -class SonyHDR(SonyNex): - """ - Support for Sony "HDR" Actions cams. Similar to the Sony NEX architecture. - """ diff --git a/cambak/cameras/__init__.py b/cambak/cameras/__init__.py deleted file mode 100644 index 61a0725..0000000 --- a/cambak/cameras/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -class Camera: - """Abstract class of Camera.""" - - img_folders = None - raw_folders = None - vid_folders = None - - img_extensions = None - raw_extensions = None - vid_extensions = None - - -def get_all_cameras(): - import pkgutil, importlib, inspect - - cameras = {} - - for _, modname, _ in pkgutil.walk_packages( - path=__path__, prefix=__name__ + ".", onerror=lambda x: None - ): - modulesource = importlib.import_module(modname) - for module in inspect.getmembers(modulesource, inspect.isclass): - class_name = module[0] - - if not cameras.get(class_name): - cameras[class_name] = module[1] - - # Pop the 'Camera' abstract class - cameras.pop("Camera", None) - - return cameras diff --git a/cambak/scanner.py b/cambak/scanner.py deleted file mode 100644 index 29d9bf4..0000000 --- a/cambak/scanner.py +++ /dev/null @@ -1,29 +0,0 @@ -import os - -from os import path -from datetime import datetime - - -def scan_folder(src, extensions, type_): - files = [] - exts = [] - - # Ensure all extensions are in lower case - for ext in extensions: - exts.append(ext.lower()) - - for f in os.listdir(src): - fullpath = path.join(src, f) - extension = path.splitext(f)[-1].lower() - - if path.isdir(fullpath): - files.extend(scan_folder()) - - if extension in exts: - created_at = datetime.fromtimestamp( - os.stat(fullpath).st_ctime - ).strftime("%Y-%m-%d") - - files.append((fullpath, created_at, type_)) - - return files diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 4e9bf96..0000000 --- a/poetry.lock +++ /dev/null @@ -1,170 +0,0 @@ -[[package]] -category = "dev" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -name = "appdirs" -optional = false -python-versions = "*" -version = "1.4.3" - -[[package]] -category = "dev" -description = "Classes Without Boilerplate" -name = "attrs" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "19.3.0" - -[package.extras] -azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] -dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] -docs = ["sphinx", "zope.interface"] -tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] - -[[package]] -category = "dev" -description = "The uncompromising code formatter." -name = "black" -optional = false -python-versions = ">=3.6" -version = "19.10b0" - -[package.dependencies] -appdirs = "*" -attrs = ">=18.1.0" -click = ">=6.5" -pathspec = ">=0.6,<1" -regex = "*" -toml = ">=0.9.4" -typed-ast = ">=1.4.0" - -[package.extras] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] - -[[package]] -category = "dev" -description = "Composable command line interface toolkit" -name = "click" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "7.0" - -[[package]] -category = "dev" -description = "Utility library for gitignore style pattern matching of file paths." -name = "pathspec" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.7.0" - -[[package]] -category = "dev" -description = "Python style guide checker" -name = "pycodestyle" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.5.0" - -[[package]] -category = "dev" -description = "Alternative regular expression module, to replace re." -name = "regex" -optional = false -python-versions = "*" -version = "2020.2.20" - -[[package]] -category = "dev" -description = "Python Library for Tom's Obvious, Minimal Language" -name = "toml" -optional = false -python-versions = "*" -version = "0.10.0" - -[[package]] -category = "dev" -description = "a fork of Python 2 and 3 ast modules with type comment support" -name = "typed-ast" -optional = false -python-versions = "*" -version = "1.4.1" - -[metadata] -content-hash = "218462978afaca7637b90545a77c6a55f29f3bf09c79d6b456b41ab1350fb123" -python-versions = ">=3.6" - -[metadata.files] -appdirs = [ - {file = "appdirs-1.4.3-py2.py3-none-any.whl", hash = "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"}, - {file = "appdirs-1.4.3.tar.gz", hash = "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92"}, -] -attrs = [ - {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, - {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, -] -black = [ - {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, - {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, -] -click = [ - {file = "Click-7.0-py2.py3-none-any.whl", hash = "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13"}, - {file = "Click-7.0.tar.gz", hash = "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"}, -] -pathspec = [ - {file = "pathspec-0.7.0-py2.py3-none-any.whl", hash = "sha256:163b0632d4e31cef212976cf57b43d9fd6b0bac6e67c26015d611a647d5e7424"}, - {file = "pathspec-0.7.0.tar.gz", hash = "sha256:562aa70af2e0d434367d9790ad37aed893de47f1693e4201fd1d3dca15d19b96"}, -] -pycodestyle = [ - {file = "pycodestyle-2.5.0-py2.py3-none-any.whl", hash = "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56"}, - {file = "pycodestyle-2.5.0.tar.gz", hash = "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"}, -] -regex = [ - {file = "regex-2020.2.20-cp27-cp27m-win32.whl", hash = "sha256:99272d6b6a68c7ae4391908fc15f6b8c9a6c345a46b632d7fdb7ef6c883a2bbb"}, - {file = "regex-2020.2.20-cp27-cp27m-win_amd64.whl", hash = "sha256:974535648f31c2b712a6b2595969f8ab370834080e00ab24e5dbb9d19b8bfb74"}, - {file = "regex-2020.2.20-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5de40649d4f88a15c9489ed37f88f053c15400257eeb18425ac7ed0a4e119400"}, - {file = "regex-2020.2.20-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:82469a0c1330a4beb3d42568f82dffa32226ced006e0b063719468dcd40ffdf0"}, - {file = "regex-2020.2.20-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d58a4fa7910102500722defbde6e2816b0372a4fcc85c7e239323767c74f5cbc"}, - {file = "regex-2020.2.20-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f1ac2dc65105a53c1c2d72b1d3e98c2464a133b4067a51a3d2477b28449709a0"}, - {file = "regex-2020.2.20-cp36-cp36m-win32.whl", hash = "sha256:8c2b7fa4d72781577ac45ab658da44c7518e6d96e2a50d04ecb0fd8f28b21d69"}, - {file = "regex-2020.2.20-cp36-cp36m-win_amd64.whl", hash = "sha256:269f0c5ff23639316b29f31df199f401e4cb87529eafff0c76828071635d417b"}, - {file = "regex-2020.2.20-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:bed7986547ce54d230fd8721aba6fd19459cdc6d315497b98686d0416efaff4e"}, - {file = "regex-2020.2.20-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:046e83a8b160aff37e7034139a336b660b01dbfe58706f9d73f5cdc6b3460242"}, - {file = "regex-2020.2.20-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:b33ebcd0222c1d77e61dbcd04a9fd139359bded86803063d3d2d197b796c63ce"}, - {file = "regex-2020.2.20-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bba52d72e16a554d1894a0cc74041da50eea99a8483e591a9edf1025a66843ab"}, - {file = "regex-2020.2.20-cp37-cp37m-win32.whl", hash = "sha256:01b2d70cbaed11f72e57c1cfbaca71b02e3b98f739ce33f5f26f71859ad90431"}, - {file = "regex-2020.2.20-cp37-cp37m-win_amd64.whl", hash = "sha256:113309e819634f499d0006f6200700c8209a2a8bf6bd1bdc863a4d9d6776a5d1"}, - {file = "regex-2020.2.20-cp38-cp38-manylinux1_i686.whl", hash = "sha256:25f4ce26b68425b80a233ce7b6218743c71cf7297dbe02feab1d711a2bf90045"}, - {file = "regex-2020.2.20-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9b64a4cc825ec4df262050c17e18f60252cdd94742b4ba1286bcfe481f1c0f26"}, - {file = "regex-2020.2.20-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:9ff16d994309b26a1cdf666a6309c1ef51ad4f72f99d3392bcd7b7139577a1f2"}, - {file = "regex-2020.2.20-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c7f58a0e0e13fb44623b65b01052dae8e820ed9b8b654bb6296bc9c41f571b70"}, - {file = "regex-2020.2.20-cp38-cp38-win32.whl", hash = "sha256:200539b5124bc4721247a823a47d116a7a23e62cc6695744e3eb5454a8888e6d"}, - {file = "regex-2020.2.20-cp38-cp38-win_amd64.whl", hash = "sha256:7f78f963e62a61e294adb6ff5db901b629ef78cb2a1cfce3cf4eeba80c1c67aa"}, - {file = "regex-2020.2.20.tar.gz", hash = "sha256:9e9624440d754733eddbcd4614378c18713d2d9d0dc647cf9c72f64e39671be5"}, -] -toml = [ - {file = "toml-0.10.0-py2.7.egg", hash = "sha256:f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3"}, - {file = "toml-0.10.0-py2.py3-none-any.whl", hash = "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"}, - {file = "toml-0.10.0.tar.gz", hash = "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c"}, -] -typed-ast = [ - {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, - {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, - {file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"}, - {file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"}, - {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, - {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, - {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, - {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, - {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, - {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, - {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, - {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, - {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, - {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, - {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, - {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, - {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, - {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, - {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, - {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, - {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, -] diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index c77b470..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,28 +0,0 @@ -[tool.poetry] -name = "cambak" -version = "0.1.1" -description = "Simple tool for automating the derushing process of your cameras" -authors = ["Michael Vieira "] -license = "MIT" -repository = "https://github.com/Themimitoof/cambak.git" -readme = "README.md" - -[tool.poetry.dependencies] -python = ">=3.6" - -[tool.poetry.dev-dependencies] -black = {version = "^19.10b0", allow-prereleases = true} -pycodestyle = "^2.5.0" - -[tool.poetry.scripts] -cambak = 'cambak:main_cli' - -[tool.black] -line-length = 79 -skip-string-normalization = false -include = '\.py$' - - -[build-system] -requires = ["poetry>=0.12"] -build-backend = "poetry.masonry.api"