History

Merge branch 'main' into add/threejs-docs

Simon Legner committed 1 year ago

Commit 74aa6612 parents 35b7c73 8f29e6070 files · +280 −117Browse files

Unified · Split

70 files
  1. .github/workflows/build.yml +2 −2
  2. .github/workflows/schedule-doc-report.yml +1 −1
  3. .github/workflows/test.yml +1 −1
  4. .ruby-version +1 −1
  5. .tool-versions +1 −1
  6. COPYRIGHT +1 −1
  7. Dockerfile +1 −1
  8. Dockerfile-alpine +1 −1
  9. Gemfile +1 −1
  10. Gemfile.lock +10 −6
  11. README.md +4 −4
  12. assets/javascripts/lib/license.js +1 −1
  13. assets/javascripts/lib/util.js +2 −20
  14. assets/javascripts/news.json +4 −0
  15. assets/javascripts/templates/pages/about_tmpl.js +1 −1
  16. assets/javascripts/views/content/entry_page.js +12 −20
  17. assets/stylesheets/application.css.scss +2 −1
  18. assets/stylesheets/pages/_mdn.scss +3 −0
  19. assets/stylesheets/pages/_openlayers.scss +10 −0
  20. docs/file-scrapers.md +11 −0
  21. lib/docs/filters/bazel/clean_html.rb +2 −0
  22. lib/docs/filters/core/normalize_urls.rb +1 −1
  23. lib/docs/filters/crystal/entries.rb +5 −1
  24. lib/docs/filters/elixir/clean_html.rb +3 −1
  25. lib/docs/filters/express/clean_html.rb +1 −1
  26. lib/docs/filters/openlayers/clean_html.rb +18 −0
  27. lib/docs/filters/openlayers/entries.rb +23 −0
  28. lib/docs/filters/phpunit/clean_html.rb +1 −1
  29. lib/docs/filters/rdoc/container.rb +5 −2
  30. lib/docs/filters/scala/entries_v2.rb +1 −1
  31. lib/docs/filters/scikit_image/entries.rb +2 −1
  32. lib/docs/filters/scikit_learn/clean_html.rb +1 −0
  33. lib/docs/filters/tensorflow/clean_html.rb +3 −0
  34. lib/docs/filters/vueuse/entries.rb +16 −0
  35. lib/docs/scrapers/bazel.rb +5 −0
  36. lib/docs/scrapers/crystal.rb +3 −2
  37. lib/docs/scrapers/docker.rb +1 −1
  38. lib/docs/scrapers/elixir.rb +12 −0
  39. lib/docs/scrapers/express.rb +1 −1
  40. lib/docs/scrapers/fastapi.rb +1 −1
  41. lib/docs/scrapers/flask.rb +5 −0
  42. lib/docs/scrapers/git.rb +1 −1
  43. lib/docs/scrapers/go.rb +11 −2
  44. lib/docs/scrapers/haskell.rb +1 −1
  45. lib/docs/scrapers/jquery/jquery_ui.rb +1 −1
  46. lib/docs/scrapers/mdn/dom.rb +1 −1
  47. lib/docs/scrapers/mdn/javascript.rb +1 −1
  48. lib/docs/scrapers/meteor.rb +1 −2
  49. lib/docs/scrapers/nix.rb +1 −3
  50. lib/docs/scrapers/openlayers.rb +24 −0
  51. lib/docs/scrapers/phpunit.rb +12 −3
  52. lib/docs/scrapers/rdoc/minitest.rb +1 −6
  53. lib/docs/scrapers/rdoc/rails.rb +4 −0
  54. lib/docs/scrapers/rdoc/ruby.rb +5 −1
  55. lib/docs/scrapers/redis.rb +1 −2
  56. lib/docs/scrapers/rust.rb +1 −1
  57. lib/docs/scrapers/sass.rb +4 −4
  58. lib/docs/scrapers/scikit_image.rb +5 −3
  59. lib/docs/scrapers/scikit_learn.rb +4 −4
  60. lib/docs/scrapers/tensorflow/tensorflow.rb +5 −0
  61. lib/docs/scrapers/tensorflow/tensorflow_cpp.rb +5 −0
  62. lib/docs/scrapers/trio.rb +2 −2
  63. lib/docs/scrapers/vite.rb +1 −1
  64. lib/docs/scrapers/vueuse.rb +1 −1
  65. lib/docs/scrapers/werkzeug.rb +5 −0
  66. lib/tasks/docs.thor +1 −1
  67. public/icons/docs/openlayers/16.png +0 −0
  68. public/icons/docs/openlayers/16@2x.png +0 −0
  69. public/icons/docs/openlayers/SOURCE +2 −0
  70. test/lib/docs/core/manifest_test.rb +1 −1
.github/workflows/build.yml+2−2
@@ -13,13 +13,13 @@ jobs: · 12 unmodified lines
1313 steps:
1414 - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0
1515 - name: Set up Ruby
16− uses: ruby/setup-ruby@540484a3c0f308b08619664ec40bf6c371d172c3 # v1.205.0
16+ uses: ruby/setup-ruby@32110d4e311bd8996b2a82bf2a43b714ccc91777 # v1.221.0
1717 with:
1818 bundler-cache: true # runs 'bundle install' and caches installed gems automatically
1919 - name: Run tests
2020 run: bundle exec rake
2121 - name: Deploy to Heroku
22− uses: akhileshns/heroku-deploy@581dd286c962b6972d427fcf8980f60755c15520 # v3.13.15
22+ uses: akhileshns/heroku-deploy@e3eb99d45a8e2ec5dca08735e089607befa4bf28 # v3.14.15
2323 with:
2424 heroku_api_key: ${{secrets.HEROKU_API_KEY}}
2525 heroku_app_name: "devdocs"
.github/workflows/schedule-doc-report.yml+1−1
@@ -11,7 +11,7 @@ jobs: · 10 unmodified lines
1111 steps:
1212 - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0
1313 - name: Set up Ruby
14− uses: ruby/setup-ruby@540484a3c0f308b08619664ec40bf6c371d172c3 # v1.205.0
14+ uses: ruby/setup-ruby@32110d4e311bd8996b2a82bf2a43b714ccc91777 # v1.221.0
1515 with:
1616 bundler-cache: true # runs 'bundle install' and caches installed gems automatically
1717 - name: Generate report
.github/workflows/test.yml+1−1
@@ -11,7 +11,7 @@ jobs: · 10 unmodified lines
1111 steps:
1212 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
1313 - name: Set up Ruby
14− uses: ruby/setup-ruby@540484a3c0f308b08619664ec40bf6c371d172c3 # v1.205.0
14+ uses: ruby/setup-ruby@32110d4e311bd8996b2a82bf2a43b714ccc91777 # v1.221.0
1515 with:
1616 bundler-cache: true # runs 'bundle install' and caches installed gems automatically
1717 - name: Run tests
.ruby-version+1−1
@@ -1 +1 @@
1−3.3.6
1+3.4.2
.tool-versions+1−1
@@ -1 +1 @@
1−ruby 3.3.6
1+ruby 3.4.2
COPYRIGHT+1−1
@@ -1,4 +1,4 @@
1−Copyright 2013-2024 Thibaut Courouble and other contributors
1+Copyright 2013-2025 Thibaut Courouble and other contributors
22
33 This Source Code Form is subject to the terms of the Mozilla Public
44 License, v. 2.0. If a copy of the MPL was not distributed with this
Dockerfile+1−1
@@ -1,4 +1,4 @@
1−FROM ruby:3.3.6
1+FROM ruby:3.4.2
22 ENV LANG=C.UTF-8
33 ENV ENABLE_SERVICE_WORKER=true
44
Dockerfile-alpine+1−1
@@ -1,4 +1,4 @@
1−FROM ruby:3.3.6-alpine
1+FROM ruby:3.4.2-alpine
22
33 ENV LANG=C.UTF-8
44 ENV ENABLE_SERVICE_WORKER=true
Gemfile+1−1
@@ -1,5 +1,5 @@
11 source 'https://rubygems.org'
2−ruby '3.3.6'
2+ruby '3.4.2'
33
44 gem 'activesupport', require: false
55 gem 'html-pipeline'
Gemfile.lock+10−6
@@ -36,7 +36,8 @@ GEM · 35 unmodified lines
3636 exifr (1.4.0)
3737 ffi (1.15.5)
3838 fspath (3.1.2)
39− highline (2.0.3)
39+ highline (3.1.2)
40+ reline
4041 html-pipeline (2.14.3)
4142 activesupport (>= 2)
4243 nokogiri (>= 1.4)
@@ -53,6 +54,7 @@ GEM · 10 unmodified lines
5354 image_optim (~> 0.19)
5455 image_size (3.3.0)
5556 in_threads (1.6.0)
57+ io-console (0.8.0)
5658 logger (1.6.2)
5759 method_source (1.0.0)
5860 mini_portile2 (2.8.8)
@@ -61,7 +63,7 @@ GEM · 2 unmodified lines
6163 mustermann (3.0.3)
6264 ruby2_keywords (~> 0.0.1)
6365 newrelic_rpm (8.16.0)
64− nokogiri (1.17.2)
66+ nokogiri (1.18.3)
6567 mini_portile2 (~> 2.8.2)
6668 racc (~> 1.4)
6769 options (2.3.2)
@@ -76,7 +78,7 @@ GEM · 8 unmodified lines
7678 byebug (~> 11.0)
7779 pry (>= 0.13, < 0.15)
7880 racc (1.8.1)
79− rack (2.2.10)
81+ rack (2.2.11)
8082 rack-protection (3.2.0)
8183 base64 (>= 0.1.0)
8284 rack (~> 2.2, >= 2.2.4)
@@ -88,6 +90,8 @@ GEM · 5 unmodified lines
8890 rb-inotify (0.10.1)
8991 ffi (~> 1.0)
9092 redcarpet (3.6.0)
93+ reline (0.6.0)
94+ io-console (~> 0.5)
9195 rexml (3.3.9)
9296 rouge (1.11.1)
9397 rr (3.1.1)
@@ -126,14 +130,14 @@ GEM · 32 unmodified lines
126130 strings-ansi (0.2.0)
127131 terminal-table (3.0.2)
128132 unicode-display_width (>= 1.1.1, < 3)
129− terser (1.2.4)
133+ terser (1.2.5)
130134 execjs (>= 0.3.0, < 3)
131135 thin (1.8.2)
132136 daemons (~> 1.0, >= 1.0.9)
133137 eventmachine (~> 1.0, >= 1.0.4)
134138 rack (>= 1, < 3)
135139 thor (1.3.2)
136− tilt (2.4.0)
140+ tilt (2.6.0)
137141 tty-pager (0.14.0)
138142 strings (~> 0.2.0)
139143 tty-screen (~> 0.8)
@@ -187,7 +191,7 @@ DEPENDENCIES · 47 unmodified lines
187191 yajl-ruby
188192
189193 RUBY VERSION
190− ruby 3.3.6p108
194+ ruby 3.4.2p28
191195
192196 BUNDLED WITH
193197 2.4.6
README.md+4−4
@@ -25,12 +25,12 @@ Unless you wish to contribute to the project, we recommend using the hosted vers · 24 unmodified lines
2525 The easiest way to run DevDocs locally is using Docker:
2626
2727 ```sh
28−docker run --name devdocs -d -p 9292:9292 ghcr.io/freecodcamp/devdocs:latest
28+docker run --name devdocs -d -p 9292:9292 ghcr.io/freecodecamp/devdocs:latest
2929 ```
3030
3131 This will start DevDocs at [localhost:9292](http://localhost:9292). We provide both regular and Alpine-based images:
32−- `ghcr.io/freecodcamp/devdocs:latest` - Standard image
33−- `ghcr.io/freecodcamp/devdocs:latest-alpine` - Alpine-based (smaller size)
32+- `ghcr.io/freecodecamp/devdocs:latest` - Standard image
33+- `ghcr.io/freecodecamp/devdocs:latest-alpine` - Alpine-based (smaller size)
3434
3535 Images are automatically built and updated monthly with the latest documentation.
3636
@@ -195,7 +195,7 @@ Made something cool? Feel free to open a PR to add a new row to this table! You · 158 unmodified lines
195195
196196 ## Copyright / License
197197
198−Copyright 2013–2024 Thibaut Courouble and [other contributors](https://github.com/freeCodeCamp/devdocs/graphs/contributors)
198+Copyright 2013–2025 Thibaut Courouble and [other contributors](https://github.com/freeCodeCamp/devdocs/graphs/contributors)
199199
200200 This software is licensed under the terms of the Mozilla Public License v2.0. See the [COPYRIGHT](./COPYRIGHT) and [LICENSE](./LICENSE) files.
201201
assets/javascripts/lib/license.js+1−1
@@ -1,5 +1,5 @@
11 /*
2− * Copyright 2013-2024 Thibaut Courouble and other contributors
2+ * Copyright 2013-2025 Thibaut Courouble and other contributors
33 *
44 * This source code is licensed under the terms of the Mozilla
55 * Public License, v. 2.0, a copy of which may be obtained at:
assets/javascripts/lib/util.js+2−20
@@ -457,13 +457,13 @@ $.noop = function () {}; · 456 unmodified lines
457457
458458 $.popup = function (value) {
459459 try {
460+ window.open(value.href || value, "_blank", "noopener");
461+ } catch (error) {
460462 const win = window.open();
461463 if (win.opener) {
462464 win.opener = null;
463465 }
464466 win.location = value.href || value;
465− } catch (error) {
466− window.open(value.href || value, "_blank");
467467 }
468468 };
469469
@@ -526,21 +526,3 @@ $.highlight = function (el, options) { · 56 unmodified lines
526526 el.classList.add(options.className);
527527 setTimeout(() => el.classList.remove(options.className), options.delay);
528528 };
529−
530−$.copyToClipboard = function (string) {
531− let result;
532− const textarea = document.createElement("textarea");
533− textarea.style.position = "fixed";
534− textarea.style.opacity = 0;
535− textarea.value = string;
536− document.body.appendChild(textarea);
537− try {
538− textarea.select();
539− result = !!document.execCommand("copy");
540− } catch (error) {
541− result = false;
542− } finally {
543− document.body.removeChild(textarea);
544− }
545− return result;
546−};
assets/javascripts/news.json+4−0
@@ -1,4 +1,8 @@
11 [
2+ [
3+ "2025-02-16",
4+ "New documentation: <a href=\"/openlayers/\">OpenLayers</a>"
5+ ],
26 [
37 "2024-11-23",
48 "New documentation: <a href=\"/duckdb/\">DuckDB</a>"
assets/javascripts/templates/pages/about_tmpl.js+1−1
@@ -32,7 +32,7 @@ app.templates.aboutPage = function () { · 31 unmodified lines
3232
3333 <h2 class="_block-heading" id="copyright">Copyright and License</h2>
3434 <p class="_note">
35− <strong>Copyright 2013&ndash;2024 Thibaut Courouble and <a href="https://github.com/freeCodeCamp/devdocs/graphs/contributors">other contributors</a></strong><br>
35+ <strong>Copyright 2013&ndash;2025 Thibaut Courouble and <a href="https://github.com/freeCodeCamp/devdocs/graphs/contributors">other contributors</a></strong><br>
3636 This software is licensed under the terms of the Mozilla Public License v2.0.<br>
3737 You may obtain a copy of the source code at <a href="https://github.com/freeCodeCamp/devdocs">github.com/freeCodeCamp/devdocs</a>.<br>
3838 For more information, see the <a href="https://github.com/freeCodeCamp/devdocs/blob/main/COPYRIGHT">COPYRIGHT</a>
assets/javascripts/views/content/entry_page.js+12−20
@@ -96,16 +96,9 @@ app.views.EntryPage = class EntryPage extends app.View { · 95 unmodified lines
9696 return content;
9797 }
9898
99− const links = (() => {
100− const result = [];
101− for (var link in this.entry.doc.links) {
102− var url = this.entry.doc.links[link];
103− result.push(
104− `<a href="${url}" class="_links-link">${EntryPage.LINKS[link]}</a>`,
105− );
106− }
107− return result;
108− })();
99+ const links = Object.entries(this.entry.doc.links).map(([link, url]) => {
100+ return `<a href="${url}" class="_links-link">${EntryPage.LINKS[link]}</a>`;
101+ });
109102
110103 return `<p class="_links">${links.join("")}</p>${content}`;
111104 }
@@ -203,8 +196,8 @@ app.views.EntryPage = class EntryPage extends app.View { · 91 unmodified lines
203196 }
204197
205198 restore() {
206− let path;
207− if (this.cacheMap[(path = this.entry.filePath())]) {
199+ const path = this.entry.filePath();
200+ if (this.cacheMap[[path]]) {
208201 this.render(this.cacheMap[path], true);
209202 return true;
210203 }
@@ -217,18 +210,17 @@ app.views.EntryPage = class EntryPage extends app.View { · 6 unmodified lines
217210 this.load();
218211 } else if (target.classList.contains("_pre-clip")) {
219212 $.stopEvent(event);
220− target.classList.add(
221− $.copyToClipboard(target.parentNode.textContent)
222− ? "_pre-clip-success"
223− : "_pre-clip-error",
213+ navigator.clipboard.writeText(target.parentNode.textContent).then(
214+ () => target.classList.add("_pre-clip-success"),
215+ () => target.classList.add("_pre-clip-error"),
224216 );
225217 setTimeout(() => (target.className = "_pre-clip"), 2000);
226218 }
227219 }
228220
229221 onAltC() {
230− let link;
231− if (!(link = this.find("._attribution:last-child ._attribution-link"))) {
222+ const link = this.find("._attribution:last-child ._attribution-link");
223+ if (!link) {
232224 return;
233225 }
234226 console.log(link.href + location.hash);
@@ -236,8 +228,8 @@ app.views.EntryPage = class EntryPage extends app.View { · 1 unmodified line
236228 }
237229
238230 onAltO() {
239− let link;
240− if (!(link = this.find("._attribution:last-child ._attribution-link"))) {
231+ const link = this.find("._attribution:last-child ._attribution-link");
232+ if (!link) {
241233 return;
242234 }
243235 this.delay(() => $.popup(link.href + location.hash));
assets/stylesheets/application.css.scss+2−1
@@ -3,7 +3,7 @@ · 2 unmodified lines
33 //= depend_on sprites/docs.json
44
55 /*!
6− * Copyright 2013-2024 Thibaut Courouble and other contributors
6+ * Copyright 2013-2025 Thibaut Courouble and other contributors
77 *
88 * This source code is licensed under the terms of the Mozilla
99 * Public License, v. 2.0, a copy of which may be obtained at:
@@ -97,6 +97,7 @@ · 87 unmodified lines
9797 'pages/nushell',
9898 'pages/octave',
9999 'pages/openjdk',
100+ 'pages/openlayers',
100101 'pages/perl',
101102 'pages/phalcon',
102103 'pages/phaser',
assets/stylesheets/pages/_mdn.scss+3−0
@@ -28,6 +28,9 @@ · 27 unmodified lines
2828
2929 p > code, li > code { @extend %label; }
3030
31+ details { @extend %box; }
32+ summary > div { display: inline; }
33+
3134 > .note,
3235 .notecard, // MDN 2021
3336 .notice,
assets/stylesheets/pages/_openlayers.scss+10−0
@@ -0,0 +1,10 @@
1+._openlayers {
2+ @extend %simple;
3+ .nameContainer {
4+ @extend %block-label;
5+ > * { display: inline-block; margin: 0; }
6+ > .tag-source { float: right; }
7+ }
8+ .card { @extend %box; margin-bottom: 1rem; padding: 1rem; }
9+ .signature, .type-signature { @extend %code; }
10+}
docs/file-scrapers.md+11−0
@@ -254,6 +254,17 @@ done · 253 unmodified lines
254254
255255 ### Nokogiri
256256 ### Ruby / Minitest
257+
258+```sh
259+git clone https://github.com/seattlerb/minitest
260+cd minitest/
261+bundle install
262+bundle add rdoc hoe
263+bundle exec rak docs
264+cd ..
265+cp -r minitest/docs $DEVDOCS/docs/minitest
266+```
267+
257268 ### Ruby on Rails
258269 * Download a release at https://github.com/rails/rails/releases or clone https://github.com/rails/rails.git (checkout to the branch of the rails' version that is going to be scraped)
259270 * Open `railties/lib/rails/api/task.rb` and comment out any code related to sdoc (`configure_sdoc`)
lib/docs/filters/bazel/clean_html.rb+2−0
@@ -7,8 +7,10 @@ module Docs · 6 unmodified lines
77 css('devsite-feature-tooltip').remove
88 css('devsite-thumb-rating').remove
99 css('devsite-toc').remove
10+ css('devsite-feedback').remove
1011 css('a.button-with-icon').remove
1112 css('button.devsite-heading-link').remove
13+ css('.devsite-article-body > span:first-child[style="float: right; line-height: 36px"]').remove
1214 doc
1315 end
1416
lib/docs/filters/core/normalize_urls.rb+1−1
@@ -42,7 +42,7 @@ module Docs · 41 unmodified lines
4242 def fix_url(url)
4343 if context[:redirections]
4444 url = URL.parse(url)
45− path = url.path.downcase
45+ path = url.path ? url.path.downcase : nil
4646
4747 if context[:redirections].key?(path)
4848 url.path = context[:redirections][path]
lib/docs/filters/crystal/entries.rb+5−1
@@ -16,8 +16,12 @@ module Docs · 15 unmodified lines
1616 name
1717 else
1818 return at_css('h1').content.strip unless at_css('.type-name')
19− name = at_css('.type-name').children.last.content.strip
19+ name = at_css('.type-name').children.reject { |n| n.matches?('.kind') }
20+ name.map! { |n| n.text.strip }
21+ name.reject! &:empty?
22+ name = name.join
2023 name.remove! %r{\(.*\)}
24+ name.strip!
2125 name
2226 end
2327 end
lib/docs/filters/elixir/clean_html.rb+3−1
@@ -34,7 +34,9 @@ module Docs · 33 unmodified lines
3434 node.name = 'h3'
3535 node['id'] = id
3636
37− source_href = node.at_css('a.icon-action[title="View Source"]').attr('href')
37+ a = node.at_css('a.icon-action[title="View Source"]')
38+ a ||= node.at_css('a.icon-action[aria-label="View Source"]')
39+ source_href = a.attr('href')
3840
3941 node.content = node.at_css('.signature').inner_text
4042 node << %(<a href="#{source_href}" class="source">Source</a>)
lib/docs/filters/express/clean_html.rb+1−1
@@ -3,7 +3,7 @@ module Docs · 2 unmodified lines
33 class CleanHtmlFilter < Filter
44 def call
55 i = 1
6− n = at_css("#navmenu a[href='#{result[:path].split('/').last}']").parent
6+ n = at_css("#navmenu .submenu-content a[href='#{result[:path].split('/').last}']").parent
77 i += 1 while n && n = n.previous_element
88 at_css('h1')['data-level'] = i
99
lib/docs/filters/openlayers/clean_html.rb+18−0
@@ -0,0 +1,18 @@
1+module Docs
2+ class Openlayers
3+ class CleanHtmlFilter < Filter
4+ def call
5+ @doc = at_css('section')
6+
7+ at_css('h2').name = 'h1' if at_css('h2')
8+
9+ css('pre.prettyprint').each do |node|
10+ node['data-language'] = node['class'].include?('html') ? 'html' : 'js'
11+ node.content = node.content
12+ end
13+
14+ doc
15+ end
16+ end
17+ end
18+end
lib/docs/filters/openlayers/entries.rb+23−0
@@ -0,0 +1,23 @@
1+module Docs
2+ class Openlayers
3+ class EntriesFilter < Docs::EntriesFilter
4+ def get_name
5+ at_css('h2').text.split('~').last.strip
6+ end
7+
8+ def get_type
9+ slug[/ol_([^_]+)_/, 1] or 'ol'
10+ end
11+
12+ def additional_entries
13+ css('h4.name').each_with_object [] do |node, entries|
14+ node['id'] = node.previous_element['id']
15+ next if node.at_css('.inherited')
16+ name = node.children.find {|n| n.text? }.text.strip
17+ name.prepend "#{self.name}."
18+ entries << [name, node['id']]
19+ end
20+ end
21+ end
22+ end
23+end
lib/docs/filters/phpunit/clean_html.rb+1−1
@@ -2,7 +2,7 @@ module Docs · 1 unmodified line
22 class Phpunit
33 class CleanHtmlFilter < Filter
44 def call
5− @doc = at_css('.section') if not root_page?
5+ @doc = at_css('section') if not root_page?
66
77 css('pre').each do |node|
88 node['class'] = 'highlight'
lib/docs/filters/rdoc/container.rb+5−2
@@ -13,8 +13,11 @@ module Docs · 12 unmodified lines
1313 meta = Nokogiri::XML::Node.new 'dl', doc.document
1414 meta['class'] = 'meta'
1515
16− if parent = at_css('#parent-class-section')
17− meta << %(<dt>Parent:</dt><dd class="meta-parent">#{parent.at_css('.link').inner_html.strip}</dd>)
16+ parent = at_css('#parent-class-section')
17+ if parent && link = parent.at_css('.link')
18+ meta << %(<dt>Parent:</dt><dd class="meta-parent">#{link.inner_html.strip}</dd>)
19+ elsif parent && link = parent.at_css('a')
20+ meta << %(<dt>Parent:</dt><dd class="meta-parent">#{link.to_html}</dd>)
1821 end
1922
2023 if includes = at_css('#includes-section')
lib/docs/filters/scala/entries_v2.rb+1−1
@@ -71,7 +71,7 @@ module Docs · 70 unmodified lines
7171 # name from the HTML because companion object classes may be broken out into
7272 # their own entries (by the source documentation). When that happens,
7373 # we want to group these classes (like `scala.reflect.api.Annotations.Annotation`)
74− # under the package name, and not the fully-qualfied name which would
74+ # under the package name, and not the fully-qualified name which would
7575 # include the companion object.
7676 def package_name
7777 name = package_drop_last(slug_parts)
lib/docs/filters/scikit_image/entries.rb+2−1
@@ -3,7 +3,8 @@ module Docs · 2 unmodified lines
33 class EntriesFilter < Docs::EntriesFilter
44 def get_name
55 name = at_css('h1').content.strip
6− name.remove! "\u{00b6}"
6+ name.delete_suffix! "¶"
7+ name.delete_suffix! "#"
78
89 if slug.start_with?('api')
910 name.remove! 'Module: '
lib/docs/filters/scikit_learn/clean_html.rb+1−0
@@ -2,6 +2,7 @@ module Docs · 1 unmodified line
22 class ScikitLearn
33 class CleanHtmlFilter < Filter
44 def call
5+ @doc = at_css('main article', 'main')
56 if root_page?
67 css('.row').each do |node|
78 html = '<dl>'
lib/docs/filters/tensorflow/clean_html.rb+3−0
@@ -46,6 +46,9 @@ module Docs · 45 unmodified lines
4646 node.replace("<p>#{node.to_html}</p>")
4747 end
4848
49+ css('span[slot="popout-heading"]').remove
50+ css('span[slot="popout-contents"]').remove
51+
4952 doc
5053 end
5154 end
lib/docs/filters/vueuse/entries.rb+16−0
@@ -248,6 +248,10 @@ module Docs · 247 unmodified lines
248248 "text": "usePreferredReducedMotion",
249249 "link": "/core/usePreferredReducedMotion/"
250250 },
251+ {
252+ "text": "usePreferredReducedTransparency",
253+ "link": "/core/usePreferredReducedTransparency/"
254+ },
251255 {
252256 "text": "useScreenOrientation",
253257 "link": "/core/useScreenOrientation/"
@@ -264,6 +268,10 @@ module Docs · 10 unmodified lines
264268 "text": "useShare",
265269 "link": "/core/useShare/"
266270 },
271+ {
272+ "text": "useSSRWidth",
273+ "link": "/core/useSSRWidth/"
274+ },
267275 {
268276 "text": "useStyleTag",
269277 "link": "/core/useStyleTag/"
@@ -313,6 +321,10 @@ module Docs · 43 unmodified lines
313321 "text": "onClickOutside",
314322 "link": "/core/onClickOutside/"
315323 },
324+ {
325+ "text": "onElementRemoval",
326+ "link": "/core/onElementRemoval/"
327+ },
316328 {
317329 "text": "onKeyStroke",
318330 "link": "/core/onKeyStroke/"
@@ -788,6 +800,10 @@ module Docs · 469 unmodified lines
788800 {
789801 "text": "Time",
790802 "items": [
803+ {
804+ "text": "useCountdown",
805+ "link": "/core/useCountdown/"
806+ },
791807 {
792808 "text": "useDateFormat",
793809 "link": "/shared/useDateFormat/"
lib/docs/scrapers/bazel.rb+5−0
@@ -12,6 +12,11 @@ module Docs · 11 unmodified lines
1212 Licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License.
1313 HTML
1414
15+ version '8.0' do
16+ self.release = '8.0.0'
17+ self.base_url = 'https://bazel.build/versions/8.0.0/reference/be/'
18+ end
19+
1520 version '7.0' do
1621 self.release = '7.0.0'
1722 self.base_url = 'https://bazel.build/versions/7.0.0/reference/be/'
lib/docs/scrapers/crystal.rb+3−2
@@ -2,7 +2,7 @@ module Docs · 1 unmodified line
22 class Crystal < UrlScraper
33 include MultipleBaseUrls
44 self.type = 'crystal'
5− self.release = '1.14.0'
5+ self.release = '1.15.1'
66 self.base_urls = [
77 "https://crystal-lang.org/api/#{release}/",
88 "https://crystal-lang.org/reference/#{release[0..2]}/",
@@ -21,6 +21,7 @@ module Docs · 12 unmodified lines
2121
2222 options[:skip_patterns] = [
2323 %r{\ACrystal/System/},
24+ %r{\ACrystal/PointerPairingHeap/},
2425 %r{\AIO/Evented.html\z},
2526 %r{\ARegex/PCRE2.html\z}
2627 ]
@@ -34,7 +35,7 @@ module Docs · 7 unmodified lines
3435 HTML
3536 else
3637 <<-HTML
37− &copy; 2012&ndash;2024 Manas Technology Solutions.<br>
38+ &copy; 2012&ndash;2025 Manas Technology Solutions.<br>
3839 Licensed under the Apache License, Version 2.0.
3940 HTML
4041 end
lib/docs/scrapers/docker.rb+1−1
@@ -96,7 +96,7 @@ module Docs · 95 unmodified lines
9696
9797 def get_latest_version(opts)
9898 doc = fetch_doc('https://docs.docker.com/engine/release-notes/', opts)
99− latest_version = doc.at_css('.DocSearch-content > h2 > a').content.strip
99+ latest_version = doc.at_css('h2.scroll-mt-20 > a').content.strip
100100 latest_version.rpartition(' ')[-1]
101101 end
102102 end
lib/docs/scrapers/elixir.rb+12−0
@@ -30,6 +30,18 @@ module Docs · 29 unmodified lines
3030 "https://hexdocs.pm/mix/#{self.class.release}/Mix.html" ]
3131 end
3232
33+ version '1.18' do
34+ self.release = '1.18.1'
35+ self.base_urls = [
36+ "https://hexdocs.pm/elixir/#{release}/",
37+ "https://hexdocs.pm/eex/#{release}/",
38+ "https://hexdocs.pm/ex_unit/#{release}/",
39+ "https://hexdocs.pm/iex/#{release}/",
40+ "https://hexdocs.pm/logger/#{release}/",
41+ "https://hexdocs.pm/mix/#{release}/"
42+ ]
43+ end
44+
3345 version '1.17' do
3446 self.release = '1.17.2'
3547 self.base_urls = [
lib/docs/scrapers/express.rb+1−1
@@ -2,7 +2,7 @@ module Docs · 1 unmodified line
22 class Express < UrlScraper
33 self.name = 'Express'
44 self.type = 'express'
5− self.release = '4.18.1'
5+ self.release = '4.21.2'
66 self.base_url = 'https://expressjs.com/en/'
77 self.root_path = '4x/api.html'
88 self.initial_paths = %w(
lib/docs/scrapers/fastapi.rb+1−1
@@ -2,7 +2,7 @@ module Docs · 1 unmodified line
22 class Fastapi < UrlScraper
33 self.name = 'FastAPI'
44 self.type = 'fastapi'
5− self.release = '0.111.1'
5+ self.release = '0.115.6'
66 self.base_url = 'https://fastapi.tiangolo.com/'
77 self.root_path = '/'
88 self.links = {
lib/docs/scrapers/flask.rb+5−0
@@ -18,6 +18,11 @@ module Docs · 17 unmodified lines
1818 Licensed under the BSD 3-clause License.
1919 HTML
2020
21+ version do
22+ self.release = '3.1.1'
23+ self.base_url = "https://flask.palletsprojects.com/en/stable/"
24+ end
25+
2126 version '3.0' do
2227 self.release = '3.0.x'
2328 self.base_url = "https://flask.palletsprojects.com/en/#{self.release}/"
lib/docs/scrapers/git.rb+1−1
@@ -1,7 +1,7 @@
11 module Docs
22 class Git < UrlScraper
33 self.type = 'git'
4− self.release = '2.47.1'
4+ self.release = '2.48.1'
55 self.base_url = 'https://git-scm.com/docs'
66 self.initial_paths = %w(/git.html)
77 self.links = {
lib/docs/scrapers/go.rb+11−2
@@ -1,7 +1,7 @@
11 module Docs
22 class Go < UrlScraper
33 self.type = 'go'
4− self.release = '1.23.0'
4+ self.release = '1.24.0'
55 self.base_url = 'https://golang.org/pkg/'
66 self.links = {
77 home: 'https://golang.org/',
@@ -10,10 +10,19 @@ module Docs · 2 unmodified lines
1010
1111 # Run godoc locally, since https://golang.org/pkg/ redirects to https://pkg.go.dev/std with rate limiting / scraping protection.
1212
13− # podman run --net host --rm -it docker.io/golang:1.23.0
13+ # podman run --net host --rm -it docker.io/golang:1.24.0
1414 #podman# go install golang.org/x/tools/cmd/godoc@latest
1515 #podman# rm -r /usr/local/go/test/
1616 #podman# godoc -http 0.0.0.0:6060 -v
17+
18+ # or using alpine
19+ # podman run --net host --rm -it alpine:latest
20+ #podman# apk add curl
21+ #podman# curl -LO https://go.dev/dl/go1.24.0.linux-amd64.tar.gz
22+ #podman# tar xf go1.24.0.linux-amd64.tar.gz
23+ #podman# go/bin/go install golang.org/x/tools/cmd/godoc@latest
24+ #podman# /root/go/bin/godoc -http 0.0.0.0:6060 -v
25+
1726 self.base_url = 'http://localhost:6060/pkg/'
1827
1928 html_filters.push 'clean_local_urls'
lib/docs/scrapers/haskell.rb+1−1
@@ -59,7 +59,7 @@ module Docs · 58 unmodified lines
5959 end
6060
6161 version '9' do
62− self.release = '9.4.2'
62+ self.release = '9.12.1'
6363 self.base_url = "https://downloads.haskell.org/~ghc/#{release}/docs/"
6464 options[:container] = ->(filter) {filter.subpath.start_with?('users_guide') ? '.document' : '#content'}
6565 end
lib/docs/scrapers/jquery/jquery_ui.rb+1−1
@@ -2,7 +2,7 @@ module Docs · 1 unmodified line
22 class JqueryUi < Jquery
33 self.name = 'jQuery UI'
44 self.slug = 'jqueryui'
5− self.release = '1.13.0'
5+ self.release = '1.14.1'
66 self.base_url = 'https://api.jqueryui.com'
77 self.root_path = '/category/all'
88
lib/docs/scrapers/mdn/dom.rb+1−1
@@ -1,6 +1,6 @@
11 module Docs
22 class Dom < Mdn
3− # release = '2023-08-20'
3+ # release = '2025-01-30'
44 self.name = 'Web APIs'
55 self.slug = 'dom'
66 self.base_url = 'https://developer.mozilla.org/en-US/docs/Web/API'
lib/docs/scrapers/mdn/javascript.rb+1−1
@@ -3,7 +3,7 @@ module Docs · 2 unmodified lines
33 prepend FixInternalUrlsBehavior
44 prepend FixRedirectionsBehavior
55
6− # release = '2024-11-18'
6+ # release = '2025-01-30'
77 self.name = 'JavaScript'
88 self.base_url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference'
99 self.links = {
lib/docs/scrapers/meteor.rb+1−2
@@ -47,8 +47,7 @@ module Docs · 46 unmodified lines
4747 end
4848
4949 def get_latest_version(opts)
50− doc = fetch_doc('https://docs.meteor.com/#/full/', opts)
51− doc.at_css('select.version-select > option').content
50+ get_npm_version('meteor', opts)
5251 end
5352 end
5453 end
lib/docs/scrapers/nix.rb+1−3
@@ -23,9 +23,7 @@ module Docs · 22 unmodified lines
2323
2424 def get_latest_version(opts)
2525 doc = fetch_doc('https://nixos.org/manual/nix/stable/', opts)
26− json = JSON.parse(doc.at_css('body')['data-nix-channels'])
27− channel = json.find { |c| c['channel'] == 'stable' }
28− channel['version']
26+ doc.at_css('a.active')['href'].scan(/([0-9.]+)/)[0][0]
2927 end
3028 end
3129 end
lib/docs/scrapers/openlayers.rb+24−0
@@ -0,0 +1,24 @@
1+module Docs
2+ class Openlayers < UrlScraper
3+ self.name = 'OpenLayers'
4+ self.type = 'openlayers'
5+ self.slug = 'openlayers'
6+ self.release = '10.4.0'
7+ self.base_url = "https://openlayers.org/en/latest/apidoc/"
8+ self.links = {
9+ home: 'https://openlayers.org/',
10+ code: 'https://github.com/openlayers/openlayers'
11+ }
12+
13+ html_filters.push 'openlayers/entries', 'openlayers/clean_html'
14+
15+ options[:attribution] = <<-HTML
16+ &copy; 2005-present, OpenLayers Contributors All rights reserved.
17+ Licensed under the BSD 2-Clause License.
18+ HTML
19+
20+ def get_latest_version(opts)
21+ get_npm_version('ol', opts)
22+ end
23+ end
24+end
lib/docs/scrapers/phpunit.rb+12−3
@@ -17,12 +17,21 @@ module Docs · 16 unmodified lines
1717 options[:title] = false
1818
1919 options[:attribution] = <<-HTML
20− &copy; 2005&ndash;2020 Sebastian Bergmann<br>
20+ &copy; 2005&ndash;2025 Sebastian Bergmann<br>
2121 Licensed under the Creative Commons Attribution 3.0 Unported License.
2222 HTML
2323
2424 FILTERS = %w(phpunit/clean_html phpunit/entries title)
2525
26+ version do
27+ self.release = '12.0'
28+ self.base_url = "https://docs.phpunit.de/en/#{release}/"
29+
30+ html_filters.push FILTERS
31+
32+ options[:container] = '.document'
33+ end
34+
2635 version '9' do
2736 self.release = '9.5'
2837 self.base_url = "https://phpunit.readthedocs.io/en/#{release}/"
@@ -77,8 +86,8 @@ module Docs · 48 unmodified lines
7786
7887 def get_latest_version(opts)
7988 doc = fetch_doc('https://phpunit.readthedocs.io/', opts)
80− label = doc.at_css('.rst-current-version').content.strip
81− label.scan(/v: ([0-9.]+)/)[0][0]
89+ label = doc.at_css('meta[name="readthedocs-version-slug"]')["content"]
90+ label
8291 end
8392
8493 end
lib/docs/scrapers/rdoc/minitest.rb+1−6
@@ -1,14 +1,9 @@
11 module Docs
22 class Minitest < Rdoc
3− # Instructions:
4− # 1. Run "gem update rdoc hoe"
5− # 2. Download the source code at https://github.com/seattlerb/minitest
6− # 3. Run "rake docs" (in the Minitest directory)
7− # 4. Copy the "docs" directory to "docs/minitest"
83
94 self.name = 'Ruby / Minitest'
105 self.slug = 'minitest'
11− self.release = '5.20.0'
6+ self.release = '5.25.4'
127 self.links = {
138 code: 'https://github.com/minitest/minitest'
149 }
lib/docs/scrapers/rdoc/rails.rb+4−0
@@ -75,6 +75,10 @@ module Docs · 74 unmodified lines
7575 end
7676 end
7777
78+ version '8.0' do
79+ self.release = '8.0.1'
80+ end
81+
7882 version '7.2' do
7983 self.release = '7.2.1'
8084 end
lib/docs/scrapers/rdoc/ruby.rb+5−1
@@ -63,12 +63,16 @@ module Docs · 62 unmodified lines
6363 /\AXMP/]
6464
6565 options[:attribution] = <<-HTML
66− Ruby Core &copy; 1993&ndash;2022 Yukihiro Matsumoto<br>
66+ Ruby Core &copy; 1993&ndash;2024 Yukihiro Matsumoto<br>
6767 Licensed under the Ruby License.<br>
6868 Ruby Standard Library &copy; contributors<br>
6969 Licensed under their own licenses.
7070 HTML
7171
72+ version '3.4' do
73+ self.release = '3.4.1'
74+ end
75+
7276 version '3.3' do
7377 self.release = '3.3.0'
7478 end
lib/docs/scrapers/redis.rb+1−2
@@ -22,8 +22,7 @@ module Docs · 21 unmodified lines
2222
2323 def get_latest_version(opts)
2424 body = fetch('http://download.redis.io/redis-stable/00-RELEASENOTES', opts)
25− body = body.lines[1..-1].join
26− body.scan(/Redis ([0-9.]+)/)[0][0]
25+ body.scan(/Redis Community Edition ([0-9.]+)/)[0][0]
2726 end
2827
2928 private
lib/docs/scrapers/rust.rb+1−1
@@ -3,7 +3,7 @@ · 2 unmodified lines
33 module Docs
44 class Rust < UrlScraper
55 self.type = 'rust'
6− self.release = '1.83.0'
6+ self.release = '1.84.1'
77 self.base_url = 'https://doc.rust-lang.org/'
88 self.root_path = 'book/index.html'
99 self.initial_paths = %w(
lib/docs/scrapers/sass.rb+4−4
@@ -1,7 +1,7 @@
11 module Docs
22 class Sass < UrlScraper
33 self.type = 'yard'
4− self.release = '1.82.9'
4+ self.release = '1.85.0'
55 self.base_url = 'https://sass-lang.com/documentation'
66 self.root_path = 'index.html'
77 self.links = {
@@ -17,16 +17,16 @@ module Docs · 9 unmodified lines
1717 options[:trailing_slash] = false
1818
1919 options[:attribution] = <<-HTML
20− &copy; 2006&ndash;2024 the Sass team, and numerous contributors<br>
20+ &copy; 2006&ndash;2025 the Sass team, and numerous contributors<br>
2121 Licensed under the MIT License.
2222 HTML
23−
24− private
2523
2624 def get_latest_version(opts)
2725 get_npm_version('sass', opts)
2826 end
2927
28+ private
29+
3030 def parse(response)
3131 response.body.gsub! '<span class="widont">&nbsp;</span>', '&nbsp;'
3232 end
lib/docs/scrapers/scikit_image.rb+5−3
@@ -3,8 +3,10 @@ module Docs · 2 unmodified lines
33 self.name = 'scikit-image'
44 self.slug = 'scikit_image'
55 self.type = 'sphinx'
6− self.release = '0.18.1'
7− self.base_url = 'https://scikit-image.org/docs/0.18.x/'
6+ self.release = '0.25.0'
7+ v = self.release[/\d+\.\d+/]
8+ self.base_url = "https://scikit-image.org/docs/#{v}.x/"
9+ self.initial_paths = %w(/ /api/ /user_guide/)
810 self.links = {
911 home: 'https://scikit-image.org/',
1012 code: 'https://github.com/scikit-image/scikit-image'
@@ -12,7 +14,7 @@ module Docs · 1 unmodified line
1214
1315 html_filters.push 'scikit_image/entries', 'sphinx/clean_html'
1416
15− options[:container] = '.span9'
17+ options[:container] = 'main article'
1618 options[:skip] = %w(api_changes.html)
1719 options[:only_patterns] = [/\Aapi/, /\Auser_guide/]
1820
lib/docs/scrapers/scikit_learn.rb+4−4
@@ -3,8 +3,9 @@ module Docs · 2 unmodified lines
33 self.name = 'scikit-learn'
44 self.slug = 'scikit_learn'
55 self.type = 'sphinx'
6− self.release = '1.1.3'
7− self.base_url = "https://scikit-learn.org/1.1/"
6+ self.release = '1.6.1'
7+ v = self.release[/\d+\.\d+/]
8+ self.base_url = "https://scikit-learn.org/#{v}/"
89 self.root_path = 'index.html'
910 self.force_gzip = true
1011 self.links = {
@@ -14,7 +15,6 @@ module Docs · 3 unmodified lines
1415
1516 html_filters.push 'scikit_learn/entries', 'scikit_learn/clean_html', 'sphinx/clean_html', 'title'
1617
17− options[:container] = ->(filter) { filter.root_page? ? 'body > .container' : '#sk-page-content-wrapper > .body' }
1818 options[:skip] = %w(modules/generated/sklearn.experimental.enable_iterative_imputer.html
1919 modules/generated/sklearn.experimental.enable_hist_gradient_boosting.html)
2020 options[:only_patterns] = [/\Amodules/, /\Adatasets/, /\Atutorial/, /\Aauto_examples/]
@@ -24,7 +24,7 @@ module Docs · 3 unmodified lines
2424 options[:max_image_size] = 256_000
2525
2626 options[:attribution] = <<-HTML
27− &copy; 2007&ndash;2022 The scikit-learn developers<br>
27+ &copy; 2007&ndash;2025 The scikit-learn developers<br>
2828 Licensed under the 3-clause BSD License.
2929 HTML
3030
lib/docs/scrapers/tensorflow/tensorflow.rb+5−0
@@ -19,6 +19,11 @@ module Docs · 18 unmodified lines
1919 Code samples licensed under the Apache 2.0 License.
2020 HTML
2121
22+ version do
23+ self.release = "2.18.0"
24+ self.base_url = "https://www.tensorflow.org/api_docs/python/tf"
25+ end
26+
2227 version '2.9' do
2328 self.release = "2.9.1"
2429 self.base_url = "https://www.tensorflow.org/versions/r#{version}/api_docs/python/tf"
lib/docs/scrapers/tensorflow/tensorflow_cpp.rb+5−0
@@ -3,6 +3,11 @@ module Docs · 2 unmodified lines
33 self.name = 'TensorFlow C++'
44 self.slug = 'tensorflow_cpp'
55
6+ version do
7+ self.release = "2.18.0"
8+ self.base_url = "https://www.tensorflow.org/api_docs/cc"
9+ end
10+
611 version '2.9' do
712 self.release = "2.9.1"
813 self.base_url = "https://www.tensorflow.org/versions/r#{version}/api_docs/cc"
lib/docs/scrapers/trio.rb+2−2
@@ -1,7 +1,7 @@
11 module Docs
22 class Trio < UrlScraper
33 self.type = 'simple'
4− self.release = '0.22.2'
4+ self.release = '0.29.0'
55 self.base_url = "https://trio.readthedocs.io/en/v#{self.release}/"
66 self.root_path = 'index.html'
77 self.links = {
@@ -25,7 +25,7 @@ module Docs · 17 unmodified lines
2525
2626 def get_latest_version(opts)
2727 doc = fetch_doc('https://trio.readthedocs.io/en/stable/', opts)
28− doc.at_css('.rst-other-versions a[href^="/en/v"]').content[1..-1]
28+ doc.at_css('div.trio-version').content[0..-1]
2929 end
3030 end
3131 end
lib/docs/scrapers/vite.rb+1−1
@@ -22,7 +22,7 @@ module Docs · 21 unmodified lines
2222 html_filters.push 'vite/entries', 'vite/clean_html'
2323
2424 version do
25− self.release = '6.0.1'
25+ self.release = '6.1.0'
2626 self.base_url = 'https://vite.dev/'
2727 end
2828
lib/docs/scrapers/vueuse.rb+1−1
@@ -22,7 +22,7 @@ module Docs · 21 unmodified lines
2222 Licensed under the MIT License.
2323 HTML
2424
25− self.release = '12.0.0'
25+ self.release = '12.5.0'
2626 self.base_url = 'https://vueuse.org/'
2727 self.initial_paths = %w(functions.html)
2828 html_filters.push 'vueuse/entries', 'vite/clean_html', 'vueuse/clean_html'
lib/docs/scrapers/werkzeug.rb+5−0
@@ -17,6 +17,11 @@ module Docs · 16 unmodified lines
1717 Licensed under the BSD 3-clause License.
1818 HTML
1919
20+ version do
21+ self.release = '3.1.1'
22+ self.base_url = "https://werkzeug.palletsprojects.com/en/latest/"
23+ end
24+
2025 version '3.0' do
2126 self.release = '3.0.x'
2227 self.base_url = "https://werkzeug.palletsprojects.com/en/#{self.release}/"
lib/tasks/docs.thor+1−1
@@ -239,7 +239,7 @@ class DocsCLI < Thor · 238 unmodified lines
239239 ['index.json', 'meta.json'].each do |filename|
240240 json = "https://documents.devdocs.io/#{doc.path}/#{filename}?#{time}"
241241 begin
242− URI.open(json) do |file|
242+ URI.open(json, "Accept-Encoding" => "identity") do |file|
243243 mutex.synchronize do
244244 path = File.join(dir, filename)
245245 File.write(path, file.read)
public/icons/docs/openlayers/16.png+0−0

Binary file not shown.

public/icons/docs/openlayers/16@2x.png+0−0

Binary file not shown.

public/icons/docs/openlayers/SOURCE+2−0
@@ -0,0 +1,2 @@
1+https://github.com/openlayers
2+https://avatars.githubusercontent.com/u/240579?s=64
test/lib/docs/core/manifest_test.rb+1−1
@@ -64,7 +64,7 @@ class ManifestTest < Minitest::Spec · 63 unmodified lines
6464 it "includes the doc's meta representation" do
6565 json = manifest.as_json
6666 assert_equal 1, json.length
67− assert_equal "{\"name\"=>\"Test\", \"db_size\"=>776533, :attribution=>\"foo\", :alias=>nil}", json[0].to_s
67+ assert_equal "{\"name\" => \"Test\", \"db_size\" => 776533, attribution: \"foo\", alias: nil}", json[0].to_s
6868 end
6969 end
7070