diff --git a/scrapyd/config.py b/scrapyd/config.py index c13ed28f8..a3b818a0e 100644 --- a/scrapyd/config.py +++ b/scrapyd/config.py @@ -52,3 +52,11 @@ class Config(object): def getboolean(self, option, default=None): return self._getany(self.cp.getboolean, option, default) + + def items(self, section, default=None): + try: + return self.cp.items(section) + except (NoSectionError, NoOptionError): + if default is not None: + return default + raise diff --git a/scrapyd/default_scrapyd.conf b/scrapyd/default_scrapyd.conf index 6e800803d..d39727aab 100644 --- a/scrapyd/default_scrapyd.conf +++ b/scrapyd/default_scrapyd.conf @@ -12,3 +12,14 @@ debug = off runner = scrapyd.runner application = scrapyd.app.application launcher = scrapyd.launcher.Launcher + +[services] +schedule.json = scrapyd.webservice.Schedule +cancel.json = scrapyd.webservice.Cancel +addversion.json = scrapyd.webservice.AddVersion +listprojects.json = scrapyd.webservice.ListProjects +listversions.json = scrapyd.webservice.ListVersions +listspiders.json = scrapyd.webservice.ListSpiders +delproject.json = scrapyd.webservice.DeleteProject +delversion.json = scrapyd.webservice.DeleteVersion +listjobs.json = scrapyd.webservice.ListJobs diff --git a/scrapyd/website.py b/scrapyd/website.py index 5e752da55..d2e748ec3 100644 --- a/scrapyd/website.py +++ b/scrapyd/website.py @@ -2,6 +2,9 @@ from datetime import datetime from twisted.web import resource, static from twisted.application.service import IServiceCollection + +from scrapy.utils.misc import load_object + from .interfaces import IPoller, IEggStorage, ISpiderScheduler from . import webservice @@ -16,18 +19,13 @@ class Root(resource.Resource): itemsdir = config.get('items_dir') self.app = app self.putChild('', Home(self)) - self.putChild('schedule.json', webservice.Schedule(self)) - self.putChild('cancel.json', webservice.Cancel(self)) - self.putChild('addversion.json', webservice.AddVersion(self)) - self.putChild('listprojects.json', webservice.ListProjects(self)) - self.putChild('listversions.json', webservice.ListVersions(self)) - self.putChild('listspiders.json', webservice.ListSpiders(self)) - self.putChild('delproject.json', webservice.DeleteProject(self)) - self.putChild('delversion.json', webservice.DeleteVersion(self)) - self.putChild('listjobs.json', webservice.ListJobs(self)) self.putChild('logs', static.File(logsdir, 'text/plain')) self.putChild('items', static.File(itemsdir, 'text/plain')) self.putChild('jobs', Jobs(self)) + services = config.items('services', ()) + for servName, servClsName in services: + servCls = load_object(servClsName) + self.putChild(servName, servCls(self)) self.update_projects() def update_projects(self):