Skip to content
This repository was archived by the owner on Jun 10, 2024. It is now read-only.

Commit 2471eb4

Browse files
committed
add new command send_message, sending message to project via command-line
close #67
1 parent ece43a2 commit 2471eb4

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed

pyspider/run.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,33 @@ def one(ctx, interactive, enable_phantomjs, scripts):
638638
phantomjs_obj.quit()
639639

640640

641+
@cli.command()
642+
@click.option('--scheduler-rpc', callback=connect_rpc, help='xmlrpc path of scheduler')
643+
@click.argument('project', nargs=1)
644+
@click.argument('message', nargs=1)
645+
@click.pass_context
646+
def send_message(ctx, scheduler_rpc, project, message):
647+
if isinstance(scheduler_rpc, six.string_types):
648+
scheduler_rpc = connect_rpc(ctx, None, scheduler_rpc)
649+
if scheduler_rpc is None and os.environ.get('SCHEDULER_NAME'):
650+
scheduler_rpc = connect_rpc(ctx, None, 'http://%s/' % (
651+
os.environ['SCHEDULER_PORT_23333_TCP'][len('tcp://'):]))
652+
if scheduler_rpc is None:
653+
scheduler_rpc = connect_rpc(ctx, None, 'http://localhost:23333/')
654+
655+
return scheduler_rpc.send_task({
656+
'taskid': utils.md5string('data:,on_message'),
657+
'project': project,
658+
'url': 'data:,on_message',
659+
'fetch': {
660+
'save': ('__command__', message),
661+
},
662+
'process': {
663+
'callback': '_on_message',
664+
}
665+
})
666+
667+
641668
def main():
642669
cli()
643670

pyspider/scheduler/scheduler.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,12 @@ def new_task(task):
447447
return False
448448
server.register_function(new_task, 'newtask')
449449

450+
def send_task(task):
451+
'''dispatch task to fetcher'''
452+
self.send_task(task)
453+
return True
454+
server.register_function(send_task, 'send_task')
455+
450456
def update_project():
451457
self._force_update_project = True
452458
server.register_function(update_project, 'update_project')

tests/test_run.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,3 +293,44 @@ def wait_text(timeout=1):
293293
self.assertIn('scheduler exiting...', text)
294294
os.close(fd)
295295
os.kill(pid, signal.SIGINT)
296+
297+
class TestSendMessage(unittest.TestCase):
298+
299+
@classmethod
300+
def setUpClass(self):
301+
shutil.rmtree('./data/tests', ignore_errors=True)
302+
os.makedirs('./data/tests')
303+
304+
ctx = run.cli.make_context('test', [
305+
'--taskdb', 'sqlite+taskdb:///data/tests/task.db',
306+
'--projectdb', 'sqlite+projectdb:///data/tests/projectdb.db',
307+
'--resultdb', 'sqlite+resultdb:///data/tests/resultdb.db',
308+
], None, obj=dict(testing_mode=True))
309+
self.ctx = run.cli.invoke(ctx)
310+
311+
ctx = run.scheduler.make_context('scheduler', [], self.ctx)
312+
scheduler = run.scheduler.invoke(ctx)
313+
utils.run_in_thread(scheduler.xmlrpc_run)
314+
utils.run_in_thread(scheduler.run)
315+
316+
time.sleep(1)
317+
318+
@classmethod
319+
def tearDownClass(self):
320+
for each in self.ctx.obj.instances:
321+
each.quit()
322+
time.sleep(1)
323+
324+
shutil.rmtree('./data/tests', ignore_errors=True)
325+
326+
def test_10_send_message(self):
327+
ctx = run.send_message.make_context('send_message', [
328+
'test_project', 'test_message'
329+
], self.ctx)
330+
self.assertTrue(run.send_message.invoke(ctx))
331+
while True:
332+
task = self.ctx.obj.scheduler2fetcher.get(timeout=1)
333+
if task['url'] == 'data:,on_message':
334+
break
335+
self.assertEqual(task['process']['callback'], '_on_message')
336+

0 commit comments

Comments
 (0)