def test_deque_preloading(self): """Test pages being added to a DequePreloadingGenerator.""" mainpage = self.get_mainpage() pages = pywikibot.tools.DequeGenerator([mainpage]) gen = pagegenerators.DequePreloadingGenerator(pages) pages_out = list() for page in gen: pages_out.append(page) # Add a page to the generator if not page.isTalkPage(): pages.extend([page.toggleTalkPage()]) self.assertTrue(all(isinstance(page, pywikibot.Page) for page in pages_out)) self.assertIn(mainpage, pages_out) self.assertIn(mainpage.toggleTalkPage(), pages_out) self.assertEqual(len(pages_out), 2) self.assertTrue(pages_out[1].isTalkPage())
# Fetch articles in category, and mark as already checked (seen) # If category is empty, ask user if they want to look for pages # in a diferent category. articles = list(workingcat.articles(content=True)) if not articles: pywikibot.output( u"Category %s does not exist or is empty. Which page to start with?" % workingcatname) answer = pywikibot.input(u"(Default is [[%s]]):" % workingcatname) if not answer: answer = workingcatname pywikibot.output(u'' + answer) pl = pywikibot.Page(mysite, answer) articles = [pl] for pl in articles: checked[pl] = pl include(pl, summary=summary) gen = pagegenerators.DequePreloadingGenerator(tocheck) for page in gen: if checkbroken or page.exists(): asktoadd(page, summary) finally: try: excludefile.close() except Exception: pass
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: unicode """ global workingcat, parentcats global checked, tocheck global excludefile checked = {} tocheck = DequeGenerator() workingcatname = '' options = {} local_args = pywikibot.handle_args(args) for arg in local_args: option = arg[1:] if not arg.startswith('-'): if not workingcatname: workingcatname = arg else: pywikibot.warning('Working category "{}" is already given.' .format(workingcatname)) else: options[option] = True if not workingcatname: pywikibot.bot.suggest_help(missing_parameters=['working category']) return mysite = pywikibot.Site() summary = i18n.twtranslate(mysite, 'makecat-create', {'cat': workingcatname}) bot = MakeCatBot(site=mysite, **options) workingcat = pywikibot.Category(mysite, '{0}{1}' .format(mysite.namespaces.CATEGORY, workingcatname)) filename = pywikibot.config.datafilepath( 'category', workingcatname.encode('ascii', 'xmlcharrefreplace').decode('ascii') + '_exclude.txt') try: with codecs.open(filename, 'r', encoding=mysite.encoding()) as f: for line in f.readlines(): # remove leading and trailing spaces, LF and CR line = line.strip() if not line: continue pl = pywikibot.Page(mysite, line) checked[pl] = pl excludefile = codecs.open(filename, 'a', encoding=mysite.encoding()) except IOError: # File does not exist excludefile = codecs.open(filename, 'w', encoding=mysite.encoding()) # Get parent categories in order to `removeparent` try: parentcats = workingcat.categories() except pywikibot.Error: parentcats = [] # Do not include articles already in subcats; only checking direct subcats subcatlist = list(workingcat.subcategories()) if subcatlist: subcatlist = pagegenerators.PreloadingGenerator(subcatlist) for cat in subcatlist: artlist = list(cat.articles()) for page in artlist: checked[page] = page # Fetch articles in category, and mark as already checked (seen) # If category is empty, ask user if they want to look for pages # in a diferent category. articles = list(workingcat.articles(content=True)) if not articles: pywikibot.output('Category {} does not exist or is empty. ' 'Which page to start with?' .format(workingcatname)) answer = pywikibot.input('(Default is [[{}]]):'.format(workingcatname)) if not answer: answer = workingcatname pywikibot.output('' + answer) pl = pywikibot.Page(mysite, answer) articles = [pl] for pl in articles: checked[pl] = pl bot.include(pl, summary=summary) gen = pagegenerators.DequePreloadingGenerator(tocheck) for page in gen: if bot.checkbroken or page.exists(): bot.asktoadd(page, summary)
def generator(self): """Generator property used by run().""" return pagegenerators.DequePreloadingGenerator(self.tocheck)