From e233c4ab41b037640c9f681fc86e3b6fdf4a0bb8 Mon Sep 17 00:00:00 2001 From: spamguy Date: Mon, 29 Jun 2026 11:08:13 -0700 Subject: [PATCH 1/4] Implement Celery scraper. --- assets/stylesheets/application.css.scss | 1 + assets/stylesheets/pages/_celery.scss | 14 ++++++++++ lib/docs/filters/celery/clean_html.rb | 33 ++++++++++++++++++++++++ lib/docs/filters/celery/entries.rb | 27 +++++++++++++++++++ lib/docs/scrapers/celery.rb | 28 ++++++++++++++++++++ public/icons/docs/celery/16.png | Bin 0 -> 1689 bytes public/icons/docs/celery/16@2x.png | Bin 0 -> 2669 bytes 7 files changed, 103 insertions(+) create mode 100644 assets/stylesheets/pages/_celery.scss create mode 100644 lib/docs/filters/celery/clean_html.rb create mode 100644 lib/docs/filters/celery/entries.rb create mode 100644 lib/docs/scrapers/celery.rb create mode 100644 public/icons/docs/celery/16.png create mode 100644 public/icons/docs/celery/16@2x.png diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss index 95a1b3a9a6..56838083c1 100644 --- a/assets/stylesheets/application.css.scss +++ b/assets/stylesheets/application.css.scss @@ -30,6 +30,7 @@ @use 'pages/bootstrap'; @use 'pages/cppref'; @use 'pages/cakephp'; +@use 'pages/celery'; @use 'pages/clojure'; @use 'pages/codeception'; @use 'pages/coffeescript'; diff --git a/assets/stylesheets/pages/_celery.scss b/assets/stylesheets/pages/_celery.scss new file mode 100644 index 0000000000..d9735c7341 --- /dev/null +++ b/assets/stylesheets/pages/_celery.scss @@ -0,0 +1,14 @@ +@use 'pages/simple'; + +._celery { + @extend %simple; + + .note, .warning, .seealso { + @extend %note; + .admonition-title { font-weight: bold; } + } + + .note { @extend %note-gray; } + .seealso { @extend %note-green; } + .warning { @extend %note-red; } +} diff --git a/lib/docs/filters/celery/clean_html.rb b/lib/docs/filters/celery/clean_html.rb new file mode 100644 index 0000000000..4342dea192 --- /dev/null +++ b/lib/docs/filters/celery/clean_html.rb @@ -0,0 +1,33 @@ +module Docs + class Celery + class CleanHtmlFilter < Filter + def call + # 'This document describes the current stable version of Celery...' + css('div.deck').remove + + # Table of Contents. + css('nav.contents.local', 'table.docutils').remove + + # ΒΆ anchor links, [source] external links. + css('a.headerlink', 'a.toc-backref', '.viewcode-link', 'hr').remove + + css('h1', 'h2', 'h3', 'h4', 'h5', 'h6').each do |node| + node.content = node.inner_text + end + + css('.highlight-python pre', '.highlight-default pre', '.highlight-pycon pre').each do |node| + node.content = node.content + node['data-language'] = 'python' + node.parent.parent.replace(node) + end + + # Lists are wrapped in blockquotes for some reason. + css('blockquote ol', 'blockquote ul').each do |node| + node.parent.parent.replace(node) + end + + doc + end + end + end +end diff --git a/lib/docs/filters/celery/entries.rb b/lib/docs/filters/celery/entries.rb new file mode 100644 index 0000000000..c18a975236 --- /dev/null +++ b/lib/docs/filters/celery/entries.rb @@ -0,0 +1,27 @@ +module Docs + class Celery + class EntriesFilter < Docs::EntriesFilter + def get_name + at_css('h1').content.gsub(/\P{ASCII}/, '') + end + + def get_type + if subpath.include?('internals/') + 'Internal Module Reference' + elsif subpath.include?('reference/') + 'API Reference' + elsif subpath.include?('userguide/') + 'User Guide' + else + name + end + end + + def additional_entries + css('dl.py dt[id]').each_with_object [] do |node, entries| + entries << [node['id'], node['id'], get_type] + end + end + end + end +end diff --git a/lib/docs/scrapers/celery.rb b/lib/docs/scrapers/celery.rb new file mode 100644 index 0000000000..270e594a91 --- /dev/null +++ b/lib/docs/scrapers/celery.rb @@ -0,0 +1,28 @@ +module Docs + class Celery < UrlScraper + self.name = 'Celery' + self.type = 'celery' + self.release = '5.6.3' + self.base_url = 'https://docs.celeryq.dev/en/stable/' + self.links = { + home: 'https://docs.celeryq.dev', + code: 'https://github.com/celery/celery' + } + + html_filters.push 'celery/entries', 'celery/clean_html' + + options[:container] = 'div.body' + options[:rate_limit] = 100 + options[:only_patterns] = [/userguide\//, /reference\//] + + options[:attribution] = <<-HTML + Copyright © 2017-2026 Asif Saif Uddin, core team & contributors. All rights reserved.
+ Celery is licensed under The BSD License (3 Clause, also known as the new BSD license). The license is an OSI approved Open Source license and is GPL-compatible. + HTML + + def get_latest_version(opts) + tags = get_github_tags('celery', 'celery', opts) + tags[0]['name'][1..-1] + end + end +end diff --git a/public/icons/docs/celery/16.png b/public/icons/docs/celery/16.png new file mode 100644 index 0000000000000000000000000000000000000000..3d582e88bd3db49f8920942119fb27029cc179bd GIT binary patch literal 1689 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBC{d9b;hE;^%b*2hb1<+l z3NbJPS&Tr)z$nE4G7ZRLuw#^lv)$S=8Cam=en1)oJb)Oa4ni|8U__X*fC;WzU;#6N z4bpb|^nF(##aZAHSl5MQj7C*N{(MBH>Ye=yONg`lTU>dRGveAd9H#;uJE1UlTQ|DVx z7sn6_LET{Q?htng+tStV-d?vb=$d$>a6_qJZoGhpgu!Y7p%3gWI%oV(*m;ZpW8JQI z#I;OMM4WjMx92yl6)g)SlOFlhe0gm5D%P@e>&x}4SHG&B^M1~HmLEGSzn^;cBcXEF zlvd$I0zY}=IAT)%t^cvKa^6yr$=n-r?(bYaT|f3`bj;p=k2k(-RpwV`U!@z_5#bp* zW$A&06$;%=jGX7(BOWL2{3W0~eNpVoyVLvs{f=5$YQA~py-%l=_`K63rs@PGzSrk{ zue7T1P|98xQ$2x2uEEk5cS;C9nl@|4Orz4rrM4cTr`;9`ly=_UKCdHtds)LX=07*n z8uicBb#~vM<0b8`U6I^UY&Ub=$5WB|J=c_~=DR)h*z@Bt@4CA;51zNL>3_TaoRf6( z_5W)M{@)8;^DJ(Ste-*b^flavB6X*HmvZBu5Yiy)VX~G@>%o~f#yRtz%q_GqoBQBP zYpzLIXVun*&79YwGB&OHcK@Anug$T;il^orVO=BYkp3(}hiCF+oAksNcV4zED_*hH z@pkErdh7O8zP*9knt|Rcc?3B^I^S;h)_E-!Wo(JQi= z5+_*wK^YIa@ zeYSS0$xNgTe~DWM4fDhgt( literal 0 HcmV?d00001 diff --git a/public/icons/docs/celery/16@2x.png b/public/icons/docs/celery/16@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fda98451401ecbacc7c8a7863153eed2129207cc GIT binary patch literal 2669 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 literal 0 HcmV?d00001 From 88bd882556b781f972aaddea8d1a55672194e77b Mon Sep 17 00:00:00 2001 From: spamguy Date: Tue, 30 Jun 2026 21:15:50 -0700 Subject: [PATCH 2/4] Add SOURCE file. --- public/icons/docs/celery/SOURCE | 1 + 1 file changed, 1 insertion(+) create mode 100644 public/icons/docs/celery/SOURCE diff --git a/public/icons/docs/celery/SOURCE b/public/icons/docs/celery/SOURCE new file mode 100644 index 0000000000..2f071f4820 --- /dev/null +++ b/public/icons/docs/celery/SOURCE @@ -0,0 +1 @@ +https://docs.celeryq.dev/en/stable/_static/favicon.ico From 3d61e453a9957d01a588975e6672861c4852a24c Mon Sep 17 00:00:00 2001 From: Simon Legner Date: Fri, 3 Jul 2026 23:01:23 +0200 Subject: [PATCH 3/4] celery: remove .image-reference --- lib/docs/filters/celery/clean_html.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/docs/filters/celery/clean_html.rb b/lib/docs/filters/celery/clean_html.rb index 4342dea192..53fc811a4b 100644 --- a/lib/docs/filters/celery/clean_html.rb +++ b/lib/docs/filters/celery/clean_html.rb @@ -4,6 +4,8 @@ class CleanHtmlFilter < Filter def call # 'This document describes the current stable version of Celery...' css('div.deck').remove + + css('.reference.external.image-reference').remove # Table of Contents. css('nav.contents.local', 'table.docutils').remove From 17be185df638dd95e001084bb6946f66c0814a92 Mon Sep 17 00:00:00 2001 From: Simon Legner Date: Fri, 3 Jul 2026 23:01:58 +0200 Subject: [PATCH 4/4] celery: news entry --- assets/javascripts/news.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/assets/javascripts/news.json b/assets/javascripts/news.json index 3ab185f64c..fdc35997ff 100644 --- a/assets/javascripts/news.json +++ b/assets/javascripts/news.json @@ -1,4 +1,8 @@ [ + [ + "2026-07-03", + "New documentation: Celery" + ], [ "2026-06-02", "New documentation: PowerShell"