cli.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. """Console script for banana."""
  2. import argparse
  3. import logging
  4. import random
  5. import sys
  6. import banana
  7. def get_codec(args):
  8. kwargs = {}
  9. if args.alphabets:
  10. kwargs["alphabets"] = args.alphabets
  11. if args.shiftalpha:
  12. kwargs["shiftalpha"] = args.shiftalpha
  13. if args.alphaend:
  14. kwargs["alphaend"] = args.alphaend
  15. return banana.Codec(**kwargs)
  16. def main_encode(args):
  17. codec = get_codec(args)
  18. kwargs = dict(num=args.num)
  19. if args.minlength:
  20. kwargs["minlength"] = args.minlength
  21. print(codec.encode(**kwargs))
  22. def main_decode(args):
  23. print(get_codec(args).decode(args.word))
  24. def main_check(args):
  25. if get_codec(args).is_valid(args.word):
  26. if not args.quiet:
  27. print("yes")
  28. sys.exit(0)
  29. else:
  30. if not args.quiet:
  31. print("no")
  32. sys.exit(1)
  33. def main_random(args):
  34. codec = get_codec(args)
  35. kwargs = dict(minlength=args.minlength)
  36. if args.seed:
  37. kwargs["prng"] = random.Random(args.seed)
  38. print(codec.random(**kwargs))
  39. def colon_separated_list(s):
  40. return s.split(":")
  41. def main():
  42. parser = argparse.ArgumentParser(description="Convert number to banana")
  43. parser.add_argument(
  44. "--log-level", choices=["DEBUG", "INFO", "WARN", "ERROR"], default="WARN"
  45. )
  46. parser.add_argument(
  47. "--alphabets", "-a",
  48. help="Set alphabets in colon-separated list",
  49. type=colon_separated_list,
  50. )
  51. parser.add_argument(
  52. "--shiftalpha", "-s", help="Set shift for alphabets", type=int, default=0
  53. )
  54. parser.add_argument(
  55. "--alphaend", "-e", help="Set ending alphabet", type=int, default=0
  56. )
  57. sub = parser.add_subparsers()
  58. encode = sub.add_parser("encode", help="Convert number to word")
  59. encode.add_argument("num", type=int)
  60. encode.add_argument("--minlength", "-l", help="Set minimum length", type=int, default=1)
  61. encode.set_defaults(func=main_encode)
  62. decode = sub.add_parser("decode", help="Convert word to number")
  63. decode.add_argument("word")
  64. decode.set_defaults(func=main_decode)
  65. check = sub.add_parser("check", help="Check if word is banana")
  66. check.add_argument("word")
  67. check.add_argument("--quiet", "-q", action="store_true")
  68. check.set_defaults(func=main_check)
  69. rand = sub.add_parser("random", help="Generate random banana")
  70. rand.add_argument("--minlength", "-l", help="Set minimum length", type=int, default=6)
  71. rand.add_argument("--seed", type=int, default=None)
  72. rand.set_defaults(func=main_random)
  73. args = parser.parse_args()
  74. if not hasattr(args, "func"):
  75. print("You need to select one subcommand. \nUse --help", file=sys.stderr)
  76. # parser.print_help()
  77. sys.exit(1)
  78. logging.basicConfig(level=args.log_level)
  79. args.func(args)
  80. if __name__ == "__main__":
  81. # pragma: no cover
  82. main()