├── README.md ├── .gitignore ├── setup.cfg ├── speedyio ├── entities │ ├── __init__.py │ └── item.py ├── basic │ ├── info.py │ ├── error.py │ ├── success.py │ ├── bold_print.py │ ├── plain_print.py │ ├── __init__.py │ ├── yesno.py │ ├── askfor.py │ └── chooseone.py ├── interactive │ ├── plain_print.py │ ├── info.py │ ├── error.py │ ├── bold_print.py │ ├── success.py │ ├── __init__.py │ ├── yesno.py │ ├── askfor.py │ └── chooseone.py ├── __init__.py └── errors.py ├── requirements.txt └── setup.py /README.md: -------------------------------------------------------------------------------- 1 | # speedyio 2 | --- 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | *py[co] 3 | venv 4 | build 5 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | description-file = README.md 3 | -------------------------------------------------------------------------------- /speedyio/entities/__init__.py: -------------------------------------------------------------------------------- 1 | from .item import Item 2 | -------------------------------------------------------------------------------- /speedyio/basic/info.py: -------------------------------------------------------------------------------- 1 | def info(message): 2 | print(message) 3 | -------------------------------------------------------------------------------- /speedyio/basic/error.py: -------------------------------------------------------------------------------- 1 | def error(message): 2 | print(message) 3 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | blessings==1.6 2 | inquirer==2.1.11 3 | readchar==0.7 4 | -------------------------------------------------------------------------------- /speedyio/basic/success.py: -------------------------------------------------------------------------------- 1 | def success(message): 2 | print(message) 3 | -------------------------------------------------------------------------------- /speedyio/basic/bold_print.py: -------------------------------------------------------------------------------- 1 | def bold_print(message): 2 | print(message) 3 | -------------------------------------------------------------------------------- /speedyio/basic/plain_print.py: -------------------------------------------------------------------------------- 1 | def plain_print(message): 2 | print(message) 3 | -------------------------------------------------------------------------------- /speedyio/interactive/plain_print.py: -------------------------------------------------------------------------------- 1 | def plain_print(message): 2 | print(message) 3 | -------------------------------------------------------------------------------- /speedyio/__init__.py: -------------------------------------------------------------------------------- 1 | from blessings import Terminal 2 | 3 | 4 | terminal = Terminal() 5 | -------------------------------------------------------------------------------- /speedyio/interactive/info.py: -------------------------------------------------------------------------------- 1 | from speedyio import terminal 2 | 3 | 4 | def info(message): 5 | print(terminal.blue_bold(message)) 6 | -------------------------------------------------------------------------------- /speedyio/entities/item.py: -------------------------------------------------------------------------------- 1 | class Item: 2 | def __init__(self, label, item): 3 | self.label = label 4 | self.item = item 5 | -------------------------------------------------------------------------------- /speedyio/interactive/error.py: -------------------------------------------------------------------------------- 1 | from speedyio import terminal 2 | 3 | 4 | def error(message): 5 | print(terminal.red_bold(message)) 6 | -------------------------------------------------------------------------------- /speedyio/interactive/bold_print.py: -------------------------------------------------------------------------------- 1 | from speedyio import terminal 2 | 3 | 4 | def bold_print(message): 5 | print(terminal.bold(message)) 6 | -------------------------------------------------------------------------------- /speedyio/interactive/success.py: -------------------------------------------------------------------------------- 1 | from speedyio import terminal 2 | 3 | 4 | def success(message): 5 | print(terminal.green_bold(message)) 6 | -------------------------------------------------------------------------------- /speedyio/basic/__init__.py: -------------------------------------------------------------------------------- 1 | from .info import info 2 | from .error import error 3 | from .yesno import yesno 4 | from .askfor import askfor 5 | from .success import success 6 | from .chooseone import chooseone 7 | from .bold_print import bold_print 8 | from .plain_print import plain_print 9 | from speedyio.entities import Item 10 | from speedyio.errors import SpeedyIOError 11 | -------------------------------------------------------------------------------- /speedyio/interactive/__init__.py: -------------------------------------------------------------------------------- 1 | from .info import info 2 | from .error import error 3 | from .yesno import yesno 4 | from .askfor import askfor 5 | from .success import success 6 | from .chooseone import chooseone 7 | from .bold_print import bold_print 8 | from .plain_print import plain_print 9 | from speedyio.entities import Item 10 | from speedyio.errors import SpeedyIOError 11 | -------------------------------------------------------------------------------- /speedyio/basic/yesno.py: -------------------------------------------------------------------------------- 1 | from speedyio.errors import SpeedyIOInputError 2 | 3 | 4 | def yesno(message, default=False): 5 | try: 6 | x = input(message + "(yes/no): ") 7 | except KeyboardInterrupt: 8 | raise SpeedyIOInputError("No input given!") 9 | 10 | if x.lower() in ['yes', 'y']: 11 | return True 12 | 13 | if x.lower() in ['no', 'n']: 14 | return False 15 | 16 | return default 17 | -------------------------------------------------------------------------------- /speedyio/interactive/yesno.py: -------------------------------------------------------------------------------- 1 | from speedyio.errors import SpeedyIOInputError 2 | 3 | 4 | def yesno(message, default=False): 5 | try: 6 | x = input(message + "(yes/no): ") 7 | except KeyboardInterrupt: 8 | raise SpeedyIOInputError("No input given!") 9 | 10 | if x.lower() in ['yes', 'y']: 11 | return True 12 | 13 | if x.lower() in ['no', 'n']: 14 | return False 15 | 16 | return default 17 | -------------------------------------------------------------------------------- /speedyio/basic/askfor.py: -------------------------------------------------------------------------------- 1 | from speedyio.errors import SpeedyIOInputError 2 | 3 | 4 | def askfor(message, empty_allowed=True, default=None): 5 | if default: 6 | message += "({})".format(default) 7 | 8 | while True: 9 | try: 10 | x = input(message + ": ") 11 | except KeyboardInterrupt: 12 | raise SpeedyIOInputError("No input given!") 13 | 14 | if empty_allowed is True: return x 15 | if default and not x: x = default 16 | if x: return x 17 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from distutils.core import setup 2 | from setuptools import find_packages 3 | 4 | 5 | setup( 6 | name = 'speedyio', 7 | packages = find_packages(), 8 | version = '0.4', 9 | description = 'Input from console made easy and interactive for Python', 10 | author = 'Arpit Bhayani', 11 | author_email = 'arpit.b.bhayani@gmail.com', 12 | url = 'https://github.com/arpitbbhayani/speedyio', 13 | download_url = 'https://github.com/arpitbbhayani/speedyio', 14 | keywords = ['io', 'cli'], 15 | classifiers = [], 16 | install_requires = [ 17 | 'inquirer==2.1.11' 18 | ] 19 | ) 20 | -------------------------------------------------------------------------------- /speedyio/interactive/askfor.py: -------------------------------------------------------------------------------- 1 | import inquirer 2 | from speedyio import terminal 3 | from speedyio.errors import SpeedyIOInputError 4 | 5 | 6 | def askfor(message, empty_allowed=True, default=None): 7 | message = terminal.bold(message) 8 | if default: 9 | message += "({})".format(default) 10 | 11 | questions = [ 12 | inquirer.Text('value', message=message) 13 | ] 14 | 15 | while True: 16 | answers = inquirer.prompt(questions) 17 | if answers is None: 18 | raise SpeedyIOInputError("No input given!") 19 | 20 | x = answers['value'] 21 | if empty_allowed is True: 22 | return answers.get('value') 23 | 24 | if default and not x: x = default 25 | 26 | if x: return x 27 | -------------------------------------------------------------------------------- /speedyio/errors.py: -------------------------------------------------------------------------------- 1 | class SpeedyIOError(Exception): 2 | def __init__(self, error_code, description): 3 | Exception.__init__(self) 4 | self.error_code = error_code 5 | self.description = description 6 | 7 | def jsonify(self): 8 | return { 9 | 'error_code': self.error_code, 10 | 'description': self.description 11 | } 12 | 13 | def __str__(self): 14 | return "({}) {}".format(self.error_code, self.description) 15 | 16 | 17 | class SpeedyIOTypeError(SpeedyIOError): 18 | def __init__(self, message): 19 | SpeedyIOError.__init__(self, 'SPEEDYIO_TYPE_ERROR', message) 20 | 21 | 22 | class SpeedyIOInputError(SpeedyIOError): 23 | def __init__(self, message): 24 | SpeedyIOError.__init__(self, 'SPEEDYIO_INPUT_ERROR', message) 25 | -------------------------------------------------------------------------------- /speedyio/interactive/chooseone.py: -------------------------------------------------------------------------------- 1 | import inquirer 2 | 3 | from speedyio import terminal 4 | from speedyio.entities import Item 5 | from speedyio.errors import SpeedyIOTypeError 6 | 7 | 8 | def chooseone(options, message="Select one"): 9 | if type(options) != list: 10 | raise SpeedyIOTypeError("Options to choose from should be a list") 11 | 12 | if len(options) == 0: 13 | raise SpeedyIOTypeError("Options cannot be empty") 14 | 15 | if len(options) > 0 and type(options[0]) != Item: 16 | raise SpeedyIOTypeError("Every item of options should be a SelectableItem") 17 | 18 | questions = [ 19 | inquirer.List('value', 20 | message=terminal.bold(message), 21 | choices=[(terminal.bold(c.label), c.item) for c in options], 22 | ) 23 | ] 24 | 25 | answers = inquirer.prompt(questions) 26 | return answers['value'] 27 | -------------------------------------------------------------------------------- /speedyio/basic/chooseone.py: -------------------------------------------------------------------------------- 1 | from speedyio.errors import SpeedyIOTypeError 2 | from speedyio.entities import Item 3 | 4 | 5 | def chooseone(options, message="Select one"): 6 | if type(options) != list: 7 | raise SpeedyIOTypeError("Options to choose from should be a list") 8 | 9 | if len(options) == 0: 10 | raise SpeedyIOTypeError("Options cannot be empty") 11 | 12 | if len(options) > 0 and type(options[0]) != Item: 13 | raise SpeedyIOTypeError("Every item of options should be a SelectableItem") 14 | 15 | print("") 16 | for i in range(len(options)): 17 | print(" {}. {}".format(i+1, options[i].label)) 18 | print("") 19 | 20 | while True: 21 | index = input(message + ": ") 22 | 23 | try: 24 | index = int(index) 25 | except: 26 | print("Invalid selection. Please choose a correct option.") 27 | continue 28 | 29 | if index <= 0 or index > len(options): 30 | print("Invalid selection. Please choose a correct option.") 31 | continue 32 | 33 | return options[index-1].item 34 | --------------------------------------------------------------------------------