From cfbefeb8814cbf08030ec92e72ab5e3bc58bcbff Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Wed, 6 Oct 2021 08:14:43 +0200 Subject: [PATCH] GitHub Action to lint Python code Test results: https://github.com/cclauss/DesktopAssitant/actions --- .github/workflows/lint_python.yml | 23 ++++++ Jarvis2.py | 123 +++++++++++++++-------------- Jarvis2_4windows.py | 127 ++++++++++++++++-------------- 3 files changed, 157 insertions(+), 116 deletions(-) create mode 100644 .github/workflows/lint_python.yml diff --git a/.github/workflows/lint_python.yml b/.github/workflows/lint_python.yml new file mode 100644 index 0000000..c3b9dc0 --- /dev/null +++ b/.github/workflows/lint_python.yml @@ -0,0 +1,23 @@ +name: lint_python +on: [pull_request, push] +jobs: + lint_python: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + - run: pip install --upgrade pip wheel + - run: pip install bandit black codespell flake8 flake8-bugbear + flake8-comprehensions isort mypy pytest pyupgrade safety + - run: bandit --recursive --skip B311,B605 . + - run: black --check . || true + - run: codespell + - run: flake8 . --count --max-complexity=19 --max-line-length=88 --show-source --statistics + - run: isort --check-only --profile black . + - run: pip install -r requirements.txt || pip install --editable . || true + - run: mkdir --parents --verbose .mypy_cache + - run: mypy --ignore-missing-imports --install-types --non-interactive . + - run: pytest . || true + - run: pytest --doctest-modules . || true + - run: shopt -s globstar && pyupgrade --py36-plus **/*.py + - run: safety check diff --git a/Jarvis2.py b/Jarvis2.py index dcd3bed..e2710c8 100644 --- a/Jarvis2.py +++ b/Jarvis2.py @@ -1,39 +1,45 @@ -import pyttsx3 -import speech_recognition as sr import datetime -import wikipedia -import webbrowser import os +import random import smtplib import sys -import random +import webbrowser + +import pyttsx3 +import speech_recognition as sr +import wikipedia print("Initializing Jarvis....") MASTER = "Harsha" -engine = pyttsx3.init('nsss') -voices = engine.getProperty('voices') -engine.setProperty('voice', voices[0].id) -popular_websites = {'google': 'https://www.google.com', - 'youtube': 'https://www.youtube.com', - 'wikipedia': 'https://www.wikipedia.org', - 'amazon': 'https://www.amazon.com'} -search_engines = {'google': 'https://www.google.com', - 'youtube': 'https://www.youtube.com', - 'bing': 'https://www.bing.com'} +engine = pyttsx3.init("nsss") +voices = engine.getProperty("voices") +engine.setProperty("voice", voices[0].id) +popular_websites = { + "google": "https://www.google.com", + "youtube": "https://www.youtube.com", + "wikipedia": "https://www.wikipedia.org", + "amazon": "https://www.amazon.com", +} +search_engines = { + "google": "https://www.google.com", + "youtube": "https://www.youtube.com", + "bing": "https://www.bing.com", +} def open_url(url): webbrowser.open(url) - chrome_path = 'open -a /Applications/Google\ Chrome.app %s' + chrome_path = r"open -a /Applications/Google\ Chrome.app %s" webbrowser.get(chrome_path).open(url) + def search(search_query, search_engine): try: - open_url(f'{search_engines[search_engine]}/search?q={search_query}') + open_url(f"{search_engines[search_engine]}/search?q={search_query}") except IndexError: - open_url(f'https://www.google.com/search?q={search_query}') + open_url(f"https://www.google.com/search?q={search_query}") def speak(text): @@ -58,6 +64,7 @@ def wishMe(): # This is where our programme begins.... + def takeCommand(): r = sr.Recognizer() with sr.Microphone() as source: @@ -68,7 +75,7 @@ def takeCommand(): query = " " try: print("Recognizing....") - query = r.recognize_google(audio, language='en-in') + query = r.recognize_google(audio, language="en-in") print("user said: " + query) except sr.UnknownValueError: @@ -87,70 +94,72 @@ wishMe() query = takeCommand() # logic for executing basic tasks -if 'wikipedia' in query.lower(): - speak('Searching wikipedia....') +if "wikipedia" in query.lower(): + speak("Searching wikipedia....") query = query.replace("wikipedia", "") results = wikipedia.summary(query, sentences=2) print(results) speak(results) -elif "what\'s up" in query or 'how are you' in query: - stMsgs = ['Just doing my thing!', 'I am fine!', - 'Nice!', 'I am nice and full of energy'] +elif "what's up" in query or "how are you" in query: + stMsgs = [ + "Just doing my thing!", + "I am fine!", + "Nice!", + "I am nice and full of energy", + ] speak(random.choice(stMsgs)) -elif 'open' in query.lower(): - website = query.replace('open', '').strip().lower() +elif "open" in query.lower(): + website = query.replace("open", "").strip().lower() try: open_url(popular_websites[website]) - except IndexError: # If the website is unknown - print(f'Unknown website: {website}') - speak(f'Sorry, i don\'t know the website {website}') + except IndexError: # If the website is unknown + print(f"Unknown website: {website}") + speak(f"Sorry, i don't know the website {website}") -elif 'search' in query.lower(): - search_query = query.split('for')[-1] - search_engine = query.split('for')[0].replace('search', '').strip().lower() +elif "search" in query.lower(): + search_query = query.split("for")[-1] + search_engine = query.split("for")[0].replace("search", "").strip().lower() search(search_query, search_engine) - -elif 'email' in query: - speak('Who is the recipient? ') +elif "email" in query: + speak("Who is the recipient? ") recipient = takeCommand() - if 'me' in recipient: + if "me" in recipient: try: - speak('What should I say? ') + speak("What should I say? ") content = takeCommand() - server = smtplib.SMTP('smtp.gmail.com', 587) + server = smtplib.SMTP("smtp.gmail.com", 587) server.ehlo() server.starttls() - server.login("Your_Username", 'Your_Password') - server.sendmail('Your_Username', "Recipient_Username", content) + server.login("Your_Username", "Your_Password") + server.sendmail("Your_Username", "Recipient_Username", content) server.close() - speak('Email sent!') + speak("Email sent!") + except Exception: + speak("Sorry Sir! I am unable to send your message at this moment!") - except: - speak('Sorry Sir! I am unable to send your message at this moment!') - -elif 'nothing' in query or 'abort' in query or 'stop' in query: - speak('okay') - speak('Bye Sir, have a good day.') +elif "nothing" in query or "abort" in query or "stop" in query: + speak("okay") + speak("Bye Sir, have a good day.") sys.exit() -elif 'hello' in query: - speak('Hello Sir') +elif "hello" in query: + speak("Hello Sir") -elif 'bye' in query: - speak('Bye Sir, have a good day.') +elif "bye" in query: + speak("Bye Sir, have a good day.") sys.exit() -elif 'play music' in query: - music_folder = 'Your_music_folder_path(absolute_path)' - music = ['music1', 'music2', 'music3', 'music4','music5'] - random_music = music_folder + random.choice(music) + '.mp3' +elif "play music" in query: + music_folder = "Your_music_folder_path(absolute_path)" + music = ("music1", "music2", "music3", "music4", "music5") + random_music = music_folder + random.choice(music) + ".mp3" os.system(random_music) - speak('Playing your request') + speak("Playing your request") -speak('Next Command! Sir!') +speak("Next Command! Sir!") diff --git a/Jarvis2_4windows.py b/Jarvis2_4windows.py index 2435c33..bb9aa14 100644 --- a/Jarvis2_4windows.py +++ b/Jarvis2_4windows.py @@ -1,40 +1,46 @@ -import pyttsx3 -import speech_recognition as sr import datetime -import wikipedia -import webbrowser -import os +import random import smtplib import sys -import random +import webbrowser + +import pyttsx3 +import speech_recognition as sr +import wikipedia from pygame import mixer + mixer.init() print("Initializing Jarvis....") MASTER = "Tony Stark" -engine = pyttsx3.init('sapi5') # -voices = engine.getProperty('voices') -engine.setProperty('voice', voices[0].id) -popular_websites = {'google': 'https://www.google.com', - 'youtube': 'https://www.youtube.com', - 'wikipedia': 'https://www.wikipedia.org', - 'amazon': 'https://www.amazon.com'} -search_engines = {'google': 'https://www.google.com', - 'youtube': 'https://www.youtube.com', - 'bing': 'https://www.bing.com'} +engine = pyttsx3.init("sapi5") +voices = engine.getProperty("voices") +engine.setProperty("voice", voices[0].id) +popular_websites = { + "google": "https://www.google.com", + "youtube": "https://www.youtube.com", + "wikipedia": "https://www.wikipedia.org", + "amazon": "https://www.amazon.com", +} +search_engines = { + "google": "https://www.google.com", + "youtube": "https://www.youtube.com", + "bing": "https://www.bing.com", +} def open_url(url): webbrowser.open(url) - chrome_path = 'open -a /Applications/Google\ Chrome.app %s' + chrome_path = r"open -a /Applications/Google\ Chrome.app %s" webbrowser.get(chrome_path).open(url) + def search(search_query, search_engine): try: - open_url(f'{search_engines[search_engine]}/search?q={search_query}') + open_url(f"{search_engines[search_engine]}/search?q={search_query}") except IndexError: - open_url(f'https://www.google.com/search?q={search_query}') + open_url(f"https://www.google.com/search?q={search_query}") def speak(text): @@ -68,7 +74,7 @@ def takeCommand(): query = " " try: print("Recognizing....") - query = r.recognize_google(audio, language='en-in') + query = r.recognize_google(audio, language="en-in") print("user said: " + query) except sr.UnknownValueError: @@ -88,78 +94,81 @@ while True: query = takeCommand() # logic for executing basic tasks - if 'wikipedia' in query.lower(): - speak('Searching wikipedia....') + if "wikipedia" in query.lower(): + speak("Searching wikipedia....") query = query.replace("wikipedia", "") results = wikipedia.summary(query, sentences=2) print(results) speak(results) - elif "what\'s up" in query or 'how are you' in query: - stMsgs = ['Just doing my thing!', 'I am fine!', - 'Nice!', 'I am nice and full of energy'] + elif "what's up" in query or "how are you" in query: + stMsgs = [ + "Just doing my thing!", + "I am fine!", + "Nice!", + "I am nice and full of energy", + ] speak(random.choice(stMsgs)) - elif 'open' in query.lower(): - website = query.replace('open', '').strip().lower() + elif "open" in query.lower(): + website = query.replace("open", "").strip().lower() try: open_url(popular_websites[website]) - except IndexError: # If the website is unknown - print(f'Unknown website: {website}') - speak(f'Sorry, i don\'t know the website {website}') + except IndexError: # If the website is unknown + print(f"Unknown website: {website}") + speak(f"Sorry, i don't know the website {website}") - elif 'search' in query.lower(): - search_query = query.split('for')[-1] - search_engine = query.split('for')[0].replace('search', '').strip().lower() + elif "search" in query.lower(): + search_query = query.split("for")[-1] + search_engine = query.split("for")[0].replace("search", "").strip().lower() search(search_query, search_engine) - elif 'mail' in query: - speak('Who is the recipient? ') + elif "mail" in query: + speak("Who is the recipient? ") recipient = takeCommand() - if 'me' in recipient: + if "me" in recipient: try: - speak('What should I say? ') + speak("What should I say? ") content = takeCommand() - server = smtplib.SMTP('smtp.gmail.com', 587) + server = smtplib.SMTP("smtp.gmail.com", 587) server.ehlo() server.starttls() - server.login("Your_Username", 'Your_Password') - server.sendmail('Your_Username', "Recipient_Username", content) + server.login("Your_Username", "Your_Password") + server.sendmail("Your_Username", "Recipient_Username", content) server.close() - speak('Email sent!') + speak("Email sent!") + except Exception: + speak("Sorry Sir! I am unable to send your message at this moment!") - except: - speak('Sorry Sir! I am unable to send your message at this moment!') - - elif 'nothing' in query or 'abort' in query or 'stop' in query: - speak('okay') - speak('Bye Sir, have a good day.') + elif "nothing" in query or "abort" in query or "stop" in query: + speak("okay") + speak("Bye Sir, have a good day.") sys.exit() - elif 'hello' in query: - speak('Hello Sir') + elif "hello" in query: + speak("Hello Sir") - elif 'bye' in query: - speak('Bye Sir, have a good day.') + elif "bye" in query: + speak("Bye Sir, have a good day.") sys.exit() - elif 'play music' in query: + elif "play music" in query: music_folder = "Your_music_folder_path(absolute_path)" - music = ['music1', 'music2', 'music3', 'music4'] - random_music = music_folder + random.choice(music) + '.mp3' - speak('Playing your request') + music = ("music1", "music2", "music3", "music4") + random_music = music_folder + random.choice(music) + ".mp3" + speak("Playing your request") mixer.music.load(random_music) mixer.music.play() - elif 'pause music' in query: + elif "pause music" in query: mixer.music.pause() - elif 'stop music' in query: + elif "stop music" in query: mixer.music.stop() - elif 'unpause' in query: + elif "unpause" in query: mixer.music.unpause() - speak('Next Command! Sir!') + speak("Next Command! Sir!")