def build_list_from_user_input(repo, user_input): """ Creates a new measure from a user inputted line :type repo: ConvertRepo :type user_input: str :rtype: list[ConvertMeasure] """ user_input = user_input.strip() # Search through the line for digits, pull them amount as a preliminary amount and strip the rest of the line. # TODO: add calculation? preliminary_amount_str = Commons.get_digits_from_start_or_end( user_input) if preliminary_amount_str is None: raise ConvertException("Cannot find amount.") preliminary_amount_value = float(preliminary_amount_str) # Remove amountString from userInput if user_input.startswith(preliminary_amount_str): user_input = user_input[len(preliminary_amount_str):] else: user_input = user_input[:-len(preliminary_amount_str)] # Loop all units, see which might match userInput with prefixes. Building a list of valid measures for input. new_measure_list = [] for unit_obj in repo.get_full_unit_list(): prefix_obj = unit_obj.get_prefix_from_user_input(user_input) if prefix_obj is False: continue prefix_multiplier = 1 if prefix_obj is not None: prefix_multiplier = prefix_obj.multiplier new_amount = preliminary_amount_value * prefix_multiplier new_measure = ConvertMeasure(new_amount, unit_obj) new_measure_list.append(new_measure) # If list is still empty, throw an exception. if len(new_measure_list) == 0: raise ConvertException("Unrecognised unit.") # Return list of matching measures. return new_measure_list
def test_get_digits_from_start_or_end(string, digits): assert Commons.get_digits_from_start_or_end(string) == digits