def main(argv=None): import getpass if argv is None: argv = sys.argv[1:] # argv[0] is program name if argv: url = argv[0] else: url = answer("Url to download") if not url: print("no url given.") sys.exit(0) if "use_login" not in settings or settings.use_login == -1: use_login = 1 if confirm( "Use login with pony.fm command?\nYou can automatically fave and comment songs, and/or your download stats will be updated.", default=False) else 0 settings.use_login = use_login settings.save_settings() logger.debug("Saved use_login.") if settings.use_login == 1: if "ponyfm_user" not in settings or not settings.ponyfm_user: default_username = getpass.getuser() username = answer("Username for pony.fm (poniverse.net)", default=default_username) settings.ponyfm_user = username settings.save_settings() logger.debug("Saved user.") else: username = settings.get("ponyfm_user") #end if store = Store(IDENTIFIER) if "ponyfm_pass" not in settings or not settings.ponyfm_pass: print( "Password for pony.fm (If your shell can't hide the input, a warning will be displayed)" ) __password = store.encrypt(getpass.getpass()) if confirm("Safe password?", default=True): settings.ponyfm_pass = __password settings.save_settings() logger.info("Saved password.") else: __password = settings.get("ponyfm_pass") #end if ponyfm = PonyFM(username, password=__password, key=store.key) else: ponyfm = PonyFM file = do_complete_load_if_matches(ponyfm, url, cover_as_file=True) print("File written to {path}".format(path=file)) if confirm("Open folder?", default=True): open_file_folder(file)
def main(argv=None): import getpass if argv is None: argv = sys.argv[1:] # argv[0] is program name if argv: url = argv[0] else: url = answer("Url to download") if not url: print("no url given.") sys.exit(0) if "use_login" not in settings or settings.use_login == -1: use_login = 1 if confirm("Use login with pony.fm command?\nYou can automatically fave and comment songs, and/or your download stats will be updated.", default=False) else 0 settings.use_login = use_login settings.save_settings() logger.debug("Saved use_login.") if settings.use_login == 1: if "ponyfm_user" not in settings or not settings.ponyfm_user: default_username = getpass.getuser() username = answer("Username for pony.fm (poniverse.net)", default=default_username) settings.ponyfm_user = username settings.save_settings() logger.debug("Saved user.") else: username = settings.get("ponyfm_user") #end if store = Store(IDENTIFIER) if "ponyfm_pass" not in settings or not settings.ponyfm_pass: print("Password for pony.fm (If your shell can't hide the input, a warning will be displayed)") __password = store.encrypt(getpass.getpass()) if confirm("Safe password?", default=True): settings.ponyfm_pass = __password settings.save_settings() logger.info("Saved password.") else: __password = settings.get("ponyfm_pass") #end if ponyfm = PonyFM(username, password=__password, key=store.key) else: ponyfm = PonyFM file = do_complete_load_if_matches(ponyfm, url, cover_as_file=True) print("File written to {path}".format(path=file)) if confirm("Open folder?", default=True): open_file_folder(file)
def get_filter(): filter = answer( "Only generate the doc for specific functions/classes. Comma seperated list. Leave empty to generate all.", default="" # getChat, leaveChat, getChatAdministrators, getChatMember, getChatMembersCount, Message, MessageEntity" ) if filter.strip(): filter = [x.strip() for x in filter.split(",")] else: filter = None # end if return filter
def get_folder_path(): file = answer("Folder path to store the results.", default="/tmp/pytgbotapi/") if file: try: file = abspath(file) mkdir_p(file) with open(path_join(file, "__init__.py"), "w") as f: f.write(FILE_HEADER) # end with except IOError: pass # end try # end if file return file
def get_folder_path(): default = "/tmp/pytgbotapi/" candidate = abspath(path_join(dirname(abspath(__file__)), 'output')) print(candidate) if exists(candidate) and isdir(candidate): default = candidate # end if file = answer("Folder path to store the results.", default=default) if file: try: file = abspath(file) mkdir_p(file) with open(path_join(file, "__init__.py"), "w") as f: f.write(FILE_HEADER) # end with except IOError: pass # end try # end if file return file
def main(API_KEY): if API_KEY is None: API_KEY = answer("Input API key") # get your bot instance. bot = Bot(API_KEY, return_python_objects=True) my_info=bot.get_me() print("Information about myself: {info}".format(info=my_info)) in_tread = Thread(target=get_updates, name="cli input thread", args=(bot,)) in_tread.daemon = True in_tread.start() notice = "You can enter commands now.\n" while True: cmd = input(notice) notice = "" # never display again. try: result_str = parse_input(bot, cmd) if result_str: print(result_str) except Exception as e: logger.exception("Error.") print("Error: " + str(e))
def main(API_KEY): if API_KEY is None: API_KEY = answer("Input API key") # get your bot instance. bot = Bot(API_KEY, return_python_objects=True) my_info = bot.get_me() print("Information about myself: {info}".format(info=my_info)) in_tread = Thread(target=get_updates, name="cli input thread", args=(bot, )) in_tread.daemon = True in_tread.start() notice = "You can enter commands now.\n" while True: cmd = input(notice) notice = "" # never display again. try: result_str = parse_input(bot, cmd) if result_str: print(result_str) except Exception as e: logger.exception("Error.") print("Error: " + str(e))
def load_from_html(folder): filter = get_filter() document = requests.get(BASE_URL) bs = BeautifulSoup(document.content) results = [] for h in bs.select("#dev_page_content > h4"): print("------") anchor = h.find(lol1) if not anchor or not anchor.has_attr("name"): continue link = "{base_url}#{anchor}".format(base_url=BASE_URL, anchor=anchor["name"]) title = h.text descr = [] table_type, param_strings = None, None print("title: " + title) print("link: " + link) if filter and title not in filter: print("Skipping {title}, filtered.".format(title=title)) continue # logger.debug(h) type_strings = [] default_returns = [] for sibling in h.next_siblings: if sibling == "\n": continue if sibling.name in ["p", "blockquote"]: if "return" in sibling.text.lower(): parts_splitted = [] is_first_element = True # truein string, for x in sibling.children: if isinstance(x, NavigableString): if is_first_element: # Start of a new sentence => new list parts_splitted.extend([[foo.lstrip()] for foo in x.split(".") ]) is_first_element = False else: # not = in the middle of a sentence => append parts_splitted[len(parts_splitted) - 1].append( x.split(".", maxsplit=1)[0]) parts_splitted.extend( [[foo] for foo in x.split(".")[1:]]) is_first_element = False is_first_element = x.strip().endswith(".") else: obj = None if x.name in ["a", "em"]: obj = x else: obj = x.text # end if if is_first_element: # if it is at the beginning of the sentence. parts_splitted.append([obj]) is_first_element = False else: parts_splitted[len(parts_splitted) - 1].append(obj) # end if # end for # end for returns__ = [] # array of strings return_text__ = [ ] # array if strings. one item = one sentence. Not ending with a dot. is_array = False for lol_part in parts_splitted: has_return = False returns_ = [] return_text_ = "" for lol_part_part in lol_part: if isinstance(lol_part_part, str): return_text_ += lol_part_part if lol_part_part.strip().lower().endswith( "array of"): is_array = True if "return" in lol_part_part.lower(): has_return = True # end if else: # not str return_text_ += lol_part_part.text if is_array: returns_.append("list of " + lol_part_part.text) is_array = False else: returns_.append(lol_part_part.text) # end for if has_return: # append, so we can have multible sentences. return_text__.append(return_text_.strip()) returns__.extend(returns_) # end if # end for if return_text__ or returns__: # finally set it. default_returns = [ ". ".join(return_text__).strip(), " or ".join(returns__).strip() ] # end if # end if descr.append(sibling.text.replace('“', '"').replace('”', '"')) elif sibling.name == "table": assert sibling.has_attr( "class") and "table" in sibling["class"] table_type, param_strings = parse_table(sibling) elif sibling.name == "h4": break elif sibling.name == "h3": break elif sibling.name == "hr": # end of page break else: print("unknown: " + sibling.name) # end if # end for if not all([link, title, descr]): print("Skipped: Missing link, title or description") continue if not all([table_type, param_strings]): if title not in WHITELISTED_FUNCS: print( "Skipped. Has no table with Parameters or Fields.\n" "Also isn't a whitelisted function in `code_generator_settings.WHITELISTED_FUNCS`." ) continue # -> else: is in WHITELISTED_FUNCS: table_type = "func" # end if descr = "\n".join(descr) print("descr: " + repr(descr)) params_string = "\n".join( param_strings ) if param_strings else None # WHITELISTED_FUNCS have no params if table_type == "func": seems_valid = False if len(default_returns) != 2: if "return" in descr.lower(): default_returns = ["", "Message"] default_returns[0] = [ x for x in descr.split(".") if "return" in x.lower() ][0].strip() seems_valid = len(default_returns[0].split(".")) == 1 default_returns[1] = " or ".join( type_strings) if type_strings else "Message" default_returns[1] = as_types(default_returns[1], "returns") else: default_returns = ["On success, True is returned", "True"] # end if "return" in description else: seems_valid = len(default_returns[0].split(".")) == 1 # end if default set replaced_valid = None # load replacements from WHITELISTED_FUNCS. if title in WHITELISTED_FUNCS: # "func": {'return': {'expected': '', 'replace': ''}, 'rtype': {'expected': '', 'replace': ''}}, wlist_func = WHITELISTED_FUNCS[title] wlist_func_return = wlist_func[ 'return'] if 'return' in wlist_func else None wlist_func_r_type = wlist_func[ 'r_type'] if 'r_type' in wlist_func else None if wlist_func_return and default_returns[ 0] != wlist_func_return['expected']: print( f"whitelist: Mismatch in return. Expected {wlist_func_return['expected']!r}, got {default_returns[0]!r}." ) replaced_valid = False if wlist_func_r_type and default_returns[ 1] != wlist_func_r_type['expected']: print( f"whitelist: Mismatch in r_type. Expected {wlist_func_r_type['expected']!r}, got {default_returns[1]!r}" ) replaced_valid = False if replaced_valid is None: # whitelist didn't fail replaced_valid = True print("the found return: " + repr(default_returns[0]) + '.') print("the found r_type: " + repr(default_returns[1]) + '.') print("whitelist return: " + repr(wlist_func_return['replace']) + '.') print("whitelist r_type: " + repr(wlist_func_r_type['replace']) + '.') default_returns[0] = wlist_func_return['replace'] default_returns[1] = wlist_func_r_type['replace'] if not seems_valid and not replaced_valid: returns = answer( "Textual description what the function returns", default_returns[0]) return_type = answer("Return type", default_returns[1]) if isinstance(return_type, str): return_type = as_types(return_type, "return type") # end if else: returns = default_returns[0] return_type = default_returns[1] # end if logger.debug("\n") result = func(title, descr, link, params_string, returns=returns, return_type=return_type) results.append(result) elif table_type == "class": if title in CLASS_TYPE_PATHS: parent_clazz = CLASS_TYPE_PATHS[title][ CLASS_TYPE_PATHS__PARENT] print("superclass: " + parent_clazz) else: parent_clazz = answer("Parent class name", "TgBotApiObject") # end if result = clazz(title, parent_clazz, descr, link, params_string) results.append(result) # end if # end for return results, document.content
def command_line_input(): from luckydonaldUtils.interactions import confirm, answer do_func = confirm( "Choose between generating function or class. Do you want a function?", True) if do_func: command = answer("Command (the Title)") description = answer("Description") link = answer("The link on the api page") params_string = "---" params_strings = [] while params_string != "": params_string = answer( "Parameters (sepereated by tabs, and new lines)\nParameters Type Required Description", "") if params_string and not params_string.strip() == "": params_strings.append(params_string) # end if # end while returns = answer("Textual description what the function returns", "On success, the sent Message is returned.") return_type = answer("Return type", "Message") print("\n") func(command, description, link, params_string, returns, return_type) else: clazze = answer("Class name") parent_clazz = answer("Parent class name", "object") description = answer("Description") link = answer("The link on the api page") params_string = "--" params_strings = [] while params_string != "": params_string = answer( "Parameters (sepereated by tabs, and new lines)\nParameters Type Description", "") if params_string and not params_string.strip() == "": params_strings.append(params_string) # end if # end while print("\n") clazz(clazze, parent_clazz, description, link, "\n".join(params_strings))
def main(): bot_template = get_template("bot.template") folder = get_folder_path() filter = get_filter() document = requests.get(BASE_URL) bs = BeautifulSoup(document.content) results = [] for h in bs.select("#dev_page_content > h4"): print("------") anchor = h.find(lol1) if not anchor or not anchor.has_attr("name"): continue link = "{base_url}#{anchor}".format(base_url=BASE_URL, anchor=anchor["name"]) title = h.text descr = [] table_type, param_strings = None, None print("title: " + title) print("link: " + link) if filter and title not in filter: print("Skipping {title}, filtered.".format(title=title)) continue # logger.debug(h) type_strings = [] default_returns = [] for sibling in h.next_siblings: if sibling == "\n": continue if sibling.name in ["p", "blockquote"]: if "return" in sibling.text.lower(): parts_splitted = [] is_first_element = True # truein string, for x in sibling.children: if isinstance(x, NavigableString): if is_first_element: # Start of a new sentence => new list parts_splitted.extend([[foo.lstrip()] for foo in x.split(".") ]) is_first_element = False else: # not = in the middle of a sentence => append parts_splitted[len(parts_splitted) - 1].append( x.split(".", maxsplit=1)[0]) parts_splitted.extend( [[foo] for foo in x.split(".")[1:]]) is_first_element = False is_first_element = x.strip().endswith(".") else: obj = None if x.name in ["a", "em"]: obj = x else: obj = x.text # end if if is_first_element: # if it is at the beginning of the sentence. parts_splitted.append([obj]) is_first_element = False else: parts_splitted[len(parts_splitted) - 1].append(obj) # end if # end for # end for returns__ = [] # array of strings return_text__ = [ ] # array if strings. one item = one sentence. Not ending with a dot. is_array = False for lol_part in parts_splitted: has_return = False returns_ = [] return_text_ = "" for lol_part_part in lol_part: if isinstance(lol_part_part, str): return_text_ += lol_part_part if lol_part_part.strip().lower().endswith( "array of"): is_array = True if "return" in lol_part_part.lower(): has_return = True # end if else: # not str return_text_ += lol_part_part.text if is_array: returns_.append("list of " + lol_part_part.text) is_array = False else: returns_.append(lol_part_part.text) # end for if has_return: # append, so we can have multible sentences. return_text__.append(return_text_.strip()) returns__.extend(returns_) # end if # end for if return_text__ or returns__: # finally set it. default_returns = (". ".join(return_text__).strip(), " or ".join(returns__).strip()) # end if # end if descr.append(sibling.text) elif sibling.name == "table": assert sibling.has_attr( "class") and "table" in sibling["class"] table_type, param_strings = parse_table(sibling) elif sibling.name == "h4": break elif sibling.name == "h3": break elif sibling.name == "hr": # end of page break else: print("unknown: " + sibling.name) # end if # end for if not all([link, title, descr]): print("Skipped: Missing link, title or description") continue if not all([table_type, param_strings]): if title not in WHITELISTED_FUNCS: print( "Skipped. Has no table with Parameters or Fields.\n" "Also isn't a whitelisted function in `code_generator_settings.WHITELISTED_FUNCS`." ) continue # -> else: is in WHITELISTED_FUNCS: table_type = "func" # end if descr = "\n".join(descr) print("descr: " + repr(descr)) params_string = "\n".join( param_strings ) if param_strings else None # WHITELISTED_FUNCS have no params if table_type == "func": seems_valid = False if len(default_returns) != 2: if "return" in descr.lower(): default_returns = ["", "Message"] default_returns[0] = [ x for x in descr.split(".") if "return" in x.lower() ][0].strip() seems_valid = len(default_returns[0].split(".")) == 1 default_returns[1] = " or ".join( type_strings) if type_strings else "Message" default_returns[1] = as_types(default_returns[1], "returns") else: default_returns = ("On success, True is returned", "True") # end if "return" in description else: seems_valid = len(default_returns[0].split(".")) == 1 # end if default set if not seems_valid: returns = answer( "Textual description what the function returns", default_returns[0]) return_type = answer("Return type", default_returns[1]) if isinstance(return_type, str): return_type = as_types(return_type, "return type") # end if else: returns = default_returns[0] return_type = default_returns[1] # end if logger.debug("\n") result = func(title, descr, link, params_string, returns=returns, return_type=return_type) results.append(result) elif table_type == "class": if title in CLASS_TYPE_PATHS: parent_clazz = CLASS_TYPE_PATHS[title][ CLASS_TYPE_PATHS__PARENT] print("superclass: " + parent_clazz) else: parent_clazz = answer("Parent class name", "TgBotApiObject") # end if result = clazz(title, parent_clazz, descr, link, params_string) results.append(result) # end if # end for can_quit = False do_overwrite = confirm( "Can the folder {path} be overwritten?".format(path=folder)) print("vvvvvvvvv") while not can_quit: if do_overwrite: try: import Send2Trash Send2Trash.send2trash(folder) except ImportError: import shutil shutil.rmtree(folder) # end try # end if try: safe_to_file(folder, results) print("Writen to file.") except TemplateError as e: if isinstance(e, TemplateSyntaxError): logger.exception("Template error at {file}:{line}".format( file=e.filename, line=e.lineno)) else: logger.exception("Template error.") # end if # end try can_quit = not confirm("Write again after reloading templates?", default=True) print("#########") print("Exit.")
def ask_for_apikey(self): return answer("Input your bot API key.")
def main(): bot_template = get_template("bot.template") folder = get_folder_path() filter = get_filter() document = requests.get(BASE_URL) bs = BeautifulSoup(document.content) results = [] for h in bs.select("#dev_page_content > h4"): print("------") anchor = h.find(lol1) if not anchor or not anchor.has_attr("name"): continue link = "{base_url}#{anchor}".format(base_url=BASE_URL, anchor=anchor["name"]) title = h.text descr = [] table_type, param_strings = None, None print("title: " + title) print("link: " + link) if filter and title not in filter: print("Skipping {title}, filtered.".format(title=title)) continue # logger.debug(h) type_strings = [] default_returns = [] for sibling in h.next_siblings: if sibling == "\n": continue if sibling.name in ["p", "blockquote"]: if "return" in sibling.text.lower(): parts_splitted = [] is_first_element = True # truein string, for x in sibling.children: if isinstance(x, NavigableString): if is_first_element: # Start of a new sentence => new list parts_splitted.extend([[foo.lstrip()] for foo in x.split(".")]) is_first_element = False else: # not = in the middle of a sentence => append parts_splitted[len(parts_splitted)-1].append(x.split(".", maxsplit=1)[0]) parts_splitted.extend([[foo] for foo in x.split(".")[1:]]) is_first_element = False is_first_element = x.strip().endswith(".") else: obj = None if x.name in ["a", "em"]: obj = x else: obj = x.text # end if if is_first_element: # if it is at the beginning of the sentence. parts_splitted.append([obj]) is_first_element = False else: parts_splitted[len(parts_splitted)-1].append(obj) # end if # end for # end for returns__ = [] # array of strings return_text__ = [] # array if strings. one item = one sentence. Not ending with a dot. is_array = False for lol_part in parts_splitted: has_return = False returns_ = [] return_text_ = "" for lol_part_part in lol_part: if isinstance(lol_part_part, str): return_text_ += lol_part_part if lol_part_part.strip().lower().endswith("array of"): is_array = True if "return" in lol_part_part.lower(): has_return = True # end if else: # not str return_text_ += lol_part_part.text if is_array: returns_.append("list of " + lol_part_part.text) is_array = False else: returns_.append(lol_part_part.text) # end for if has_return: # append, so we can have multible sentences. return_text__.append(return_text_.strip()) returns__.extend(returns_) # end if # end for if return_text__ or returns__: # finally set it. default_returns = (". ".join(return_text__).strip(), " or ".join(returns__).strip()) # end if # end if descr.append(sibling.text) elif sibling.name == "table": assert sibling.has_attr("class") and "table" in sibling["class"] table_type, param_strings = parse_table(sibling) elif sibling.name == "h4": break elif sibling.name == "h3": break elif sibling.name == "hr": # end of page break else: print("unknown: " + sibling.name) # end if # end for if not all([link, title, descr]): print("Skipped: Missing link, title or description") continue if not all([table_type, param_strings]): if title not in WHITELISTED_FUNCS: print("Skipped. Has no table with Parameters or Fields.\n" "Also isn't a whitelisted function in `code_generator_settings.WHITELISTED_FUNCS`.") continue # -> else: is in WHITELISTED_FUNCS: table_type = "func" # end if descr = "\n".join(descr) print("descr: " + repr(descr)) params_string = "\n".join(param_strings) if param_strings else None # WHITELISTED_FUNCS have no params if table_type == "func": seems_valid = False if len(default_returns) != 2: if "return" in descr.lower(): default_returns = ["", "Message"] default_returns[0] = [x for x in descr.split(".") if "return" in x.lower()][0].strip() seems_valid = len(default_returns[0].split(".")) == 1 default_returns[1] = " or ".join(type_strings) if type_strings else "Message" default_returns[1] = as_types(default_returns[1], "returns") else: default_returns = ("On success, True is returned", "True") # end if "return" in description else: seems_valid = len(default_returns[0].split(".")) == 1 # end if default set if not seems_valid: returns = answer("Textual description what the function returns", default_returns[0]) return_type = answer("Return type", default_returns[1]) if isinstance(return_type, str): return_type = as_types(return_type, "return type") # end if else: returns = default_returns[0] return_type = default_returns[1] # end if logger.debug("\n") result = func(title, descr, link, params_string, returns=returns, return_type=return_type) results.append(result) elif table_type == "class": if title in CLASS_TYPE_PATHS: parent_clazz = CLASS_TYPE_PATHS[title][CLASS_TYPE_PATHS__PARENT] print("superclass: " + parent_clazz) else: parent_clazz = answer("Parent class name", "TgBotApiObject") # end if result = clazz(title, parent_clazz, descr, link, params_string) results.append(result) # end if # end for can_quit = False do_overwrite = confirm("Can the folder {path} be overwritten?".format(path=folder)) print("vvvvvvvvv") while not can_quit: if do_overwrite: try: import Send2Trash Send2Trash.send2trash(folder) except ImportError: import shutil shutil.rmtree(folder) # end try # end if try: safe_to_file(folder, results) with open(path_join(folder, "api.html"), "wb") as f: f.write(document.content) # end if print("Writen to file.") except TemplateError as e: if isinstance(e, TemplateSyntaxError): logger.exception("Template error at {file}:{line}".format(file=e.filename, line=e.lineno)) else: logger.exception("Template error.") # end if # end try can_quit = not confirm("Write again after reloading templates?", default=True) print("#########") print("Exit.")
def command_line_input(): from luckydonaldUtils.interactions import confirm, answer do_func = confirm("Choose between generating function or class. Do you want a function?", True) if do_func: command = answer("Command (the Title)") description = answer("Description") link = answer("The link on the api page") params_string = "---" params_strings = [] while params_string != "": params_string = answer("Parameters (sepereated by tabs, and new lines)\nParameters Type Required Description", "") if params_string and not params_string.strip() == "": params_strings.append(params_string) # end if # end while returns = answer("Textual description what the function returns", "On success, the sent Message is returned.") return_type = answer("Return type", "Message") print("\n") func(command, description, link, params_string, returns , return_type) else: clazze = answer("Class name") parent_clazz = answer("Parent class name", "object") description = answer("Description") link = answer("The link on the api page") params_string = "--" params_strings = [] while params_string != "": params_string = answer("Parameters (sepereated by tabs, and new lines)\nParameters Type Description", "") if params_string and not params_string.strip() == "": params_strings.append(params_string) # end if # end while print("\n") clazz(clazze, parent_clazz, description, link, "\n".join(params_strings))