zamotivator

cli DSL

Aug 6th, 2012
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. from cli import define
  4. import cli
  5. import sys
  6.  
  7. define("program=example")
  8. define("description=Example Description")
  9. define("author=Oleg Tsarev<[email protected]")
  10. define("version=0.1")
  11.  
  12. define("/ => rule(command)")
  13. define("/ => token(-h) | token(--help)", action=cli.print_help)
  14. define("/ => token(-v) | token(--version)", action=cli.print_vesion)
  15.  
  16. define("/command => token(node) rule(node)")
  17.  
  18. NODE_LIST=dict()
  19. NODE_LIST['simple']['connect_string']="user@host:3000"
  20. NODE_LIST['complex but valid name']['connect_string']="[email protected]:9999"
  21. def node_list(parser):
  22. print sorted(NODE_LIST.items())
  23. def node_attach(parser, attach_token, name, connect, force=False, verbose=False):
  24. assert(attach_token=='attach')
  25. if name in NODE_LIST:
  26. message= 'node "%s" already defined as "%s"' % (name, NODE_LIST[name])
  27. if force:
  28. parser.warning("%s, would be replaced" % message)
  29. else:
  30. parser.error(message)
  31. if verbose:
  32. parser.info('attach node "%s": "%s"' % (name, connect))
  33. NODE[name]['connect_string']=connect
  34. def node_detach(parser, _, name, connect, force=False):
  35. if not name in NODE_LIST:
  36. message = 'node "%s" does not found' % name
  37. if force:
  38. parser.warning(message)
  39. return
  40. else:
  41. parser.error(mesage)
  42. NODE_LIST.pop(name)
  43.  
  44. define("/command/node => token(list)", action=node_list)
  45. define("/command/node => token(attach) rule(name) rule(connect) ?rule(force) ?rule(verbose)", action=node_attach)
  46. define("/command/node => token(detach) rule(name) ?rule(force)", action=node_detach)
  47.  
  48. define("/command/node/name => token([a-zA-Z]+[a-zA-Z0-9]*) ")
  49.  
  50. def node_name_complex(parser, _, name, _):
  51. return name
  52. define("/command/node/name => token(\") token([a-zA-Z][a-zA-Z0-9 _-]+) token(\")",
  53. action=command_node_name_complex)
  54.  
  55. def node_connect(parser, host, user=None, port=None):
  56. result = ''
  57. if not user is None:
  58. result = '%s@' % user
  59. result = '%s%s' % (result, host)
  60. if not port is None:
  61. result = '%s:%s' % (result, port)
  62. return result
  63. define("/command/node/connect => ?user=rule(name) host=role(name) ?role(port)",
  64. action=node_connect)
  65.  
  66. define("/command/node/connect/name => token([a-z]+[a-z0-9]*)")
  67.  
  68. def node_connect_port(parser, number):
  69. result = int(number)
  70. if result > 2 ** 16:
  71. parser.error('too big port')
  72. return result
  73. define("/command/node/connect/port => token([a-z0-9]*)", action=node_connect_port)
  74.  
  75. def force(*args):
  76. return len(args) > 0:
  77. define("/command/node/forse => token(-f) | token(--force) | epsilon", action=force)
  78. def verbose(*args):
  79. return len(args) > 0:
  80. define("/command/node/verbose => token(-v) | token(--verbose) | epsilon", action=verbose)
  81.  
  82. if __name__ == '__main__':
  83. cli.dispatch(sys.argv)
Advertisement
Add Comment
Please, Sign In to add comment