accept some options on the cli
This commit is contained in:
		
							parent
							
								
									2bf27b2e7a
								
							
						
					
					
						commit
						55b4b333dc
					
				|  | @ -1,4 +1,5 @@ | ||||||
| from __future__ import print_function | from __future__ import print_function | ||||||
|  | import json | ||||||
| import click | import click | ||||||
| from ..cli.cli import Config, _compose | from ..cli.cli import Config, _compose | ||||||
| 
 | 
 | ||||||
|  | @ -19,6 +20,21 @@ def server(ctx): # this is the setuptools entrypoint for bin/wormhole-server | ||||||
|     # server commands don't use |     # server commands don't use | ||||||
|     ctx.obj = Config() |     ctx.obj = Config() | ||||||
| 
 | 
 | ||||||
|  | def _validate_websocket_protocol_options(ctx, param, value): | ||||||
|  |     return list(_validate_websocket_protocol_option(option) for option in value) | ||||||
|  | 
 | ||||||
|  | def _validate_websocket_protocol_option(option): | ||||||
|  |     try: | ||||||
|  |         key, value = option.split("=", 1) | ||||||
|  |     except ValueError: | ||||||
|  |         raise click.BadParameter("format options as OPTION=VALUE") | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         value = json.loads(value) | ||||||
|  |     except: | ||||||
|  |         raise click.BadParameter("could not parse JSON value for {}".format(key)) | ||||||
|  | 
 | ||||||
|  |     return (key, value) | ||||||
| 
 | 
 | ||||||
| LaunchArgs = _compose( | LaunchArgs = _compose( | ||||||
|     click.option( |     click.option( | ||||||
|  | @ -58,6 +74,11 @@ LaunchArgs = _compose( | ||||||
|         "--stats-json-path", default="stats.json", metavar="PATH", |         "--stats-json-path", default="stats.json", metavar="PATH", | ||||||
|         help="location to write the relay stats file", |         help="location to write the relay stats file", | ||||||
|     ), |     ), | ||||||
|  |     click.option( | ||||||
|  |         "--websocket-protocol-option", multiple=True, metavar="OPTION=VALUE", | ||||||
|  |         callback=_validate_websocket_protocol_options, | ||||||
|  |         help="a websocket server protocol option to configure", | ||||||
|  |     ), | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1238,3 +1238,45 @@ class Server(unittest.TestCase): | ||||||
|         relay = plugin.makeService(None) |         relay = plugin.makeService(None) | ||||||
|         self.assertEqual('relay.sqlite', relay._db_url) |         self.assertEqual('relay.sqlite', relay._db_url) | ||||||
|         self.assertEqual('stats.json', relay._stats_file) |         self.assertEqual('stats.json', relay._stats_file) | ||||||
|  | 
 | ||||||
|  |     @mock.patch("wormhole.server.cmd_server.start_server") | ||||||
|  |     def test_websocket_protocol_options(self, fake_start_server): | ||||||
|  |         result = self.runner.invoke( | ||||||
|  |             server, [ | ||||||
|  |                 'start', | ||||||
|  |                 '--websocket-protocol-option=a=3', | ||||||
|  |                 '--websocket-protocol-option=b=true', | ||||||
|  |                 '--websocket-protocol-option=c=3.5', | ||||||
|  |                 '--websocket-protocol-option=d=["foo","bar"]', | ||||||
|  |             ]) | ||||||
|  |         self.assertEqual(0, result.exit_code) | ||||||
|  |         cfg = fake_start_server.mock_calls[0][1][0] | ||||||
|  |         self.assertEqual( | ||||||
|  |             cfg.websocket_protocol_option, | ||||||
|  |             [("a", 3), ("b", True), ("c", 3.5), ("d", ['foo', 'bar'])], | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     def test_broken_websocket_protocol_options(self): | ||||||
|  |         result = self.runner.invoke( | ||||||
|  |             server, [ | ||||||
|  |                 'start', | ||||||
|  |                 '--websocket-protocol-option=a', | ||||||
|  |             ]) | ||||||
|  |         self.assertNotEqual(0, result.exit_code) | ||||||
|  |         self.assertIn( | ||||||
|  |             'Error: Invalid value for "--websocket-protocol-option": ' | ||||||
|  |             'format options as OPTION=VALUE', | ||||||
|  |             result.output, | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |         result = self.runner.invoke( | ||||||
|  |             server, [ | ||||||
|  |                 'start', | ||||||
|  |                 '--websocket-protocol-option=a=foo', | ||||||
|  |             ]) | ||||||
|  |         self.assertNotEqual(0, result.exit_code) | ||||||
|  |         self.assertIn( | ||||||
|  |             'Error: Invalid value for "--websocket-protocol-option": ' | ||||||
|  |             'could not parse JSON value for a', | ||||||
|  |             result.output, | ||||||
|  |         ) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user