Merge branch 'origin/main' into ruby_3.1.2

pull/1867/head
Simon Legner 2 years ago
commit 47707f31fc

@ -67,10 +67,11 @@ Follow the following steps to update documentations to their latest version:
2. Check if the license is still correct. If you update `options[:attribution]`, also update the documentation's entry in the array in [`assets/javascripts/templates/pages/about_tmpl.coffee`](../assets/javascripts/templates/pages/about_tmpl.coffee) to match. 2. Check if the license is still correct. If you update `options[:attribution]`, also update the documentation's entry in the array in [`assets/javascripts/templates/pages/about_tmpl.coffee`](../assets/javascripts/templates/pages/about_tmpl.coffee) to match.
3. If the documentation has a custom icon, ensure the icons in <code>public/icons/*your_scraper_name*/</code> are up-to-date. If you pull the updated icon from a place different than the one specified in the `SOURCE` file, make sure to replace the old link with the new one. 3. If the documentation has a custom icon, ensure the icons in <code>public/icons/*your_scraper_name*/</code> are up-to-date. If you pull the updated icon from a place different than the one specified in the `SOURCE` file, make sure to replace the old link with the new one.
4. If `self.links` is defined, check if the urls are still correct. 4. If `self.links` is defined, check if the urls are still correct.
5. Generate the docs using `thor docs:generate <doc@version>`. 5. If the scraper inherits from `FileScraper` rather than `URLScraper`, follow the instructions for that scraper in [`file-scrapers.md`](../docs/file-scrapers.md) to obtain the source material for the scraper.
6. Make sure `thor docs:generate` doesn't show errors and that the documentation still works well. Verify locally that everything works and that the categorization of entries is still good. Often, updates will require code changes in the scraper or its filters to tweak some new markup in the source website or to categorize new entries. 6. Generate the docs using `thor docs:generate <doc@version>`.
7. Repeat steps 5 and 6 for all versions that you updated. 7. Make sure `thor docs:generate` doesn't show errors and that the documentation still works well. Verify locally that everything works and that the categorization of entries is still good. Often, updates will require code changes in the scraper or its filters to tweak some new markup in the source website or to categorize new entries.
8. Create a PR and make sure to fill the checklist in section B of the PR template (remove the other sections). 8. Repeat steps 5 and 6 for all versions that you updated.
9. Create a PR and make sure to fill the checklist in section B of the PR template (remove the other sections).
## Coding conventions ## Coding conventions

@ -11,15 +11,15 @@ jobs:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
if: github.repository == 'freeCodeCamp/devdocs' if: github.repository == 'freeCodeCamp/devdocs'
steps: steps:
- uses: actions/checkout@e2f20e631ae6d7dd3b768f56a5d2af784dd54791 # tag=v2.5.0 - uses: actions/checkout@dc323e67f16fb5f7663d20ff7941f27f5809e9b6 # v2.6.0
- name: Set up Ruby - name: Set up Ruby
uses: ruby/setup-ruby@84dd2abab6ed441bd503503b9adb1f52680f7349 # v1.122.0 uses: ruby/setup-ruby@f60ef1e8084a2e64569f928c3f1cfac6c7e12ad7 # v1.137.2
with: with:
bundler-cache: true # runs 'bundle install' and caches installed gems automatically bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Run tests - name: Run tests
run: bundle exec rake run: bundle exec rake
- name: Deploy to Heroku - name: Deploy to Heroku
uses: akhileshns/heroku-deploy@79ef2ae4ff9b897010907016b268fd0f88561820 # tag=v3.12.12 uses: akhileshns/heroku-deploy@5ef17ff17a3fb8e9ad822ae6a61648a3ef9e0c3d # v3.12.13
with: with:
heroku_api_key: ${{secrets.HEROKU_API_KEY}} heroku_api_key: ${{secrets.HEROKU_API_KEY}}
heroku_app_name: "devdocs" heroku_app_name: "devdocs"

@ -8,9 +8,9 @@ jobs:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
if: github.repository == 'freeCodeCamp/devdocs' if: github.repository == 'freeCodeCamp/devdocs'
steps: steps:
- uses: actions/checkout@e2f20e631ae6d7dd3b768f56a5d2af784dd54791 # tag=v2.5.0 - uses: actions/checkout@dc323e67f16fb5f7663d20ff7941f27f5809e9b6 # v2.6.0
- name: Set up Ruby - name: Set up Ruby
uses: ruby/setup-ruby@84dd2abab6ed441bd503503b9adb1f52680f7349 # v1.122.0 uses: ruby/setup-ruby@f60ef1e8084a2e64569f928c3f1cfac6c7e12ad7 # v1.137.2
with: with:
bundler-cache: true # runs 'bundle install' and caches installed gems automatically bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Generate report - name: Generate report

@ -9,9 +9,9 @@ jobs:
test: test:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@e2f20e631ae6d7dd3b768f56a5d2af784dd54791 # tag=v2.5.0 - uses: actions/checkout@dc323e67f16fb5f7663d20ff7941f27f5809e9b6 # v2.6.0
- name: Set up Ruby - name: Set up Ruby
uses: ruby/setup-ruby@84dd2abab6ed441bd503503b9adb1f52680f7349 # v1.122.0 uses: ruby/setup-ruby@f60ef1e8084a2e64569f928c3f1cfac6c7e12ad7 # v1.137.2
with: with:
bundler-cache: true # runs 'bundle install' and caches installed gems automatically bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Run tests - name: Run tests

@ -1,4 +1,4 @@
Copyright 2013-2022 Thibaut Courouble and other contributors Copyright 2013-2023 Thibaut Courouble and other contributors
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this

@ -55,7 +55,7 @@ GEM
net-ssh (>= 5.0.0, < 8.0.0) net-ssh (>= 5.0.0, < 8.0.0)
net-ssh (7.0.1) net-ssh (7.0.1)
newrelic_rpm (8.12.0) newrelic_rpm (8.12.0)
nokogiri (1.13.9) nokogiri (1.13.10)
mini_portile2 (~> 2.8.0) mini_portile2 (~> 2.8.0)
racc (~> 1.4) racc (~> 1.4)
options (2.3.2) options (2.3.2)
@ -69,8 +69,8 @@ GEM
pry-byebug (3.10.1) pry-byebug (3.10.1)
byebug (~> 11.0) byebug (~> 11.0)
pry (>= 0.13, < 0.15) pry (>= 0.13, < 0.15)
racc (1.6.0) racc (1.6.1)
rack (2.2.4) rack (2.2.6.2)
rack-protection (3.0.3) rack-protection (3.0.3)
rack rack
rack-ssl-enforcer (0.2.9) rack-ssl-enforcer (0.2.9)

@ -152,32 +152,32 @@ Contributions are welcome. Please read the [contributing guidelines](./.github/C
## Related Projects ## Related Projects
Made something cool? Feel free to open a PR to add a new row to this table! Made something cool? Feel free to open a PR to add a new row to this table! You might want to discover new projects via https://github.com/topics/devdocs.
| Project | Description | Last commit | <!-- table is sorted by description -->
|---------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [Sublime Text plugin](https://sublime.wbond.net/packages/DevDocs) | Sublime Text plugin to search DevDocs by selection or by input. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/vitorbritto/sublime-devdocs?logo=github&label)](https://github.com/vitorbritto/sublime-devdocs) | | Project | Description | Last commit | Stars |
| [Atom plugin](https://atom.io/packages/devdocs) | Atom plugin adding the `doc` command to search DevDocs. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/masnun/atom-devdocs?logo=github&label)](https://github.com/masnun/atom-devdocs) | | ------------------------------------------------------------------------------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| [gruehle/dev-docs-viewer](https://github.com/gruehle/dev-docs-viewer) | Brackets extension for searching and viewing DevDocs content. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/gruehle/dev-docs-viewer?logo=github&label)](https://github.com/gruehle/dev-docs-viewer) | | [yannickglt/alfred-devdocs](https://github.com/yannickglt/alfred-devdocs) | Alfred workflow | ![Latest GitHub commit](https://img.shields.io/github/last-commit/yannickglt/alfred-devdocs?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/yannickglt/alfred-devdocs?logo=github&label) |
| [naquad/devdocs-shell](https://github.com/naquad/devdocs-shell) | GTK shell with Vim integration. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/naquad/devdocs-shell?logo=github&label)](https://github.com/naquad/devdocs-shell) | | [Merith-TK/devdocs_webapp_kotlin](https://github.com/Merith-TK/devdocs_webapp_kotlin) | Android application | ![Latest GitHub commit](https://img.shields.io/github/last-commit/Merith-TK/devdocs_webapp_kotlin?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/Merith-TK/devdocs_webapp_kotlin?logo=github&label) |
| [skeeto/devdocs-lookup](https://github.com/skeeto/devdocs-lookup) | Quick Emacs API lookup on DevDocs. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/skeeto/devdocs-lookup?logo=github&label)](https://github.com/skeeto/devdocs-lookup) | | [gruehle/dev-docs-viewer](https://github.com/gruehle/dev-docs-viewer) | Brackets extension | ![Latest GitHub commit](https://img.shields.io/github/last-commit/gruehle/dev-docs-viewer?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/gruehle/dev-docs-viewer?logo=github&label) |
| [yannickglt/alfred-devdocs](https://github.com/yannickglt/alfred-devdocs) | Alfred workflow for DevDocs. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/yannickglt/alfred-devdocs?logo=github&label)](https://github.com/yannickglt/alfred-devdocs) | | [egoist/devdocs-desktop](https://github.com/egoist/devdocs-desktop) | Electron application | ![Latest GitHub commit](https://img.shields.io/github/last-commit/egoist/devdocs-desktop?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/egoist/devdocs-desktop?logo=github&label) |
| [waiting-for-dev/vim-www](https://github.com/waiting-for-dev/vim-www) | Vim search plugin with DevDocs in its defaults. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/waiting-for-dev/vim-www?logo=github&label)](https://github.com/waiting-for-dev/vim-www) | | [skeeto/devdocs-lookup](https://github.com/skeeto/devdocs-lookup) | Emacs function | ![Latest GitHub commit](https://img.shields.io/github/last-commit/skeeto/devdocs-lookup?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/skeeto/devdocs-lookup?logo=github&label) |
| [vscode-devdocs for VS Code](https://marketplace.visualstudio.com/items?itemName=akfish.vscode-devdocs) | VS Code plugin to open and search DevDocs inside VS Code. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/akfish/vscode-devdocs?logo=github&label)](https://github.com/akfish/vscode-devdocs) | | [astoff/devdocs.el](https://github.com/astoff/devdocs.el) | Emacs viewer | ![Latest GitHub commit](https://img.shields.io/github/last-commit/astoff/devdocs.el?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/astoff/devdocs.el?logo=github&label) |
| [devdocs for VS Code](https://marketplace.visualstudio.com/items?itemName=deibit.devdocs) | VS Code plugin to open the browser to search selected text on DevDocs. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/deibit/vscode-devdocs?logo=github&label)](https://github.com/deibit/vscode-devdocs) | | [naquad/devdocs-shell](https://github.com/naquad/devdocs-shell) | GTK shell with Vim integration | ![Latest GitHub commit](https://img.shields.io/github/last-commit/naquad/devdocs-shell?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/naquad/devdocs-shell?logo=github&label) |
| [egoist/devdocs-desktop](https://github.com/egoist/devdocs-desktop) | Cross-platform desktop application for DevDocs. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/egoist/devdocs-desktop?logo=github&label)](https://github.com/egoist/devdocs-desktop) | | [hardpixel/devdocs-desktop](https://github.com/hardpixel/devdocs-desktop) | GTK application | ![Latest GitHub commit](https://img.shields.io/github/last-commit/hardpixel/devdocs-desktop?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/hardpixel/devdocs-desktop?logo=github&label) |
| [qwfy/doc-browser](https://github.com/qwfy/doc-browser) | Native Linux app that supports DevDocs docsets. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/qwfy/doc-browser?logo=github&label)](https://github.com/qwfy/doc-browser) | | [qwfy/doc-browser](https://github.com/qwfy/doc-browser) | Linux application | ![Latest GitHub commit](https://img.shields.io/github/last-commit/qwfy/doc-browser?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/qwfy/doc-browser?logo=github&label) |
| [hardpixel/devdocs-desktop](https://github.com/hardpixel/devdocs-desktop) | GTK3 application for DevDocs with search integrated in the headerbar. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/hardpixel/devdocs-desktop?logo=github&label)](https://github.com/hardpixel/devdocs-desktop) | | [dteoh/devdocs-macos](https://github.com/dteoh/devdocs-macos) | macOS application | ![Latest GitHub commit](https://img.shields.io/github/last-commit/dteoh/devdocs-macos?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/dteoh/devdocs-macos?logo=github&label) |
| [dteoh/devdocs-macos](https://github.com/dteoh/devdocs-macos) | Native macOS application for DevDocs. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/dteoh/devdocs-macos?logo=github&label)](https://github.com/dteoh/devdocs-macos) | | [Sublime Text plugin](https://sublime.wbond.net/packages/DevDocs) | Sublime Text plugin | ![Latest GitHub commit](https://img.shields.io/github/last-commit/vitorbritto/sublime-devdocs?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/vitorbritto/sublime-devdocs?logo=github&label) |
| [Merith-TK/devdocs_webapp_kotlin](https://github.com/Merith-TK/devdocs_webapp_kotlin) | Android application which shows DevDocs in a webview. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/Merith-TK/devdocs_webapp_kotlin?logo=github&label)](https://github.com/Merith-TK/devdocs_webapp_kotlin) | | [mohamed3nan/DevDocs-Tab](https://github.com/mohamed3nan/DevDocs-Tab) | VS Code extension (view as tab) | ![Latest GitHub commit](https://img.shields.io/github/last-commit/mohamed3nan/DevDocs-Tab?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/mohamed3nan/DevDocs-Tab?logo=github&label) |
| [astoff/devdocs.el](https://github.com/astoff/devdocs.el) | Emacs viewer for DevDocs | [![Latest GitHub commit](https://img.shields.io/github/last-commit/astoff/devdocs.el?logo=github&label)](https://github.com/astoff/devdocs.el) | | [deibit/vscode-devdocs](https://marketplace.visualstudio.com/items?itemName=deibit.devdocs) | VS Code extension (open the browser) | ![Latest GitHub commit](https://img.shields.io/github/last-commit/deibit/vscode-devdocs?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/deibit/vscode-devdocs?logo=github&label) |
| [DevDocs Tab for VS Code](https://github.com/mohamed3nan/DevDocs-Tab) | VS Code extension to search displaying DevDocs.io in a tab. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/mohamed3nan/DevDocs-Tab?logo=github&label)](https://github.com/mohamed3nan/DevDocs-Tab) | | [mdh34/quickDocs](https://github.com/mdh34/quickDocs) | Vala/Python based viewer | ![Latest GitHub commit](https://img.shields.io/github/last-commit/mdh34/quickDocs?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/mdh34/quickDocs?logo=github&label) |
| [quickDocs](https://github.com/mdh34/quickDocs) | DevDocs viewer written in Vala/Python. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/mdh34/quickDocs?logo=github&label)](https://github.com/mdh34/quickDocs) | | [romainl/vim-devdocs](https://github.com/romainl/vim-devdocs) | Vim plugin | ![Latest GitHub commit](https://img.shields.io/github/last-commit/romainl/vim-devdocs?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/romainl/vim-devdocs?logo=github&label) |
| [romainl/vim-devdocs](https://github.com/romainl/vim-devdocs) | Look up keyword on DevDocs from Vim. | [![Latest GitHub commit](https://img.shields.io/github/last-commit/romainl/vim-devdocs?logo=github&label)](https://github.com/romainl/vim-devdocs) | | [waiting-for-dev/vim-www](https://github.com/waiting-for-dev/vim-www) | Vim plugin | ![Latest GitHub commit](https://img.shields.io/github/last-commit/waiting-for-dev/vim-www?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/waiting-for-dev/vim-www?logo=github&label) |
## Copyright / License ## Copyright / License
Copyright 20132021 Thibaut Courouble and [other contributors](https://github.com/freeCodeCamp/devdocs/graphs/contributors) Copyright 20132023 Thibaut Courouble and [other contributors](https://github.com/freeCodeCamp/devdocs/graphs/contributors)
This software is licensed under the terms of the Mozilla Public License v2.0. See the [COPYRIGHT](./COPYRIGHT) and [LICENSE](./LICENSE) files. This software is licensed under the terms of the Mozilla Public License v2.0. See the [COPYRIGHT](./COPYRIGHT) and [LICENSE](./LICENSE) files.

@ -1,5 +1,5 @@
### ###
* Copyright 2013-2021 Thibaut Courouble and other contributors * Copyright 2013-2023 Thibaut Courouble and other contributors
* *
* This source code is licensed under the terms of the Mozilla * This source code is licensed under the terms of the Mozilla
* Public License, v. 2.0, a copy of which may be obtained at: * Public License, v. 2.0, a copy of which may be obtained at:

@ -61,6 +61,7 @@ class app.models.Entry extends app.Model
'julia': 'jl' 'julia': 'jl'
'jquery': '$' 'jquery': '$'
'knockout.js': 'ko' 'knockout.js': 'ko'
'kubernetes': 'k8s'
'less': 'ls' 'less': 'ls'
'lodash': '_' 'lodash': '_'
'löve': 'love' 'löve': 'love'

@ -1,4 +1,8 @@
[ [
[
"2022-12-20",
"New documentations: <a href=\"/qunit/\">QUnit</a>, <a href=\"/wagtail/\">Wagtail</a>"
],
[ [
"2022-11-04", "2022-11-04",
"New documentation: <a href=\"/vueuse/\">VueUse</a>" "New documentation: <a href=\"/vueuse/\">VueUse</a>"

@ -1,4 +1,9 @@
app.templates.aboutPage = -> """ app.templates.aboutPage = ->
all_docs = app.docs.all().concat(app.disabledDocs.all()...)
# de-duplicate docs by doc.name
docs = []
docs.push doc for doc in all_docs when not (docs.find (d) -> d.name == doc.name)
"""
<nav class="_toc" role="directory"> <nav class="_toc" role="directory">
<h3 class="_toc-title">Table of Contents</h3> <h3 class="_toc-title">Table of Contents</h3>
<ul class="_toc-list"> <ul class="_toc-list">
@ -22,7 +27,7 @@ app.templates.aboutPage = -> """
<h2 class="_block-heading" id="copyright">Copyright and License</h2> <h2 class="_block-heading" id="copyright">Copyright and License</h2>
<p class="_note"> <p class="_note">
<strong>Copyright 2013&ndash;2021 Thibaut Courouble and <a href="https://github.com/freeCodeCamp/devdocs/graphs/contributors">other contributors</a></strong><br> <strong>Copyright 2013&ndash;2023 Thibaut Courouble and <a href="https://github.com/freeCodeCamp/devdocs/graphs/contributors">other contributors</a></strong><br>
This software is licensed under the terms of the Mozilla Public License v2.0.<br> This software is licensed under the terms of the Mozilla Public License v2.0.<br>
You may obtain a copy of the source code at <a href="https://github.com/freeCodeCamp/devdocs">github.com/freeCodeCamp/devdocs</a>.<br> You may obtain a copy of the source code at <a href="https://github.com/freeCodeCamp/devdocs">github.com/freeCodeCamp/devdocs</a>.<br>
For more information, see the <a href="https://github.com/freeCodeCamp/devdocs/blob/main/COPYRIGHT">COPYRIGHT</a> For more information, see the <a href="https://github.com/freeCodeCamp/devdocs/blob/main/COPYRIGHT">COPYRIGHT</a>
@ -61,9 +66,15 @@ app.templates.aboutPage = -> """
<table class="_credits"> <table class="_credits">
<tr> <tr>
<th>Documentation <th>Documentation
<th>Copyright <th>Copyright/License
<th>License <th>Source code
#{("<tr><td>#{c[0]}<td>&copy; #{c[1]}<td><a href=\"#{c[3]}\">#{c[2]}</a>" for c in credits).join('')} #{(
"<tr>
<td><a href=\"#{doc.links?.home}\">#{doc.name}</a></td>
<td>#{doc.attribution}</td>
<td><a href=\"#{doc.links?.code}\">Source code</a></td>
</tr>" for doc in docs
).join('')}
</table> </table>
</div> </div>
@ -78,927 +89,3 @@ app.templates.aboutPage = -> """
<li>If you have any questions regarding privacy, please email <a href="mailto:privacy@freecodecamp.org">privacy@freecodecamp.org</a>. <li>If you have any questions regarding privacy, please email <a href="mailto:privacy@freecodecamp.org">privacy@freecodecamp.org</a>.
</ul> </ul>
""" """
credits = [
[
'Angular',
'2010-2022 Google, Inc.',
'CC BY',
'https://creativecommons.org/licenses/by/4.0/'
], [
'Angular.js',
'2010-2020 Google, Inc.',
'CC BY 3.0',
'https://creativecommons.org/licenses/by/3.0/'
], [
'Ansible',
'2012-2018 Michael DeHaan<br>&copy; 20182021 Red Hat, Inc.',
'GPLv3',
'https://raw.githubusercontent.com/ansible/ansible/devel/COPYING'
], [
'Apache HTTP Server<br>Apache Pig',
'2018 The Apache Software Foundation<br>Apache and the Apache feather logo are trademarks of The Apache Software Foundation.',
'Apache',
'https://www.apache.org/licenses/LICENSE-2.0'
], [
'Astro',
'2022 withastro',
'MIT',
'https://github.com/withastro/docs/blob/main/LICENSE'
], [
'Async',
'2010-2018 Caolan McMahon',
'MIT',
'https://raw.githubusercontent.com/caolan/async/master/LICENSE'
], [
'Axios',
'2014-present Matt Zabriskie',
'MIT',
'https://raw.githubusercontent.com/axios/axios/main/LICENSE'
], [
'Babel',
'2014-present Sebastian McKenzie',
'MIT',
'https://raw.githubusercontent.com/babel/babel/master/LICENSE'
], [
'Backbone.js',
'2010-2019 Jeremy Ashkenas, DocumentCloud',
'MIT',
'https://raw.githubusercontent.com/jashkenas/backbone/master/LICENSE'
], [
'Bash',
'2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.',
'GFDL',
'https://www.gnu.org/licenses/fdl-1.3.en.html'
], [
'Bluebird',
'2013-2018 Petka Antonov',
'MIT',
'https://raw.githubusercontent.com/petkaantonov/bluebird/master/LICENSE'
], [
'Bootstrap',
'2011-2022 Twitter, Inc.<br>2011-2022 The Bootstrap Authors',
'CC BY',
'https://creativecommons.org/licenses/by/3.0/'
], [
'Bottle',
'2009-2017 Marcel Hellkamp',
'MIT',
'https://raw.githubusercontent.com/bottlepy/bottle/master/LICENSE'
], [
'Bower',
'2018 Bower contributors',
'MIT',
'https://github.com/bower/bower.github.io/blob/1057905c18d899106f91372e6cca7ef54a91d60f/package.json#L20'
], [
'C<br>C++',
'cppreference.com',
'CC BY-SA',
'http://en.cppreference.com/w/Cppreference:Copyright/CC-BY-SA'
], [
'CakePHP',
'2005-present The Cake Software Foundation, Inc.',
'MIT',
'https://raw.githubusercontent.com/cakephp/cakephp/master/LICENSE'
], [
'Chai',
'2017 Chai.js Assertion Library',
'MIT',
'https://raw.githubusercontent.com/chaijs/chai/master/LICENSE'
], [
'Chef&trade;',
'Chef Software, Inc.',
'CC BY',
'https://raw.githubusercontent.com/chef/chef-web-docs-2016/master/LICENSE'
], [
'Clojure',
'Rich Hickey',
'EPL',
'https://github.com/clojure/clojure/blob/master/epl-v10.html'
], [
'CMake',
'2000-2022 Kitware, Inc. and Contributors',
'BSD',
'https://cmake.org/licensing/'
], [
'Codeception',
'2011 Michael Bodnarchuk and contributors',
'MIT',
'https://raw.githubusercontent.com/Codeception/Codeception/master/LICENSE'
], [
'CodeceptJS',
'2015 DavertMik',
'MIT',
'https://raw.githubusercontent.com/Codeception/CodeceptJS/master/LICENSE'
], [
'CodeIgniter',
'2014-2021 British Columbia Institute of Technology',
'MIT',
'https://raw.githubusercontent.com/bcit-ci/CodeIgniter/develop/license.txt'
], [
'CoffeeScript',
'2009-2022 Jeremy Ashkenas',
'MIT',
'https://raw.githubusercontent.com/jashkenas/coffeescript/master/LICENSE'
], [
'Composer',
'Nils Adermann, Jordi Boggiano',
'MIT',
'https://raw.githubusercontent.com/composer/composer/master/LICENSE'
], [
'Cordova',
'2012, 2013, 2015 The Apache Software Foundation',
'Apache',
'https://raw.githubusercontent.com/apache/cordova-docs/master/LICENSE'
], [
'Crystal',
'2012-2022 Manas Technology Solutions',
'Apache',
'https://raw.githubusercontent.com/crystal-lang/crystal/master/LICENSE'
], [
'CSS<br>DOM<br>HTTP<br>HTML<br>JavaScript<br>SVG<br>XPath',
'2005-2022 MDN contributors',
'CC BY-SA',
'https://creativecommons.org/licenses/by-sa/2.5/'
], [
'Cypress',
'2017 Cypress.io',
'MIT',
'https://raw.githubusercontent.com/cypress-io/cypress-documentation/develop/LICENSE.md'
], [
'D',
'1999-2021 The D Language Foundation',
'Boost',
'https://raw.githubusercontent.com/dlang/phobos/master/LICENSE_1_0.txt'
], [
'D3.js',
'2010-2022 Michael Bostock',
'BSD',
'https://raw.githubusercontent.com/d3/d3/master/LICENSE'
], [
'Dart',
'2012 the Dart project authors',
'CC BY-SA',
'https://creativecommons.org/licenses/by-sa/4.0/'
], [
'date-fns',
'2021 Sasha Koss and Lesha Koss',
'MIT',
'https://raw.githubusercontent.com/date-fns/date-fns/main/LICENSE.md'
], [
'Deno',
'20182022 the Deno authors',
'MIT',
'https://raw.githubusercontent.com/denoland/manual/main/LICENSE'
], [
'Django',
'Django Software Foundation and individual contributors',
'BSD',
'https://raw.githubusercontent.com/django/django/master/LICENSE'
], [
'Django REST Framework',
'2011-present Encode OSS Ltd.',
'BSD',
'https://raw.githubusercontent.com/encode/django-rest-framework/master/LICENSE.md'
], [
'Docker',
'2019 Docker, Inc.<br>Docker and the Docker logo are trademarks of Docker, Inc.',
'Apache',
'https://raw.githubusercontent.com/docker/docker.github.io/master/LICENSE'
], [
'Dojo',
'2005-2017 JS Foundation',
'BSD + AFL',
'http://dojotoolkit.org/license.html'
], [
'Drupal',
'2001-2015 by the original authors<br>Drupal is a registered trademark of Dries Buytaert.',
'GPLv2',
'https://api.drupal.org/api/drupal/LICENSE.txt'
],[
'Eigen3',
'Eigen',
'MPL2',
'https://www.mozilla.org/en-US/MPL/2.0/'
], [
'Electron',
'GitHub Inc.',
'MIT',
'https://raw.githubusercontent.com/electron/electron/master/LICENSE'
], [
'Elisp',
'1990-1996, 1998-2022 Free Software Foundation, Inc.',
'GPLv3',
'https://www.gnu.org/licenses/gpl-3.0.html'
], [
'Elixir',
'2012 Plataformatec',
'Apache',
'https://raw.githubusercontent.com/elixir-lang/elixir/master/LICENSE'
], [
'Ember.js',
'2020 Yehuda Katz, Tom Dale and Ember.js contributors',
'MIT',
'https://raw.githubusercontent.com/emberjs/ember.js/master/LICENSE'
], [
'Enzyme',
'2015 Airbnb, Inc.',
'MIT',
'https://raw.githubusercontent.com/airbnb/enzyme/master/LICENSE.md'
], [
'Erlang',
'2010-2022 Ericsson AB',
'Apache',
'https://raw.githubusercontent.com/erlang/otp/maint/LICENSE.txt'
], [
'esbulid',
'2020 Evan Wallace',
'MIT',
'https://raw.githubusercontent.com/evanw/esbuild/blob/master/LICENSE.md'
], [
'ESLint',
'OpenJS Foundation and other contributors',
'MIT',
'https://raw.githubusercontent.com/eslint/eslint/master/LICENSE'
], [
'Express',
'2017 StrongLoop, IBM, and other expressjs.com contributors.',
'CC BY-SA',
'https://raw.githubusercontent.com/expressjs/expressjs.com/gh-pages/LICENSE.md'
], [
'Falcon',
'2019 by Falcon contributors',
'Apache',
'https://raw.githubusercontent.com/falconry/falcon/master/LICENSE'
], [
'FastAPI',
'2018 Sebastián Ramírez',
'MIT',
'https://github.com/tiangolo/fastapi/blob/master/LICENSE'
], [
'Fish',
'20052009 Axel Liljencrantz, 20092022 fish-shell contributors',
'GPLv2',
'https://fishshell.com/docs/current/license.html'
], [
'Flask',
'2007-2022 Pallets',
'BSD',
'https://github.com/pallets/flask/blob/master/LICENSE.rst'
], [
'GCC<br>GNU Fortran<br>GNU Make',
'Free Software Foundation',
'GFDL',
'https://www.gnu.org/licenses/fdl-1.3.en.html'
], [
'Git',
'2012-2022 Scott Chacon and others',
'MIT',
'https://raw.githubusercontent.com/git/git-scm.com/master/MIT-LICENSE.txt'
], [
'GnuCOBOL',
'Free Software Foundation',
'GFDL',
'https://www.gnu.org/licenses/fdl-1.3.en.html'
], [
'Gnuplot',
'Copyright 1986 - 1993, 1998, 2004 Thomas Williams, Colin Kelley',
'gnuplot license',
'https://sourceforge.net/p/gnuplot/gnuplot-main/ci/master/tree/Copyright'
], [
'Go',
'Google, Inc.',
'CC BY',
'https://creativecommons.org/licenses/by/3.0/'
], [
'Godot',
'2014-2022 Juan Linietsky, Ariel Manzur, Godot Engine contributors',
'MIT',
'https://raw.githubusercontent.com/godotengine/godot/master/LICENSE.txt'
], [
'Graphite',
'2008-2012 Chris Davis<br>&copy; 2011-2016 The Graphite Project',
'Apache',
'https://raw.githubusercontent.com/graphite-project/graphite-web/master/LICENSE'
], [
'Groovy',
'2003-2022 The Apache Software Foundation',
'Apache',
'https://github.com/apache/groovy-website/blob/asf-site/LICENSE'
], [
'Grunt',
'GruntJS Team',
'MIT',
'https://github.com/gruntjs/grunt-docs/blob/master/package.json#L10'
], [
'GTK',
'The GNOME Project',
'LGPLv2.1+',
'https://gitlab.gnome.org/GNOME/gtk/-/blob/master/COPYING'
], [
'Handlebars',
'2011-2017 Yehuda Katz',
'MIT',
'https://raw.githubusercontent.com/wycats/handlebars.js/master/LICENSE'
], [
'HAProxy',
'2022 Willy Tarreau, HAProxy contributors',
'GPLv2',
'https://raw.githubusercontent.com/haproxy/haproxy/master/LICENSE'
], [
'Haskell',
'The University of Glasgow',
'BSD',
'https://www.haskell.org/ghc/license'
], [
'Haxe',
'2005-2018 Haxe Foundation',
'MIT',
'https://haxe.org/foundation/open-source.html'
], [
'Homebrew',
'2009-present Homebrew contributors',
'BSD',
'https://raw.githubusercontent.com/Homebrew/brew/master/LICENSE.txt'
], [
'i3',
'2009, Michael Stapelberg and contributors',
'BSD',
'https://raw.githubusercontent.com/i3/i3/next/LICENSE'
], [
'Immutable.js',
'2014present Lee Byron and other contributors',
'BSD',
'https://github.com/immutable-js/immutable-js/blob/main/LICENSE'
], [
'InfluxData',
'2015 InfluxData, Inc.',
'MIT',
'https://github.com/influxdata/docs.influxdata.com/blob/master/LICENSE'
], [
'Jasmine',
'2008-2019 Pivotal Labs',
'MIT',
'https://raw.githubusercontent.com/jasmine/jasmine/main/MIT.LICENSE'
], [
'Jekyll',
'2020 Jekyll Core Team and contributors',
'MIT',
'https://raw.githubusercontent.com/jekyll/jekyll/master/LICENSE'
], [
'Jest',
'2022 Facebook, Inc.',
'MIT',
'https://raw.githubusercontent.com/facebook/jest/master/LICENSE'
], [
'Jinja',
'2007-2021 Pallets',
'BSD',
'https://github.com/pallets/jinja/blob/master/LICENSE.rst'
], [
'jq',
'Stephen Dolan',
'CC-BY-3.0',
'https://github.com/stedolan/jq/blob/master/COPYING#L24-L28'
], [
'jQuery',
'Packt Publishing<br>&copy; jQuery Foundation and other contributors',
'MIT',
'https://raw.githubusercontent.com/jquery/api.jquery.com/master/LICENSE.txt'
], [
'jQuery Mobile',
'jQuery Foundation and other contributors',
'MIT',
'https://raw.githubusercontent.com/jquery/api.jquerymobile.com/master/LICENSE.txt'
], [
'jQuery UI',
'jQuery Foundation and other contributors',
'MIT',
'https://raw.githubusercontent.com/jquery/api.jqueryui.com/master/LICENSE.txt'
], [
'JSDoc',
'2011-2017 the contributors to the JSDoc 3 documentation project',
'CC BY-SA',
'https://raw.githubusercontent.com/jsdoc3/jsdoc3.github.com/master/LICENSE'
], [
'Julia',
'2009-2022 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors',
'MIT',
'https://raw.githubusercontent.com/JuliaLang/julia/master/LICENSE.md'
], [
'Knockout.js',
'Steven Sanderson, the Knockout.js team, and other contributors',
'MIT',
'https://raw.githubusercontent.com/knockout/knockout/master/LICENSE'
], [
'Koa',
'2020 Koa contributors',
'MIT',
'https://raw.githubusercontent.com/koajs/koa/master/LICENSE'
], [
'Kotlin',
'2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors',
'Apache',
'https://raw.githubusercontent.com/JetBrains/kotlin/master/license/LICENSE.txt'
], [
'Kubernetes',
'2022 The Kubernetes Authors and The Linux Foundation',
'Apache License 2.0',
'https://github.com/kubernetes/kubernetes/blob/master/LICENSE'
], [
'Laravel',
'Taylor Otwell',
'MIT',
'https://raw.githubusercontent.com/laravel/framework/master/LICENSE.txt'
], [
'LaTeX',
'Karl Berry',
'Public Domain',
'https://ctan.org/pkg/latex2e-help-texinfo/'
], [
'Leaflet',
'2010-2022 Vladimir Agafonkin<br>&copy; 2010-2011, CloudMade<br>Maps &copy; OpenStreetMap contributors.',
'BSD',
'https://raw.githubusercontent.com/Leaflet/Leaflet/master/LICENSE'
], [
'Less',
'2009-2020 The Core Less Team',
'CC BY',
'https://creativecommons.org/licenses/by/3.0/'
], [
'Liquid',
'2005, 2006 Tobias Luetke',
'MIT',
'https://raw.githubusercontent.com/Shopify/liquid/master/LICENSE'
], [
'Lo-Dash',
'JS Foundation and other contributors',
'MIT',
'https://raw.githubusercontent.com/lodash/lodash/master/LICENSE'
], [
'Lua',
'19942020 Lua.org, PUC-Rio',
'MIT',
'http://www.lua.org/license.html'
], [
'LÖVE',
'2006-2020 LÖVE Development Team',
'GFDL',
'http://www.gnu.org/copyleft/fdl.html'
], [
'MariaDB',
'2022 MariaDB',
'CC BY-SA & GFDL',
'https://mariadb.com/kb/en/library/documentation/+license/'
], [
'Marionette.js',
'2017 Muted Solutions, LLC',
'MIT',
'https://mutedsolutions.mit-license.org/'
], [
'Markdown',
'2004 John Gruber',
'BSD',
'https://daringfireball.net/projects/markdown/license'
], [
'Matplotlib',
'2012-2022 Matplotlib Development Team. All rights reserved.',
'Custom',
'https://raw.githubusercontent.com/matplotlib/matplotlib/master/LICENSE/LICENSE'
], [
'Meteor',
'2011-2017 Meteor Development Group, Inc.',
'MIT',
'https://raw.githubusercontent.com/meteor/meteor/master/LICENSE'
], [
'Minitest',
'Ryan Davis, seattle.rb',
'MIT',
'https://github.com/seattlerb/minitest/blob/master/README.rdoc#license'
], [
'Mocha',
'2011-2021 JS Foundation and contributors',
'CC BY',
'https://creativecommons.org/licenses/by/4.0/'
], [
'Modernizr',
'2009-2020 The Modernizr team',
'MIT',
'https://modernizr.com/license/'
], [
'Moment.js<br>Moment.js Timezone',
'JS Foundation and other contributors',
'MIT',
'https://raw.githubusercontent.com/moment/moment/master/LICENSE'
], [
'Mongoose',
'2010 LearnBoost',
'MIT',
'https://github.com/LearnBoost/mongoose/blob/master/README.md#license'
], [
'nginx',
'2002-2021 Igor Sysoev<br>&copy; 2011-2022 Nginx, Inc.',
'BSD',
'http://nginx.org/LICENSE'
], [
'nginx / Lua Module',
'2009-2017 Xiaozhe Wang (chaoslawful)<br>&copy; 2009-2018 Yichun "agentzh" Zhang (章亦春), OpenResty Inc.',
'BSD',
'https://github.com/openresty/lua-nginx-module#copyright-and-license'
], [
'Nim',
'2006-2021 Andreas Rumpf',
'MIT',
'https://github.com/nim-lang/Nim#license'
], [
'Nix',
'2022 NixOS Contributors',
'LGPLv2.1',
'https://github.com/NixOS/nix#license'
], [
'Node.js',
'Joyent, Inc. and other Node contributors<br>Node.js is a trademark of Joyent, Inc.',
'MIT',
'https://raw.githubusercontent.com/nodejs/node/master/LICENSE'
], [
'Nokogiri',
'20082021 Aaron Patterson, Mike Dalessio, Charles Nutter, Sergio Arbeo, Patrick Mahoney, Yoko Harada, Akinori MUSHA, John Shahid, Lars Kanis',
'MIT',
'https://raw.githubusercontent.com/sparklemotion/nokogiri/master/LICENSE.md'
], [
'npm',
'npm, Inc. and Contributors<br>npm is a trademark of npm, Inc.',
'npm',
'https://raw.githubusercontent.com/npm/npm/master/LICENSE'
], [
'NumPy',
'2005-2022 NumPy Developers',
'BSD',
'https://raw.githubusercontent.com/numpy/numpy/master/LICENSE.txt'
], [
'OCaml',
'1995-2022 INRIA',
'CC BY-SA',
'https://ocaml.org/docs/'
], [
'Octave',
'19962022 The Octave Project Developers',
'Octave',
'https://docs.octave.org/v7.2.0/'
], [
'OpenJDK',
'1993, 2022, Oracle and/or its affiliates. All rights reserved.<br>Licensed under the GNU General Public License, version 2, with the Classpath Exception.<br>Various third party code in OpenJDK is licensed under different licenses.<br>Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.',
'GPLv2',
'http://openjdk.java.net/legal/gplv2+ce.html'
], [
'OpenTSDB',
'2010-2016 The OpenTSDB Authors',
'LGPLv2.1',
'https://raw.githubusercontent.com/OpenTSDB/opentsdb.net/gh-pages/COPYING.LESSER'
], [
'Padrino',
'2010-2020 Padrino',
'MIT',
'https://raw.githubusercontent.com/padrino/padrino-framework/master/padrino/LICENSE.txt'
], [
'pandas',
'2008-2022, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team',
'BSD',
'https://raw.githubusercontent.com/pydata/pandas/master/LICENSE'
], [
'Perl',
'1993-2021 Larry Wall and others',
'GPLv1',
'https://perldoc.perl.org/index-licence.html'
], [
'Phalcon',
'2011-2017 Phalcon Framework Team',
'CC BY',
'https://docs.phalconphp.com/en/latest/reference/license.html'
], [
'Phaser',
'2016 Richard Davey, Photon Storm Ltd.',
'MIT',
'https://raw.githubusercontent.com/photonstorm/phaser/master/license.txt'
], [
'Phoenix',
'2014 Chris McCord',
'MIT',
'https://raw.githubusercontent.com/phoenixframework/phoenix/master/LICENSE.md'
], [
'PHP',
'1997-2021 The PHP Documentation Group',
'CC BY',
'https://secure.php.net/manual/en/copyright.php'
], [
'PHPUnit',
'2005-2017 Sebastian Bergmann',
'CC BY',
'https://creativecommons.org/licenses/by/3.0/'
], [
'PointCloudLibrary',
'20092012, Willow Garage, Inc.<br>&copy; 2012, Open Perception, Inc.',
'BSD',
'https://raw.githubusercontent.com/PointCloudLibrary/pcl/master/LICENSE.txt'
], [
'Pony',
'2016-2020, The Pony Developers & 2014-2015, Causality Ltd.',
'BSD',
'https://raw.githubusercontent.com/ponylang/ponyc/master/LICENSE'
], [
'PostgreSQL',
'1996-2022 The PostgreSQL Global Development Group<br>&copy; 1994 The Regents of the University of California',
'PostgreSQL',
'https://www.postgresql.org/about/licence/'
], [
'Prettier',
'James Long and contributors',
'MIT',
'https://raw.githubusercontent.com/prettier/prettier/main/LICENSE '
], [
'Puppeteer',
'2021 Google Inc',
'Apache',
'https://raw.githubusercontent.com/puppeteer/puppeteer/master/LICENSE'
], [
'Pygame',
'Pygame Developers',
'LGPLv2.1',
'https://raw.githubusercontent.com/pygame/pygame/master/LICENSE'
], [
'Python',
'2001-2022 Python Software Foundation<br>Python is a trademark of the Python Software Foundation.',
'PSFL',
'https://docs.python.org/3/license.html'
], [
'PyTorch',
'2019 Torch Contributors',
'BSD',
'https://raw.githubusercontent.com/pytorch/pytorch/master/LICENSE'
], [
'Q',
'2009-2017 Kristopher Michael Kowal',
'MIT',
'https://raw.githubusercontent.com/kriskowal/q/master/LICENSE'
], [
'Qt',
'2012-2018 The Qt Company Ltd',
'GFDL',
'https://doc.qt.io/qt-5/licensing.html'
], [
'R',
'19992012 R Foundation for Statistical Computing',
'GPL',
'https://svn.r-project.org/R/trunk/COPYING'
], [
'Ramda',
'2013-2020 Scott Sauyet and Michael Hurley',
'MIT',
'https://raw.githubusercontent.com/ramda/ramda/master/LICENSE.txt'
], [
'React, React Native, Flow, Relay',
'Facebook Inc. and its affiliates',
'MIT',
'https://raw.githubusercontent.com/facebook/react/master/LICENSE'
], [
'React Bootstrap',
'2014-present Stephen J. Collings, Matthew Honnibal, Pieter Vanderwerff',
'MIT',
'https://raw.githubusercontent.com/react-bootstrap/react-bootstrap/master/LICENSE'
], [
'React Router',
'React Training 2015-2019<br>Remix Software 2020-2022',
'MIT',
'https://raw.githubusercontent.com/remix-run/react-router/main/LICENSE.md'
], [
'ReactiveX',
'ReactiveX contributors',
'Apache',
'https://raw.githubusercontent.com/ReactiveX/reactivex.github.io/develop/LICENSE'
], [
'Redis',
'2009-2020 Salvatore Sanfilippo',
'CC BY-SA',
'https://creativecommons.org/licenses/by-sa/4.0/'
], [
'Redux',
'2015-2022 Dan Abramov',
'MIT',
'https://raw.githubusercontent.com/reactjs/redux/master/LICENSE.md'
], [
'Requests',
'2011-2022 Kenneth Reitz and other contributors',
'Apache',
'https://raw.githubusercontent.com/psf/requests/main/LICENSE'
], [
'RequireJS',
'jQuery Foundation and other contributors',
'MIT',
'https://raw.githubusercontent.com/requirejs/requirejs/master/LICENSE'
], [
'RethinkDB',
'RethinkDB contributors',
'CC BY-SA',
'https://raw.githubusercontent.com/rethinkdb/docs/master/LICENSE'
], [
'Ruby',
'1993-2022 Yukihiro Matsumoto',
'Ruby',
'https://www.ruby-lang.org/en/about/license.txt'
], [
'Ruby on Rails',
'2004-2021 David Heinemeier Hansson<br>Rails, Ruby on Rails, and the Rails logo are trademarks of David Heinemeier Hansson.',
'MIT',
'https://raw.githubusercontent.com/rails/rails/master/activerecord/MIT-LICENSE'
], [
'Rust',
'2010 The Rust Project Developers',
'MIT',
'https://raw.githubusercontent.com/rust-lang/book/master/LICENSE-MIT'
], [
'RxJS',
'2015-2022 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors',
'Apache',
'https://raw.githubusercontent.com/ReactiveX/rxjs/master/LICENSE.txt'
], [
'Salt Stack',
'2021 SaltStack',
'Apache',
'https://raw.githubusercontent.com/saltstack/salt/develop/LICENSE'
], [
'Sanctuary',
'2020 Sanctuary; 2016 Plaid Technologies, Inc.',
'MIT',
'https://raw.githubusercontent.com/sanctuary-js/sanctuary/master/LICENSE'
], [
'Sass',
'2022 Google Inc.',
'MIT',
'https://raw.githubusercontent.com/sass/sass/main/LICENSE'
], [
'Scala',
'2002-2022 EPFL, with contributions from Lightbend',
'Apache',
'https://www.scala-lang.org/license/'
], [
'scikit-image',
'2019 the scikit-image team',
'BSD',
'https://scikit-image.org/docs/dev/license.html'
], [
'scikit-learn',
'2007-2022 The scikit-learn developers',
'BSD',
'https://raw.githubusercontent.com/scikit-learn/scikit-learn/master/COPYING'
], [
'Sequelize',
'2014—present Sequelize contributors',
'MIT',
'https://raw.githubusercontent.com/sequelize/sequelize/master/LICENSE'
], [
'Sinon',
'2010-2021 Christian Johansen',
'BSD',
'https://raw.githubusercontent.com/sinonjs/sinon/master/LICENSE'
], [
'Socket.io',
'2014-2018 Automattic',
'MIT',
'https://raw.githubusercontent.com/Automattic/socket.io/master/LICENSE'
], [
'Spring Boot',
'2002-2022 Pivotal, Inc. All Rights Reserved.',
'Apache License 2.0',
'https://raw.githubusercontent.com/spring-projects/spring-boot/master/LICENSE.txt'
], [
'SQLite',
'n/a',
'Public Domain',
'https://sqlite.org/copyright.html'
], [
'Statsmodels',
'2009-2012 Statsmodels Developers<br>&copy; 2006-2008 Scipy Developers<br>&copy; 2006 Jonathan E. Taylor',
'BSD',
'https://raw.githubusercontent.com/statsmodels/statsmodels/master/LICENSE.txt'
], [
'Svelte',
'20162022 Rich Harris and contributors',
'MIT',
'https://raw.githubusercontent.com/sveltejs/svelte/master/LICENSE.md'
], [
'Symfony',
'2004-2017 Fabien Potencier',
'MIT',
'https://symfony.com/doc/current/contributing/code/license.html'
], [
'TailwindCSS',
'2022 Tailwind Labs, Inc.',
'MIT',
'https://raw.githubusercontent.com/tailwindlabs/tailwindcss/master/LICENSE'
], [
'Tcl/Tk',
'The Regents of the University of California, Sun Microsystems, Inc., Scriptics Corporation, and other parties',
'Tcl/Tk',
'http://tcl.tk/software/tcltk/license.html'
], [
'TensorFlow',
'2022 The TensorFlow Authors',
'CC BY',
'https://creativecommons.org/licenses/by/4.0/'
], [
'Terraform',
'2018 HashiCorp',
'MPL',
'https://raw.githubusercontent.com/hashicorp/terraform-website/master/LICENSE.md'
], [
'Trio',
'2017 Nathaniel J. Smith',
'MIT',
'https://raw.githubusercontent.com/python-trio/trio/master/LICENSE.MIT'
], [
'Twig',
'2009-2020 The Twig Team',
'BSD',
'https://twig.symfony.com/license'
], [
'TypeScript',
'2012-2022 Microsoft',
'Apache',
'https://raw.githubusercontent.com/Microsoft/TypeScript-Handbook/master/LICENSE'
], [
'Underscore.js',
'2009-2021 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors',
'MIT',
'https://raw.githubusercontent.com/jashkenas/underscore/master/LICENSE'
], [
'Vagrant',
'2010-2018 Mitchell Hashimoto',
'MPL',
'https://raw.githubusercontent.com/mitchellh/vagrant/master/website/LICENSE.md'
], [
'Vite',
'2019present, Yuxi (Evan) You and Vite contributors',
'MIT',
'https://github.com/vitejs/vite/blob/main/LICENSE'
], [
'Vitest',
'2021-Present Anthony Fu<br>2021-Present Matias Capeletto<br>',
'MIT',
'https://github.com/vitest-dev/vitest/blob/main/LICENSE'
], [
'Vue Router',
'2013-present Evan You',
'MIT',
'https://raw.githubusercontent.com/vuejs/vue-router/dev/LICENSE'
], [
'Vue.js',
'2013-present Yuxi Evan You',
'MIT',
'https://raw.githubusercontent.com/vuejs/vuejs.org/master/LICENSE'
], [
'Vueuse',
'2019-present Anthony Fu',
'MIT',
'https://raw.githubusercontent.com/vueuse/vueuse/main/LICENSE'
], [
'Vuex',
'2015-present Evan You',
'MIT',
'https://raw.githubusercontent.com/vuejs/vuex/dev/LICENSE'
], [
'Vulkan',
'2014-2017 Khronos Group Inc.<br>Vulkan and the Vulkan logo are registered trademarks of the Khronos Group Inc.',
'CC BY',
'https://creativecommons.org/licenses/by/4.0/'
], [
'webpack',
'JS Foundation and other contributors',
'CC BY',
'https://creativecommons.org/licenses/by/4.0/'
], [
'Werkzeug',
'2007-2022 Pallets',
'BSD',
'https://github.com/pallets/werkzeug/blob/master/LICENSE.rst'
], [
'Wordpress',
'2003-2022 WordPress Foundation',
'GPLv2+',
'https://wordpress.org/about/license/'
], [
'Yarn',
'2016-present Yarn Contributors',
'BSD',
'https://raw.githubusercontent.com/yarnpkg/yarn/master/LICENSE'
], [
'Yii',
'2008-2017 by Yii Software LLC',
'BSD',
'https://raw.githubusercontent.com/yiisoft/yii/master/LICENSE'
], [
'Zig',
'20152022, Zig contributors',
'MIT',
'https://raw.githubusercontent.com/ziglang/zig/master/LICENSE'
]
]

@ -8,7 +8,7 @@ class app.views.RdocPage extends app.views.BasePage
return unless event.target.classList.contains 'method-click-advice' return unless event.target.classList.contains 'method-click-advice'
$.stopEvent(event) $.stopEvent(event)
source = $ '.method-source-code', event.target.parentNode.parentNode source = $ '.method-source-code', event.target.closest('.method-detail')
isShown = source.style.display is 'block' isShown = source.style.display is 'block'
source.style.display = if isShown then 'none' else 'block' source.style.display = if isShown then 'none' else 'block'

@ -3,7 +3,7 @@
//= depend_on sprites/docs.json //= depend_on sprites/docs.json
/*! /*!
* Copyright 2013-2021 Thibaut Courouble and other contributors * Copyright 2013-2023 Thibaut Courouble and other contributors
* *
* This source code is licensed under the terms of the Mozilla * This source code is licensed under the terms of the Mozilla
* Public License, v. 2.0, a copy of which may be obtained at: * Public License, v. 2.0, a copy of which may be obtained at:

@ -228,7 +228,7 @@
// //
._credits { ._credits {
width: 100%; max-width: 100%;
} }
// //

@ -96,8 +96,6 @@ dd {
+ dt { margin-top: 1em; } + dt { margin-top: 1em; }
} }
dfn, var { font-style: normal; }
abbr, acronym, dfn { abbr, acronym, dfn {
cursor: help; cursor: help;
border-bottom: 1px dotted var(--textColor); border-bottom: 1px dotted var(--textColor);

@ -47,6 +47,11 @@
span.descclassname, span.descname { font-family: var(--monoFont) } span.descclassname, span.descname { font-family: var(--monoFont) }
} }
nav[aria-label="Page navigation"]{
display: flex !important;
justify-content: space-between !important;
}
._sphinx { ._sphinx {
@extend %sphinx; @extend %sphinx;
} }

@ -23,7 +23,7 @@ and put it in `/path/to/devdocs/docs/`
Or run the following commands in your terminal: Or run the following commands in your terminal:
```sh ```sh
curl https://storage.googleapis.com/dart-archive/channels/stable/release/$RELEASE/api-docs/dartdocs-gen-api-zip > dartApi.zip; \ curl https://storage.googleapis.com/dart-archive/channels/stable/release/$RELEASE/api-docs/dartdocs-gen-api.zip > dartApi.zip; \
unzip dartApi.zip; mv gen-dartdocs docs/dart~$VERSION unzip dartApi.zip; mv gen-dartdocs docs/dart~$VERSION
``` ```
@ -65,7 +65,7 @@ Go to https://www.erlang.org/downloads and download the HTML documentation file.
```ah ```ah
mkdir --parent docs/erlang\~$VERSION/; \ mkdir --parent docs/erlang\~$VERSION/; \
curl http://erlang.org/download/otp_doc_html_$RELEASE.tar.gz | \ curl -L https://github.com/erlang/otp/releases/download/OTP-$RELEASE/otp_doc_html_$RELEASE.tar.gz | \
bsdtar --extract --file - --directory=docs/erlang\~$VERSION/ bsdtar --extract --file - --directory=docs/erlang\~$VERSION/
``` ```
@ -282,5 +282,5 @@ Download the docs from https://sqlite.org/download.html, unzip it, and rename
it to `/path/to/devdocs/docs/sqlite` it to `/path/to/devdocs/docs/sqlite`
```sh ```sh
curl https://sqlite.org/2022/sqlite-doc-3390200.zip | bsdtar --extract --file - --directory=docs/sqlite/ --strip-components=1 curl https://sqlite.org/2022/sqlite-doc-3400000.zip | bsdtar --extract --file - --directory=docs/sqlite/ --strip-components=1
``` ```

@ -16,7 +16,11 @@ module Docs
def as_json def as_json
@docs.each_with_object [] do |doc, result| @docs.each_with_object [] do |doc, result|
next unless @store.exist?(doc.meta_path) next unless @store.exist?(doc.meta_path)
result << JSON.parse(@store.read(doc.meta_path)) json = JSON.parse(@store.read(doc.meta_path))
if doc.options[:attribution].is_a?(String)
json[:attribution] = doc.options[:attribution].strip
end
result << json
end end
end end

@ -2,7 +2,15 @@ module Docs
class Axios class Axios
class CleanHtmlFilter < Filter class CleanHtmlFilter < Filter
def call def call
if root_page?
return '<h1>Axios</h1><p>Promise based HTTP client for the browser and node.js</p><p>Axios is a simple promise based HTTP client for the browser and node.js. Axios provides a simple to use library in a small package with a very extensible interface.</p>'
end
@doc = at_css('main > .body')
css('.links').remove css('.links').remove
css('pre').each do |node|
node.content = node.content
node['data-language'] = node['class'][/lang-(\w+)/, 1]
end
doc doc
end end
end end

@ -40,21 +40,7 @@ module Docs
css('table[class^=index-] td[valign=top] > a').each_slice(2) do |entry_node, section_node| css('table[class^=index-] td[valign=top] > a').each_slice(2) do |entry_node, section_node|
entry_name = entry_node.content entry_name = entry_node.content
entry_path = entry_node['href']
page = section_node['href'].split('#')[0]
hash = entry_name
# The Special Parameters page has multiple additional entries which should link to the same paragraph
# Example: the documentation for "$!" is equal to the documentation for "!"
if page == 'special-parameters'
if hash.size > 1 && hash[0] == '$'
hash = hash[1..-1]
end
end
# Construct path to the page which the index links to
entry_path = page + '#' + hash
entries << [entry_name, entry_path, entry_type] entries << [entry_name, entry_path, entry_type]
end end

@ -2,11 +2,12 @@ module Docs
class Erlang class Erlang
class CleanHtmlFilter < Filter class CleanHtmlFilter < Filter
def call def call
@doc = at_css('#content') @doc = at_css('#content .innertube:only-child', '#content')
# frontpage # frontpage
css('center:last-child').remove # copyright css('center:last-child').remove # copyright
css('.footer').remove # copyright
css('center', '.example').each do |node| css('center', '.example').each do |node|
node.before(node.children).remove node.before(node.children).remove

@ -13,6 +13,7 @@ module Docs
node.before(node.children).remove node.before(node.children).remove
end end
css('.line-numbers-wrapper').remove
css('pre.hljs').each do |node| css('pre.hljs').each do |node|
lang = node['class'][/highlight-(\w+)/, 1] lang = node['class'][/highlight-(\w+)/, 1]
node['data-language'] = lang if lang node['data-language'] = lang if lang
@ -23,6 +24,8 @@ module Docs
css('code', 'p').remove_attr('class') css('code', 'p').remove_attr('class')
css('.resource__image', '.resource__domain').remove
doc doc
end end
end end

@ -29,8 +29,9 @@ module Docs
node['id'] = node.at_css('.anchor')['name'] node['id'] = node.at_css('.anchor')['name']
end end
css('.keyword > b').each do |node| css('.keyword > b', '.keyword > span').each do |node|
node.content = node.content node.content = node.content
node.remove_attribute('style')
end end
css('.dropdown').each do |node| css('.dropdown').each do |node|

@ -5,6 +5,18 @@ module Docs
@doc = at_css('.contents') @doc = at_css('.contents')
css('.dynheader.closed').remove css('.dynheader.closed').remove
css('.permalink').remove css('.permalink').remove
css('.memSeparator').remove
# Change div.fragment to C++ code with syntax highlight
css('div.fragment').each do |node|
node.name = 'pre'
node['data-language'] = 'cpp'
node_content = ""
node.css('div').each do |inner_node|
node_content += inner_node.text + "\n"
end
node.content = node_content
end
doc doc
end end
end end

@ -21,6 +21,8 @@ module Docs
node.parent['id'] ||= node['name'] || node['id'] node.parent['id'] ||= node['name'] || node['id']
end end
css('a[href*="youtube.com"]').remove
css('.highlight').each do |node| css('.highlight').each do |node|
node.name = 'pre' node.name = 'pre'
node.css('.gutter').remove node.css('.gutter').remove

@ -0,0 +1,17 @@
# frozen_string_literal: true
module Docs
class Qunit
class CleanHtmlFilter < Filter
def call
@doc = at_css('.content[role="main"]')
css('.sidebar').remove
css('pre').each do |node|
node['data-language'] = 'javascript'
node.content = node.content
end
doc
end
end
end
end

@ -0,0 +1,23 @@
# frozen_string_literal: true
module Docs
class Qunit
class EntriesFilter < Docs::EntriesFilter
TYPE_MAPPING = {
'QUnit' => '1. Main methods',
'assert' => '2. Assertions',
'callbacks' => '3. Callback events',
'config' => '4. Configuration',
'extension' => '5. Extension interface'
}
def get_name
at_css('h1').content
end
def get_type
main, *rest = *slug.split('/')
TYPE_MAPPING[main]
end
end
end
end

@ -3,14 +3,20 @@ module Docs
class CleanHtmlFilter < Filter class CleanHtmlFilter < Filter
def call def call
if root_page? if root_page?
at_css('ul')['class'] = 'commands' if root_page?
slug_types = {}
css('article[data-group]').each do |node|
slug_types[node.at_css('a')['href']] = node['data-group']
end
# binding.pry
end
else else
title = at_css('h1') title = at_css('h1')
title.after("<pre>#{title.content.strip}</pre>") title.after("<pre>#{title.content.strip}</pre>")
title.content = title.content.split(' ').first title.content = title.content.split(' ').first
end end
css('nav', 'aside', 'form', '.anchor-link').remove css('nav', 'aside', '.page-feedback', '.anchor-link').remove
css('> article', '.article-main', 'pre > code', '.container').each do |node| css('> article', '.article-main', 'pre > code', '.container').each do |node|
node.before(node.children).remove node.before(node.children).remove

@ -1,30 +1,510 @@
module Docs module Docs
class Redis class Redis
class EntriesFilter < Docs::EntriesFilter class EntriesFilter < Docs::EntriesFilter
def get_name def get_name
slug.gsub('-', ' ') slug.gsub('-', ' ').remove('/')
end end
def get_type def get_type
case at_css('aside > ul:last-child a').content.strip SLUG_NAMES[SLUG_TYPES[slug]]
when 'DEL' then 'Keys'
when 'APPEND' then 'Strings'
when 'HDEL' then 'Hashes'
when 'BLPOP' then 'Lists'
when 'SADD' then 'Sets'
when 'BZPOPMAX' then 'Sorted Sets'
when 'PSUBSCRIBE' then 'Pub/Sub'
when 'DISCARD' then 'Transactions'
when 'EVAL' then 'Scripting'
when 'AUTH' then 'Connection'
when 'BGREWRITEAOF' then 'Server'
when 'PFADD' then 'HyperLogLog'
when 'CLUSTER ADDSLOTS' then 'Cluster'
when 'GEOADD' then 'Geo'
when 'XACK' then 'Stream'
else 'Miscellaneous'
end
end end
# obtain from https://redis.io/commands/ via lib/docs/filters/redis/clean_html.rb using `binding.pry`
SLUG_TYPES = {
"acl-cat/" => "server",
"acl-deluser/" => "server",
"acl-dryrun/" => "server",
"acl-genpass/" => "server",
"acl-getuser/" => "server",
"acl-list/" => "server",
"acl-load/" => "server",
"acl-log/" => "server",
"acl-save/" => "server",
"acl-setuser/" => "server",
"acl-users/" => "server",
"acl-whoami/" => "server",
"append/" => "string",
"asking/" => "cluster",
"auth/" => "connection",
"bf.add/" => "bf",
"bf.card/" => "bf",
"bf.exists/" => "bf",
"bf.info/" => "bf",
"bf.insert/" => "bf",
"bf.loadchunk/" => "bf",
"bf.madd/" => "bf",
"bf.mexists/" => "bf",
"bf.reserve/" => "bf",
"bf.scandump/" => "bf",
"bgrewriteaof/" => "server",
"bgsave/" => "server",
"bitcount/" => "bitmap",
"bitfield/" => "bitmap",
"bitfield_ro/" => "bitmap",
"bitop/" => "bitmap",
"bitpos/" => "bitmap",
"blmove/" => "list",
"blmpop/" => "list",
"blpop/" => "list",
"brpop/" => "list",
"brpoplpush/" => "list",
"bzmpop/" => "sorted-set",
"bzpopmax/" => "sorted-set",
"bzpopmin/" => "sorted-set",
"cf.add/" => "cf",
"cf.addnx/" => "cf",
"cf.count/" => "cf",
"cf.del/" => "cf",
"cf.exists/" => "cf",
"cf.info/" => "cf",
"cf.insert/" => "cf",
"cf.insertnx/" => "cf",
"cf.loadchunk/" => "cf",
"cf.mexists/" => "cf",
"cf.reserve/" => "cf",
"cf.scandump/" => "cf",
"client-caching/" => "connection",
"client-getname/" => "connection",
"client-getredir/" => "connection",
"client-id/" => "connection",
"client-info/" => "connection",
"client-kill/" => "connection",
"client-list/" => "connection",
"client-no-evict/" => "connection",
"client-pause/" => "connection",
"client-reply/" => "connection",
"client-setname/" => "connection",
"client-tracking/" => "connection",
"client-trackinginfo/" => "connection",
"client-unblock/" => "connection",
"client-unpause/" => "connection",
"cluster-addslots/" => "cluster",
"cluster-addslotsrange/" => "cluster",
"cluster-bumpepoch/" => "cluster",
"cluster-count-failure-reports/" => "cluster",
"cluster-countkeysinslot/" => "cluster",
"cluster-delslots/" => "cluster",
"cluster-delslotsrange/" => "cluster",
"cluster-failover/" => "cluster",
"cluster-flushslots/" => "cluster",
"cluster-forget/" => "cluster",
"cluster-getkeysinslot/" => "cluster",
"cluster-info/" => "cluster",
"cluster-keyslot/" => "cluster",
"cluster-links/" => "cluster",
"cluster-meet/" => "cluster",
"cluster-myid/" => "cluster",
"cluster-nodes/" => "cluster",
"cluster-replicas/" => "cluster",
"cluster-replicate/" => "cluster",
"cluster-reset/" => "cluster",
"cluster-saveconfig/" => "cluster",
"cluster-set-config-epoch/" => "cluster",
"cluster-setslot/" => "cluster",
"cluster-shards/" => "cluster",
"cluster-slaves/" => "cluster",
"cluster-slots/" => "cluster",
"cms.incrby/" => "cms",
"cms.info/" => "cms",
"cms.initbydim/" => "cms",
"cms.initbyprob/" => "cms",
"cms.merge/" => "cms",
"cms.query/" => "cms",
"command/" => "server",
"command-count/" => "server",
"command-docs/" => "server",
"command-getkeys/" => "server",
"command-getkeysandflags/" => "server",
"command-info/" => "server",
"command-list/" => "server",
"config-get/" => "server",
"config-resetstat/" => "server",
"config-rewrite/" => "server",
"config-set/" => "server",
"copy/" => "generic",
"dbsize/" => "server",
"decr/" => "string",
"decrby/" => "string",
"del/" => "generic",
"discard/" => "transactions",
"dump/" => "generic",
"echo/" => "connection",
"eval/" => "scripting",
"eval_ro/" => "scripting",
"evalsha/" => "scripting",
"evalsha_ro/" => "scripting",
"exec/" => "transactions",
"exists/" => "generic",
"expire/" => "generic",
"expireat/" => "generic",
"expiretime/" => "generic",
"failover/" => "server",
"fcall/" => "scripting",
"fcall_ro/" => "scripting",
"flushall/" => "server",
"flushdb/" => "server",
"ft._list/" => "search",
"ft.aggregate/" => "search",
"ft.aliasadd/" => "search",
"ft.aliasdel/" => "search",
"ft.aliasupdate/" => "search",
"ft.alter/" => "search",
"ft.config-get/" => "search",
"ft.config-set/" => "search",
"ft.create/" => "search",
"ft.cursor-del/" => "search",
"ft.cursor-read/" => "search",
"ft.dictadd/" => "search",
"ft.dictdel/" => "search",
"ft.dictdump/" => "search",
"ft.dropindex/" => "search",
"ft.explain/" => "search",
"ft.explaincli/" => "search",
"ft.info/" => "search",
"ft.profile/" => "search",
"ft.search/" => "search",
"ft.spellcheck/" => "search",
"ft.sugadd/" => "suggestion",
"ft.sugdel/" => "suggestion",
"ft.sugget/" => "suggestion",
"ft.suglen/" => "suggestion",
"ft.syndump/" => "search",
"ft.synupdate/" => "search",
"ft.tagvals/" => "search",
"function-delete/" => "scripting",
"function-dump/" => "scripting",
"function-flush/" => "scripting",
"function-kill/" => "scripting",
"function-list/" => "scripting",
"function-load/" => "scripting",
"function-restore/" => "scripting",
"function-stats/" => "scripting",
"geoadd/" => "geo",
"geodist/" => "geo",
"geohash/" => "geo",
"geopos/" => "geo",
"georadius/" => "geo",
"georadius_ro/" => "geo",
"georadiusbymember/" => "geo",
"georadiusbymember_ro/" => "geo",
"geosearch/" => "geo",
"geosearchstore/" => "geo",
"get/" => "string",
"getbit/" => "bitmap",
"getdel/" => "string",
"getex/" => "string",
"getrange/" => "string",
"getset/" => "string",
"graph.config-get/" => "graph",
"graph.config-set/" => "graph",
"graph.delete/" => "graph",
"graph.explain/" => "graph",
"graph.list/" => "graph",
"graph.profile/" => "graph",
"graph.query/" => "graph",
"graph.ro_query/" => "graph",
"graph.slowlog/" => "graph",
"hdel/" => "hash",
"hello/" => "connection",
"hexists/" => "hash",
"hget/" => "hash",
"hgetall/" => "hash",
"hincrby/" => "hash",
"hincrbyfloat/" => "hash",
"hkeys/" => "hash",
"hlen/" => "hash",
"hmget/" => "hash",
"hmset/" => "hash",
"hrandfield/" => "hash",
"hscan/" => "hash",
"hset/" => "hash",
"hsetnx/" => "hash",
"hstrlen/" => "hash",
"hvals/" => "hash",
"incr/" => "string",
"incrby/" => "string",
"incrbyfloat/" => "string",
"info/" => "server",
"json.arrappend/" => "json",
"json.arrindex/" => "json",
"json.arrinsert/" => "json",
"json.arrlen/" => "json",
"json.arrpop/" => "json",
"json.arrtrim/" => "json",
"json.clear/" => "json",
"json.debug/" => "json",
"json.debug-memory/" => "json",
"json.del/" => "json",
"json.forget/" => "json",
"json.get/" => "json",
"json.mget/" => "json",
"json.numincrby/" => "json",
"json.nummultby/" => "json",
"json.objkeys/" => "json",
"json.objlen/" => "json",
"json.resp/" => "json",
"json.set/" => "json",
"json.strappend/" => "json",
"json.strlen/" => "json",
"json.toggle/" => "json",
"json.type/" => "json",
"keys/" => "generic",
"lastsave/" => "server",
"latency-doctor/" => "server",
"latency-graph/" => "server",
"latency-histogram/" => "server",
"latency-history/" => "server",
"latency-latest/" => "server",
"latency-reset/" => "server",
"lcs/" => "string",
"lindex/" => "list",
"linsert/" => "list",
"llen/" => "list",
"lmove/" => "list",
"lmpop/" => "list",
"lolwut/" => "server",
"lpop/" => "list",
"lpos/" => "list",
"lpush/" => "list",
"lpushx/" => "list",
"lrange/" => "list",
"lrem/" => "list",
"lset/" => "list",
"ltrim/" => "list",
"memory-doctor/" => "server",
"memory-malloc-stats/" => "server",
"memory-purge/" => "server",
"memory-stats/" => "server",
"memory-usage/" => "server",
"mget/" => "string",
"migrate/" => "generic",
"module-list/" => "server",
"module-load/" => "server",
"module-loadex/" => "server",
"module-unload/" => "server",
"monitor/" => "server",
"move/" => "generic",
"mset/" => "string",
"msetnx/" => "string",
"multi/" => "transactions",
"object-encoding/" => "generic",
"object-freq/" => "generic",
"object-idletime/" => "generic",
"object-refcount/" => "generic",
"persist/" => "generic",
"pexpire/" => "generic",
"pexpireat/" => "generic",
"pexpiretime/" => "generic",
"pfadd/" => "hyperloglog",
"pfcount/" => "hyperloglog",
"pfdebug/" => "hyperloglog",
"pfmerge/" => "hyperloglog",
"pfselftest/" => "hyperloglog",
"ping/" => "connection",
"psetex/" => "string",
"psubscribe/" => "pubsub",
"psync/" => "server",
"pttl/" => "generic",
"publish/" => "pubsub",
"pubsub-channels/" => "pubsub",
"pubsub-numpat/" => "pubsub",
"pubsub-numsub/" => "pubsub",
"pubsub-shardchannels/" => "pubsub",
"pubsub-shardnumsub/" => "pubsub",
"punsubscribe/" => "pubsub",
"quit/" => "connection",
"randomkey/" => "generic",
"readonly/" => "cluster",
"readwrite/" => "cluster",
"rename/" => "generic",
"renamenx/" => "generic",
"replconf/" => "server",
"replicaof/" => "server",
"reset/" => "connection",
"restore/" => "generic",
"restore-asking/" => "server",
"role/" => "server",
"rpop/" => "list",
"rpoplpush/" => "list",
"rpush/" => "list",
"rpushx/" => "list",
"sadd/" => "set",
"save/" => "server",
"scan/" => "generic",
"scard/" => "set",
"script-debug/" => "scripting",
"script-exists/" => "scripting",
"script-flush/" => "scripting",
"script-kill/" => "scripting",
"script-load/" => "scripting",
"sdiff/" => "set",
"sdiffstore/" => "set",
"select/" => "connection",
"set/" => "string",
"setbit/" => "bitmap",
"setex/" => "string",
"setnx/" => "string",
"setrange/" => "string",
"shutdown/" => "server",
"sinter/" => "set",
"sintercard/" => "set",
"sinterstore/" => "set",
"sismember/" => "set",
"slaveof/" => "server",
"slowlog-get/" => "server",
"slowlog-len/" => "server",
"slowlog-reset/" => "server",
"smembers/" => "set",
"smismember/" => "set",
"smove/" => "set",
"sort/" => "generic",
"sort_ro/" => "generic",
"spop/" => "set",
"spublish/" => "pubsub",
"srandmember/" => "set",
"srem/" => "set",
"sscan/" => "set",
"ssubscribe/" => "pubsub",
"strlen/" => "string",
"subscribe/" => "pubsub",
"substr/" => "string",
"sunion/" => "set",
"sunionstore/" => "set",
"sunsubscribe/" => "pubsub",
"swapdb/" => "server",
"sync/" => "server",
"tdigest.add/" => "tdigest",
"tdigest.byrank/" => "tdigest",
"tdigest.byrevrank/" => "tdigest",
"tdigest.cdf/" => "tdigest",
"tdigest.create/" => "tdigest",
"tdigest.info/" => "tdigest",
"tdigest.max/" => "tdigest",
"tdigest.merge/" => "tdigest",
"tdigest.min/" => "tdigest",
"tdigest.quantile/" => "tdigest",
"tdigest.rank/" => "tdigest",
"tdigest.reset/" => "tdigest",
"tdigest.revrank/" => "tdigest",
"tdigest.trimmed_mean/" => "tdigest",
"time/" => "server",
"topk.add/" => "topk",
"topk.count/" => "topk",
"topk.incrby/" => "topk",
"topk.info/" => "topk",
"topk.list/" => "topk",
"topk.query/" => "topk",
"topk.reserve/" => "topk",
"touch/" => "generic",
"ts.add/" => "timeseries",
"ts.alter/" => "timeseries",
"ts.create/" => "timeseries",
"ts.createrule/" => "timeseries",
"ts.decrby/" => "timeseries",
"ts.del/" => "timeseries",
"ts.deleterule/" => "timeseries",
"ts.get/" => "timeseries",
"ts.incrby/" => "timeseries",
"ts.info/" => "timeseries",
"ts.madd/" => "timeseries",
"ts.mget/" => "timeseries",
"ts.mrange/" => "timeseries",
"ts.mrevrange/" => "timeseries",
"ts.queryindex/" => "timeseries",
"ts.range/" => "timeseries",
"ts.revrange/" => "timeseries",
"ttl/" => "generic",
"type/" => "generic",
"unlink/" => "generic",
"unsubscribe/" => "pubsub",
"unwatch/" => "transactions",
"wait/" => "generic",
"watch/" => "transactions",
"xack/" => "stream",
"xadd/" => "stream",
"xautoclaim/" => "stream",
"xclaim/" => "stream",
"xdel/" => "stream",
"xgroup-create/" => "stream",
"xgroup-createconsumer/" => "stream",
"xgroup-delconsumer/" => "stream",
"xgroup-destroy/" => "stream",
"xgroup-setid/" => "stream",
"xinfo-consumers/" => "stream",
"xinfo-groups/" => "stream",
"xinfo-stream/" => "stream",
"xlen/" => "stream",
"xpending/" => "stream",
"xrange/" => "stream",
"xread/" => "stream",
"xreadgroup/" => "stream",
"xrevrange/" => "stream",
"xsetid/" => "stream",
"xtrim/" => "stream",
"zadd/" => "sorted-set",
"zcard/" => "sorted-set",
"zcount/" => "sorted-set",
"zdiff/" => "sorted-set",
"zdiffstore/" => "sorted-set",
"zincrby/" => "sorted-set",
"zinter/" => "sorted-set",
"zintercard/" => "sorted-set",
"zinterstore/" => "sorted-set",
"zlexcount/" => "sorted-set",
"zmpop/" => "sorted-set",
"zmscore/" => "sorted-set",
"zpopmax/" => "sorted-set",
"zpopmin/" => "sorted-set",
"zrandmember/" => "sorted-set",
"zrange/" => "sorted-set",
"zrangebylex/" => "sorted-set",
"zrangebyscore/" => "sorted-set",
"zrangestore/" => "sorted-set",
"zrank/" => "sorted-set",
"zrem/" => "sorted-set",
"zremrangebylex/" => "sorted-set",
"zremrangebyrank/" => "sorted-set",
"zremrangebyscore/" => "sorted-set",
"zrevrange/" => "sorted-set",
"zrevrangebylex/" => "sorted-set",
"zrevrangebyscore/" => "sorted-set",
"zrevrank/" => "sorted-set",
"zscan/" => "sorted-set",
"zscore/" => "sorted-set",
"zunion/" => "sorted-set",
"zunionstore/" => "sorted-set"
}
SLUG_NAMES = {
"bitmap" => "Core: Bitmap",
"cluster" => "Core: Cluster management",
"connection" => "Core: Connection management",
"generic" => "Core: Generic",
"geo" => "Core: Geospatial indices",
"hash" => "Core: Hash",
"hyperloglog" => "Core: HyperLogLog",
"list" => "Core: List",
"pubsub" => "Core: Pub/Sub",
"scripting" => "Core: Scripting and Functions",
"server" => "Core: Server managment",
"set" => "Core: Set",
"sorted-set:" => "Core: Sorted Set",
"stream" => "Core: Stream",
"string" => "Core: String",
"transactions" => "Core: Transactions",
"bf" => "Stack: Bloom Filter",
"cf" => "Stack: Cuckoo Filter",
"cms" => "Stack: Count-min Sketch",
"graph" => "Stack: Graph",
"json" => "Stack: JSON",
"search" => "Stack: Search",
"suggestion" => "Stack: Auto-Suggest",
"tdigest" => "Stack: T-Digest",
"timeseries" => "Stack: Time Series",
"topk" => "Stack: Top-K",
}
end end
end end
end end

@ -61,6 +61,7 @@ module Docs
next if current_url.host == 'matplotlib.org' next if current_url.host == 'matplotlib.org'
next if current_url.host == 'numpy.org' next if current_url.host == 'numpy.org'
next if current_url.host == 'requests.readthedocs.io' next if current_url.host == 'requests.readthedocs.io'
next if current_url.host == 'scikit-learn.org'
next unless node['id'] || node.at_css('code, .classifier') next unless node['id'] || node.at_css('code, .classifier')
links = [] links = []
links << node.children.last.remove while node.children.last.try(:name) == 'a' links << node.children.last.remove while node.children.last.try(:name) == 'a'

@ -8,7 +8,7 @@ module Docs
end end
def get_type def get_type
at_css('aside nav .title-text').content.strip at_css('aside nav .is-active').content.strip
end end
def additional_entries def additional_entries

@ -23,12 +23,23 @@ module Docs
# Remove code highlighting # Remove code highlighting
css('.line-numbers-wrapper').remove css('.line-numbers-wrapper').remove
css('pre').each do |node| if version == '3'
node.parent.name = 'pre' css('pre').each do |node|
node.parent['data-language'] = node.parent['class'][/language-(\w+)/, 1] node.parent.name = 'pre'
node.parent['data-language'] = 'javascript' if node.parent['data-language'][/vue/] # unsupported by prism.js node.parent['data-language'] = node.parent['class'][/language-(\w+)/, 1]
node.parent.remove_attribute 'class' node.parent['data-language'] = 'javascript' if node.parent['data-language'][/vue/] # unsupported by prism.js
node.parent.content = node.content.strip node.parent.remove_attribute 'class'
node.parent.content = node.content.strip
end
else
css('pre').each do |node|
parent = node.ancestors('figure')[0]
parent.name = 'pre'
parent['data-language'] = parent['class'][/(html|js)/, 1]
parent.remove_attribute 'class'
node.css('br').each{ |br| br.replace "\n" }
parent.content = node.content.strip
end
end end
css('.vue-mastery-link').remove css('.vue-mastery-link').remove

@ -0,0 +1,67 @@
module Docs
class Wagtail
class CleanHtmlFilter < Filter
def call
@doc = at_css('main > section', 'main')
# footer contains links like about,contact us etc which
# are not needed in documentation so removed
doc.search('footer').each do |footer|
footer.remove
end
# aside bar contains the search bar and navigation links
# which are not needed
doc.search('aside').each do |aside|
aside.remove
end
# header contains links which are not needed(see sourch code of Wagtail docs)
doc.search('header').each do |head|
head.remove
end
# nav bar contains the search bar and navigation links(older versions)
# which are not needed
doc.search('nav.wy-nav-side').each do |nav|
nav.remove
end
# removing unimportant links(older versions)
doc.search('nav.wy-nav-top').each do |nav|
nav.remove
end
# removing unimportant links from header of very old versions
doc.search('ul.wy-breadcrumbs').each do |ul|
ul.remove
end
# removing release notes
doc.search('li.toctree-l1').each do |li|
li.remove if li.to_s.include? 'Release notes'
end
# removing release notes(older versions)
doc.search('dl').each do |dl|
dl.remove
end
# removing scripts and style
css('script', 'style', 'link').remove
css('hr').remove
# Make proper table headers
css('td.header').each do |node|
node.name = 'th'
end
# Remove code highlighting
css('pre').each do |node|
node.content = node.content
end
doc
end
end
end
end

@ -0,0 +1,15 @@
module Docs
class Wagtail
class EntriesFilter < Docs::EntriesFilter
def get_name
# removing the pilcrow sign and returning the heading
at_css('h1').content.strip.remove("\u{00b6}")
end
def get_type
object, method = *slug.split('/')
method ? object : 'Miscellaneous'
end
end
end
end

@ -83,7 +83,13 @@ module Docs
end end
version do version do
self.release = '14.2.0' self.release = '15.0.0'
self.base_url = 'https://angular.io/'
include Docs::Angular::Since12
end
version '14' do
self.release = '14.2.11'
self.base_url = 'https://angular.io/' self.base_url = 'https://angular.io/'
include Docs::Angular::Since12 include Docs::Angular::Since12
end end

@ -16,7 +16,7 @@ module Docs
options[:skip_patterns] = [/tutorial/] options[:skip_patterns] = [/tutorial/]
self.release = '1.6.3' self.release = '2.0.0'
self.base_url = 'https://docs.astro.build/en/' self.base_url = 'https://docs.astro.build/en/'
self.initial_paths = %w(getting-started/) self.initial_paths = %w(getting-started/)

@ -5,14 +5,12 @@ module Docs
home: 'hthttps://axios-http.com/', home: 'hthttps://axios-http.com/',
code: 'https://github.com/axios/axios' code: 'https://github.com/axios/axios'
} }
self.release = '1.1.3' self.release = '1.2.1'
self.base_url = "https://axios-http.com/docs/" self.base_url = "https://axios-http.com/docs/"
self.initial_paths = %w(intro) self.initial_paths = %w(index intro)
html_filters.push 'axios/entries', 'axios/clean_html' html_filters.push 'axios/entries', 'axios/clean_html'
options[:container] = 'main > .body'
# https://github.com/axios/axios-docs/blob/master/LICENSE # https://github.com/axios/axios-docs/blob/master/LICENSE
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 2020-present John Jakob "Jake" Sarjeant<br> &copy; 2020-present John Jakob "Jake" Sarjeant<br>
@ -22,5 +20,11 @@ module Docs
def get_latest_version(opts) def get_latest_version(opts)
get_latest_github_release('axios', 'axios', opts) get_latest_github_release('axios', 'axios', opts)
end end
private
def process_response?(response)
true
end
end end
end end

@ -17,7 +17,7 @@ module Docs
HTML HTML
version '5' do version '5' do
self.release = '5.2' self.release = '5.3'
self.base_url = "https://getbootstrap.com/docs/#{self.release}/" self.base_url = "https://getbootstrap.com/docs/#{self.release}/"
self.root_path = 'getting-started/introduction/' self.root_path = 'getting-started/introduction/'

@ -20,6 +20,11 @@ module Docs
Licensed under the BSD 3-clause License. Licensed under the BSD 3-clause License.
HTML HTML
version '3.25' do
self.release = '3.25'
self.base_url = "https://cmake.org/cmake/help/v#{self.version}/"
end
version '3.24' do version '3.24' do
self.release = '3.24' self.release = '3.24'
self.base_url = "https://cmake.org/cmake/help/v#{self.version}/" self.base_url = "https://cmake.org/cmake/help/v#{self.version}/"

@ -2,7 +2,7 @@ module Docs
class Crystal < UrlScraper class Crystal < UrlScraper
include MultipleBaseUrls include MultipleBaseUrls
self.type = 'crystal' self.type = 'crystal'
self.release = '1.6.0' self.release = '1.7.0'
self.base_urls = [ self.base_urls = [
"https://crystal-lang.org/api/#{release}/", "https://crystal-lang.org/api/#{release}/",
"https://crystal-lang.org/reference/#{release[0..2]}/", "https://crystal-lang.org/reference/#{release[0..2]}/",
@ -28,7 +28,7 @@ module Docs
HTML HTML
else else
<<-HTML <<-HTML
&copy; 2012&ndash;2022 Manas Technology Solutions.<br> &copy; 2012&ndash;2023 Manas Technology Solutions.<br>
Licensed under the Apache License, Version 2.0. Licensed under the Apache License, Version 2.0.
HTML HTML
end end

@ -12,12 +12,12 @@ module Docs
options[:container] = '.markdown-body' options[:container] = '.markdown-body'
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 2010&ndash;2022 Michael Bostock<br> &copy; 2010&ndash;2023 Michael Bostock<br>
Licensed under the BSD License. Licensed under the BSD License.
HTML HTML
version '7' do version '7' do
self.release = '7.6.1' self.release = '7.8.1'
self.base_url = 'https://github.com/d3/' self.base_url = 'https://github.com/d3/'
self.root_path = 'd3/blob/master/API.md' self.root_path = 'd3/blob/master/API.md'

@ -17,11 +17,11 @@ module Docs
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 2012 the Dart project authors<br> &copy; 2012 the Dart project authors<br>
Licensed under the Creative Commons Attribution-ShareAlike License v4.0. Licensed under the BSD 3-Clause "New" or "Revised" License.
HTML HTML
version '2' do version '2' do
self.release = '2.17.0' self.release = '2.18.5'
self.base_url = "https://api.dart.dev/stable/#{release}/" self.base_url = "https://api.dart.dev/stable/#{release}/"
end end

@ -42,18 +42,27 @@ module Docs
] ]
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 2020 Yehuda Katz, Tom Dale and Ember.js contributors<br> &copy; 2022 Yehuda Katz, Tom Dale and Ember.js contributors<br>
Licensed under the MIT License. Licensed under the MIT License.
HTML HTML
options[:decode_and_clean_paths] = true # handle paths like @ember/application options[:decode_and_clean_paths] = true # handle paths like @ember/application
version '4' do
self.release = '4.9.0'
self.base_urls = %w[
https://guides.emberjs.com/v4.9.0/
https://api.emberjs.com/ember/4.9/
https://api.emberjs.com/ember-data/4.9/
]
end
version '3' do version '3' do
self.release = '3.25.0' self.release = '3.28.0'
self.base_urls = %w[ self.base_urls = %w[
https://guides.emberjs.com/v3.25.0/ https://guides.emberjs.com/v3.28.0/
https://api.emberjs.com/ember/3.25/ https://api.emberjs.com/ember/3.28/
https://api.emberjs.com/ember-data/3.25/ https://api.emberjs.com/ember-data/3.28/
] ]
end end

@ -36,12 +36,12 @@ module Docs
] ]
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 2010&ndash;2022 Ericsson AB<br> &copy; 2010&ndash;2023 Ericsson AB<br>
Licensed under the Apache License, Version 2.0. Licensed under the Apache License, Version 2.0.
HTML HTML
version '25' do version '25' do
self.release = '25.0' self.release = '25.2.2'
end end
version '24' do version '24' do

@ -16,7 +16,7 @@ module Docs
Licensed under the MIT License. Licensed under the MIT License.
HTML HTML
self.release = '0.15.7' self.release = '0.17.2'
self.base_url = 'https://esbuild.github.io/' self.base_url = 'https://esbuild.github.io/'
html_filters.push 'esbuild/clean_html', 'esbuild/entries' html_filters.push 'esbuild/clean_html', 'esbuild/entries'

@ -2,7 +2,7 @@ module Docs
class Eslint < UrlScraper class Eslint < UrlScraper
self.name = 'ESLint' self.name = 'ESLint'
self.type = 'simple' self.type = 'simple'
self.release = '8.23.0' self.release = '8.30.0'
self.base_url = 'https://eslint.org/docs/latest/' self.base_url = 'https://eslint.org/docs/latest/'
self.root_path = 'user-guide/getting-started' self.root_path = 'user-guide/getting-started'
self.links = { self.links = {

@ -2,7 +2,7 @@ module Docs
class Fastapi < UrlScraper class Fastapi < UrlScraper
self.name = 'FastAPI' self.name = 'FastAPI'
self.type = 'fastapi' self.type = 'fastapi'
self.release = '0.86.0' self.release = '0.88.0'
self.base_url = 'https://fastapi.tiangolo.com/' self.base_url = 'https://fastapi.tiangolo.com/'
self.root_path = '/' self.root_path = '/'
self.links = { self.links = {

@ -12,10 +12,18 @@ module Docs
# https://fishshell.com/docs/current/license.html # https://fishshell.com/docs/current/license.html
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 2022 fish-shell developers<br> &copy; 2005-2009 Axel Liljencrantz, 2009-2023 fish-shell contributors<br>
Licensed under the GNU General Public License, version 2. Licensed under the GNU General Public License, version 2.
HTML HTML
version '3.6' do
self.release = '3.6.0'
self.base_url = "https://fishshell.com/docs/#{version}/"
options[:skip].concat %w(genindex.html relnotes.html)
html_filters.push 'sphinx/clean_html', 'fish/clean_html_sphinx', 'fish/entries_sphinx'
end
version '3.5' do version '3.5' do
self.release = '3.5.0' self.release = '3.5.0'
self.base_url = "https://fishshell.com/docs/#{version}/" self.base_url = "https://fishshell.com/docs/#{version}/"

@ -1,7 +1,7 @@
module Docs module Docs
class Git < UrlScraper class Git < UrlScraper
self.type = 'git' self.type = 'git'
self.release = '2.38.0' self.release = '2.39.0'
self.base_url = 'https://git-scm.com/docs' self.base_url = 'https://git-scm.com/docs'
self.initial_paths = %w(/git.html) self.initial_paths = %w(/git.html)
self.links = { self.links = {

@ -1,7 +1,7 @@
module Docs module Docs
class Go < UrlScraper class Go < UrlScraper
self.type = 'go' self.type = 'go'
self.release = '1.19.0' self.release = '1.20.0'
self.base_url = 'https://golang.org/pkg/' self.base_url = 'https://golang.org/pkg/'
self.links = { self.links = {
home: 'https://golang.org/', home: 'https://golang.org/',

@ -20,6 +20,11 @@ module Docs
Licensed under the GNU General Public License version 2. Licensed under the GNU General Public License version 2.
HTML HTML
version '2.7' do
self.release = '2.7.0'
self.base_url = "https://docs.haproxy.org/#{self.version}/"
end
version '2.6' do version '2.6' do
self.release = '2.6.5' self.release = '2.6.5'
self.base_url = "https://docs.haproxy.org/#{self.version}/" self.base_url = "https://docs.haproxy.org/#{self.version}/"

@ -2,7 +2,7 @@ module Docs
class Http < Mdn class Http < Mdn
include MultipleBaseUrls include MultipleBaseUrls
# release = '2022-09-21' # release = '2022-11-17'
self.name = 'HTTP' self.name = 'HTTP'
self.base_urls = [ self.base_urls = [
'https://developer.mozilla.org/en-US/docs/Web/HTTP', 'https://developer.mozilla.org/en-US/docs/Web/HTTP',
@ -19,7 +19,7 @@ module Docs
filter.current_url.host == 'datatracker.ietf.org' ? '.content' : Docs::Mdn.options[:container] filter.current_url.host == 'datatracker.ietf.org' ? '.content' : Docs::Mdn.options[:container]
end end
options[:skip_links] = ->(filter) do options[:skip_links] = ->(filter) do
filter.current_url.host == 'datatracker.ietf.org' ? true : false filter.current_url.host == 'datatracker.ietf.org'
end end
options[:replace_paths] = { '/Access_control_CORS' => '/CORS' } options[:replace_paths] = { '/Access_control_CORS' => '/CORS' }
options[:fix_urls] = ->(url) do options[:fix_urls] = ->(url) do

@ -3,7 +3,7 @@ module Docs
self.name = 'i3' self.name = 'i3'
self.type = 'simple' self.type = 'simple'
self.slug = 'i3' self.slug = 'i3'
self.release = '4.21' self.release = '4.22'
self.base_url = 'https://i3wm.org/docs/userguide.html' self.base_url = 'https://i3wm.org/docs/userguide.html'
self.links = { self.links = {
home: 'https://i3wm.org/', home: 'https://i3wm.org/',

@ -3,7 +3,7 @@ module Docs
self.name = 'Immutable.js' self.name = 'Immutable.js'
self.slug = 'immutable' self.slug = 'immutable'
self.type = 'simple' self.type = 'simple'
self.release = '4.1.0' self.release = '4.2.1'
self.base_url = "https://immutable-js.com/docs/v#{release}/" self.base_url = "https://immutable-js.com/docs/v#{release}/"
self.links = { self.links = {
home: 'https://immutable-js.com/', home: 'https://immutable-js.com/',

@ -12,8 +12,8 @@ module Docs
HTML HTML
version '1.8' do version '1.8' do
self.release = '1.8.0' self.release = '1.8.5'
self.base_url = "https://docs.julialang.org/en/v#{release}/" self.base_url = "https://docs.julialang.org/en/v#{version}/"
self.type = 'julia' self.type = 'julia'
html_filters.push 'julia/entries', 'julia/clean_html' html_filters.push 'julia/entries', 'julia/clean_html'

@ -27,10 +27,15 @@ module Docs
end end
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 2010&ndash;2022 JetBrains s.r.o. and Kotlin Programming Language contributors<br> &copy; 2010&ndash;2023 JetBrains s.r.o. and Kotlin Programming Language contributors<br>
Licensed under the Apache License, Version 2.0. Licensed under the Apache License, Version 2.0.
HTML HTML
version '1.8' do
self.release = '1.8.0'
self.headers = { 'User-Agent' => 'devdocs.io' , 'Cookie' => 'x-ab-test-spring-boot-learning-path=0; userToken=r33dgpe8x3q5vswekg16a' }
end
version '1.7' do version '1.7' do
self.release = '1.7.20' self.release = '1.7.20'
end end

@ -7,7 +7,6 @@ module Docs
home: 'https://kubernetes.io/docs/reference/kubectl/', home: 'https://kubernetes.io/docs/reference/kubectl/',
code: 'https://github.com/kubernetes/kubernetes' code: 'https://github.com/kubernetes/kubernetes'
} }
self.release = "1.23"
self.base_url = "https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands" self.base_url = "https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands"
html_filters.push 'kubectl/entries', 'kubectl/clean_html' html_filters.push 'kubectl/entries', 'kubectl/clean_html'
@ -21,7 +20,7 @@ module Docs
# latest version has a special URL that does not include the version identifier # latest version has a special URL that does not include the version identifier
version do version do
self.release = "1.25" self.release = "1.26"
self.base_url = "https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands" self.base_url = "https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands"
end end

@ -20,7 +20,7 @@ module Docs
# latest version has a special URL that does not include the version identifier # latest version has a special URL that does not include the version identifier
version do version do
self.release = "1.25" self.release = "1.26"
self.base_url = "https://kubernetes.io/docs/reference/kubernetes-api/" self.base_url = "https://kubernetes.io/docs/reference/kubernetes-api/"
end end

@ -1,6 +1,6 @@
module Docs module Docs
class Css < Mdn class Css < Mdn
# release = '2022-09-06' # release = '2023-01-06'
self.name = 'CSS' self.name = 'CSS'
self.base_url = 'https://developer.mozilla.org/en-US/docs/Web/CSS' self.base_url = 'https://developer.mozilla.org/en-US/docs/Web/CSS'
self.root_path = '/Reference' self.root_path = '/Reference'

@ -1,7 +1,7 @@
module Docs module Docs
class Dom < Mdn class Dom < Mdn
# release = '2022-04-27' # release = '2023-01-06'
self.name = 'Web APIs' self.name = 'Web APIs'
self.slug = 'dom' self.slug = 'dom'
self.base_url = 'https://developer.mozilla.org/en-US/docs/Web/API' self.base_url = 'https://developer.mozilla.org/en-US/docs/Web/API'

@ -2,7 +2,7 @@ module Docs
class Html < Mdn class Html < Mdn
prepend FixInternalUrlsBehavior prepend FixInternalUrlsBehavior
# release = '2022-09-06' # release = '2023-01-06'
self.name = 'HTML' self.name = 'HTML'
self.base_url = 'https://developer.mozilla.org/en-US/docs/Web/HTML' self.base_url = 'https://developer.mozilla.org/en-US/docs/Web/HTML'

@ -3,7 +3,7 @@ module Docs
prepend FixInternalUrlsBehavior prepend FixInternalUrlsBehavior
prepend FixRedirectionsBehavior prepend FixRedirectionsBehavior
# release = '2022-09-06' # release = '2023-01-06'
self.name = 'JavaScript' self.name = 'JavaScript'
self.base_url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference' self.base_url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference'

@ -13,7 +13,7 @@ module Docs
} }
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 2005&ndash;2022 MDN contributors.<br> &copy; 2005&ndash;2023 MDN contributors.<br>
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later. Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
HTML HTML

@ -3,8 +3,6 @@ module Docs
self.name = 'OCaml' self.name = 'OCaml'
self.type = 'ocaml' self.type = 'ocaml'
self.root_path = 'index.html' self.root_path = 'index.html'
self.release = '4.14'
self.base_url = "https://v2.ocaml.org/releases/#{self.release}/htmlman/"
self.links = { self.links = {
home: 'https://ocaml.org/', home: 'https://ocaml.org/',
code: 'https://github.com/ocaml/ocaml' code: 'https://github.com/ocaml/ocaml'
@ -26,6 +24,16 @@ module Docs
&copy; 1995-2022 INRIA. &copy; 1995-2022 INRIA.
HTML HTML
version '' do
self.release = '5.0'
self.base_url = "https://v2.ocaml.org/releases/#{self.release}/htmlman/"
end
version '4.14' do
self.release = '4.14'
self.base_url = "https://v2.ocaml.org/releases/#{self.release}/htmlman/"
end
def get_latest_version(opts) def get_latest_version(opts)
get_latest_github_release('ocaml', 'ocaml', opts) get_latest_github_release('ocaml', 'ocaml', opts)
end end

@ -5,7 +5,7 @@ module Docs
self.name = 'PHP' self.name = 'PHP'
self.type = 'php' self.type = 'php'
self.release = '8.1.5' self.release = '8.2'
self.base_url = 'https://www.php.net/manual/en/' self.base_url = 'https://www.php.net/manual/en/'
self.root_path = 'index.html' self.root_path = 'index.html'
self.initial_paths = %w( self.initial_paths = %w(
@ -62,7 +62,7 @@ module Docs
options[:skip_patterns] = [/mysqlnd/, /xdevapi/i] options[:skip_patterns] = [/mysqlnd/, /xdevapi/i]
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 1997&ndash;2021 The PHP Documentation Group<br> &copy; 1997&ndash;2022 The PHP Documentation Group<br>
Licensed under the Creative Commons Attribution License v3.0 or later. Licensed under the Creative Commons Attribution License v3.0 or later.
HTML HTML

@ -9,7 +9,7 @@ module Docs
self.initial_paths = [ self.initial_paths = [
"https://pointclouds.org/documentation/hierarchy.html" "https://pointclouds.org/documentation/hierarchy.html"
] ]
self.release = '1.12.1' self.release = '1.13.0'
self.links = { self.links = {
home: 'https://pointclouds.org/', home: 'https://pointclouds.org/',

@ -2,7 +2,7 @@ module Docs
class Prettier < UrlScraper class Prettier < UrlScraper
self.name = 'Prettier' self.name = 'Prettier'
self.type = 'simple' self.type = 'simple'
self.release = '2.7.1' self.release = '2.8.0'
self.base_url = 'https://prettier.io/docs/en/' self.base_url = 'https://prettier.io/docs/en/'
self.links = { self.links = {
home: 'https://prettier.io/', home: 'https://prettier.io/',

@ -17,19 +17,19 @@ module Docs
library/sunau.html) library/sunau.html)
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 2001&ndash;2022 Python Software Foundation<br> &copy; 2001&ndash;2023 Python Software Foundation<br>
Licensed under the PSF License. Licensed under the PSF License.
HTML HTML
version '3.11' do version '3.11' do
self.release = '3.11.0' self.release = '3.11.1'
self.base_url = "https://docs.python.org/#{self.version}/" self.base_url = "https://docs.python.org/#{self.version}/"
html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html' html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html'
end end
version '3.10' do version '3.10' do
self.release = '3.10.8' self.release = '3.10.9'
self.base_url = "https://docs.python.org/#{self.version}/" self.base_url = "https://docs.python.org/#{self.version}/"
html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html' html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html'

@ -0,0 +1,39 @@
# frozen_string_literal: true
module Docs
class Qunit < UrlScraper
self.name = 'QUnit'
self.type = 'qunit'
self.release = '2.19.3'
self.base_url = 'https://api.qunitjs.com/'
self.root_path = '/'
self.links = {
home: 'https://qunitjs.com/',
code: 'https://github.com/qunitjs/qunit'
}
html_filters.push 'qunit/entries', 'qunit/clean_html'
options[:trailing_slash] = false
options[:container] = '.main'
options[:skip_patterns] = [
/deprecated/,
/^QUnit$/,
/^assert$/,
/^callbacks$/,
/^async$/,
/^config$/,
/^extension$/,
]
options[:attribution] = <<-HTML
&copy; OpenJS Foundation and contributors.<br>
Licensed under the MIT license.
HTML
def get_latest_version(opts)
get_npm_version('qunit', opts)
end
end
end

@ -8,10 +8,11 @@ module Docs
self.name = 'Ruby / Minitest' self.name = 'Ruby / Minitest'
self.slug = 'minitest' self.slug = 'minitest'
self.release = '5.11.3' self.release = '5.17.0'
self.links = { self.links = {
code: 'https://github.com/seattlerb/minitest' code: 'https://github.com/minitest/minitest'
} }
self.base_url = 'https://docs.seattlerb.org/minitest/'
html_filters.replace 'rdoc/entries', 'minitest/entries' html_filters.replace 'rdoc/entries', 'minitest/entries'

@ -76,15 +76,15 @@ module Docs
end end
version '7.0' do version '7.0' do
self.release = '7.0.0' self.release = '7.0.4'
end end
version '6.1' do version '6.1' do
self.release = '6.1.4' self.release = '6.1.7'
end end
version '6.0' do version '6.0' do
self.release = '6.0.4' self.release = '6.0.6'
end end
version '5.2' do version '5.2' do

@ -69,8 +69,12 @@ module Docs
Licensed under their own licenses. Licensed under their own licenses.
HTML HTML
version '3.2' do
self.release = '3.2.0'
end
version '3.1' do version '3.1' do
self.release = '3.1.1' self.release = '3.1.3'
end end
version '3' do version '3' do

@ -1,7 +1,7 @@
module Docs module Docs
class Redis < UrlScraper class Redis < UrlScraper
self.type = 'redis' self.type = 'redis'
self.release = '6.2.1' self.release = '7.0.8'
self.base_url = 'https://redis.io/commands' self.base_url = 'https://redis.io/commands'
self.links = { self.links = {
home: 'https://redis.io/', home: 'https://redis.io/',
@ -10,13 +10,13 @@ module Docs
html_filters.push 'redis/entries', 'redis/clean_html', 'title' html_filters.push 'redis/entries', 'redis/clean_html', 'title'
options[:container] = ->(filter) { filter.root_page? ? '#commands' : '.text' } options[:container] = ->(filter) { filter.root_page? ? '#commands-grid' : 'section' }
options[:title] = false options[:title] = false
options[:root_title] = 'Redis' options[:root_title] = 'Redis'
options[:follow_links] = ->(filter) { filter.root_page? } options[:follow_links] = ->(filter) { filter.root_page? }
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 2009&ndash;2020 Salvatore Sanfilippo<br> &copy; 2009&ndash;2022 Salvatore Sanfilippo<br>
Licensed under the Creative Commons Attribution-ShareAlike License 4.0. Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
HTML HTML
@ -25,5 +25,13 @@ module Docs
body = body.lines[1..-1].join body = body.lines[1..-1].join
body.scan(/Redis ([0-9.]+)/)[0][0] body.scan(/Redis ([0-9.]+)/)[0][0]
end end
private
def parse(response)
response.body.gsub! '<form', '<pre'
response.body.gsub! '</form', '</pre'
super
end
end end
end end

@ -14,7 +14,7 @@ module Docs
options[:container] = '.content .container' options[:container] = '.content .container'
options[:attribution] = <<-HTML options[:attribution] = <<-HTML
&copy; 2010&ndash;2021 Christian Johansen<br> &copy; 2010&ndash;2022 Christian Johansen<br>
Licensed under the BSD License. Licensed under the BSD License.
HTML HTML
@ -27,59 +27,29 @@ module Docs
url url
end end
version '11' do RELEASE_MAPPINGS = {
self.release = '11.1.2' '15' => '15.0.1',
self.base_url = "https://sinonjs.org/releases/v#{release}/" '14' => '14.0.2',
end '13' => '13.0.1',
'12' => '12.0.1',
version '10' do '11' => '11.1.2',
self.release = '10.0.1' '10' => '10.0.1',
self.base_url = "https://sinonjs.org/releases/v#{release}/" '9' => '9.2.2.',
end '8' => '8.1.1',
'7' => '7.5.0',
version '9' do '6' => '6.3.5',
self.release = '9.2.2' '5' => '5.1.0',
self.base_url = "https://sinonjs.org/releases/v#{release}/" '4' => '4.5.0',
end '3' => '3.3.0',
'2' => '2.4.1',
version '8' do '1' => '1.17.7'
self.release = '8.1.1' }
self.base_url = "https://sinonjs.org/releases/v#{release}/"
end
version '7' do
self.release = '7.5.0'
self.base_url = "https://sinonjs.org/releases/v#{release}/"
end
version '6' do
self.release = '6.3.5'
self.base_url = "https://sinonjs.org/releases/v#{release}/"
end
version '5' do
self.release = '5.1.0'
self.base_url = "https://sinonjs.org/releases/v#{release}/"
end
version '4' do
self.release = '4.5.0'
self.base_url = "https://sinonjs.org/releases/v#{release}/"
end
version '3' do
self.release = '3.3.0'
self.base_url = "https://sinonjs.org/releases/v#{release}/"
end
version '2' do
self.release = '2.4.1'
self.base_url = "https://sinonjs.org/releases/v#{release}/"
end
version '1' do RELEASE_MAPPINGS.each do |ver, release|
self.release = '1.17.7' version ver do
self.base_url = "https://sinonjs.org/releases/v#{release}/" self.release = release
self.base_url = "https://sinonjs.org/releases/v#{ver}/"
end
end end
def get_latest_version(opts) def get_latest_version(opts)

@ -2,7 +2,7 @@ module Docs
class Sqlite < FileScraper class Sqlite < FileScraper
self.name = 'SQLite' self.name = 'SQLite'
self.type = 'sqlite' self.type = 'sqlite'
self.release = '3.39.2' self.release = '3.40.0'
self.base_url = 'https://sqlite.org/' self.base_url = 'https://sqlite.org/'
self.root_path = 'docs.html' self.root_path = 'docs.html'
self.initial_paths = %w(keyword_index.html) self.initial_paths = %w(keyword_index.html)

@ -1,13 +1,20 @@
require 'yajl/json_gem' require 'yajl/json_gem'
module Docs module Docs
class SupportTables < Doc class SupportTables < Scraper
include Instrumentable include Instrumentable
self.name = 'Support Tables' self.name = 'Support Tables'
self.slug = 'browser_support_tables' self.slug = 'browser_support_tables'
self.type = 'support_tables' self.type = 'support_tables'
self.release = '1.0.30001412' self.release = '1.0.30001442'
self.base_url = 'https://github.com/Fyrd/caniuse/raw/main/'
# https://github.com/Fyrd/caniuse/blob/main/LICENSE
options[:attribution] = <<-HTML
&copy; 2020 Alexis Deveria<br>
Licensed under the Creative Commons Attribution 4.0 International License.
HTML
def build_pages def build_pages
url = 'https://github.com/Fyrd/caniuse/raw/main/data.json' url = 'https://github.com/Fyrd/caniuse/raw/main/data.json'
@ -29,7 +36,7 @@ module Docs
index_page = { index_page = {
path: 'index', path: 'index',
store_path: 'index.html', store_path: 'index.html',
output: ERB.new(INDEX_PAGE_ERB).result(binding), output: ERB.new(INDEX_PAGE_ERB, trim_mode:">").result(binding),
entries: [Entry.new(nil, 'index', nil)] entries: [Entry.new(nil, 'index', nil)]
} }
@ -49,7 +56,7 @@ module Docs
page = { page = {
path: feature_id, path: feature_id,
store_path: "#{feature_id}.html", store_path: "#{feature_id}.html",
output: ERB.new(PAGE_ERB).result(binding), output: ERB.new(PAGE_ERB, trim_mode:">").result(binding).split("\n").map(&:strip).join("\n"),
entries: [Entry.new(name, feature_id, type)] entries: [Entry.new(name, feature_id, type)]
} }

@ -17,7 +17,7 @@ module Docs
options[:skip] = %w(team.html plugins/) options[:skip] = %w(team.html plugins/)
self.release = '3.53.0' self.release = '3.55.0'
self.base_url = 'https://svelte.dev/docs' self.base_url = 'https://svelte.dev/docs'
html_filters.push 'svelte/entries', 'svelte/clean_html' html_filters.push 'svelte/entries', 'svelte/clean_html'

@ -4,7 +4,7 @@ module Docs
self.name = 'TypeScript' self.name = 'TypeScript'
self.type = 'typescript' self.type = 'typescript'
self.release = '4.8.2' self.release = '4.9.3'
self.base_urls = [ self.base_urls = [
'https://www.typescriptlang.org/docs/handbook/', 'https://www.typescriptlang.org/docs/handbook/',
'https://www.typescriptlang.org/' 'https://www.typescriptlang.org/'

@ -17,11 +17,19 @@ module Docs
options[:skip] = %w(team.html plugins/) options[:skip] = %w(team.html plugins/)
self.release = '3.2.2'
self.base_url = 'https://vitejs.dev/'
self.initial_paths = %w(guide/) self.initial_paths = %w(guide/)
html_filters.push 'vite/entries', 'vite/clean_html' html_filters.push 'vite/entries', 'vite/clean_html'
version do
self.release = '4.1.1'
self.base_url = 'https://vitejs.dev/'
end
version '3' do
self.release = '3.2.5'
self.base_url = 'https://v3.vitejs.dev/'
end
def get_latest_version(opts) def get_latest_version(opts)
get_npm_version('vite', opts) get_npm_version('vite', opts)
end end

@ -16,7 +16,7 @@ module Docs
Licensed under the MIT License. Licensed under the MIT License.
HTML HTML
self.release = '0.25.1' self.release = '0.27.1'
self.base_url = 'https://vitest.dev/' self.base_url = 'https://vitest.dev/'
self.initial_paths = %w(guide/) self.initial_paths = %w(guide/)
html_filters.push 'vitest/entries', 'vite/clean_html' html_filters.push 'vitest/entries', 'vite/clean_html'

@ -1,6 +1,6 @@
module Docs module Docs
class Vue < UrlScraper class Vue < UrlScraper
self.name = 'Vue.js' self.name = 'Vue'
self.slug = 'vue' self.slug = 'vue'
self.type = 'vue' self.type = 'vue'
self.links = { self.links = {
@ -19,16 +19,15 @@ module Docs
HTML HTML
version '3' do version '3' do
self.release = '3.2.41' self.release = '3.2.47'
self.base_url = 'https://vuejs.org/' self.base_url = 'https://vuejs.org/'
self.initial_paths = %w(guide/introduction.html) self.initial_paths = %w(guide/introduction.html)
html_filters.push 'vue/entries_v3', 'vue/clean_html' html_filters.push 'vue/entries_v3', 'vue/clean_html'
end end
version '2' do version '2' do
self.release = '2.6.12' self.release = '2.7.14'
self.base_url = 'https://v2.vuejs.org/' self.base_url = 'https://v2.vuejs.org/v2/'
self.root_path = 'guide/index.html'
self.initial_paths = %w(api/) self.initial_paths = %w(api/)
html_filters.push 'vue/entries', 'vue/clean_html' html_filters.push 'vue/entries', 'vue/clean_html'
end end
@ -36,7 +35,6 @@ module Docs
version '1' do version '1' do
self.release = '1.0.28' self.release = '1.0.28'
self.base_url = 'https://v1.vuejs.org' self.base_url = 'https://v1.vuejs.org'
self.root_path = '/guide/index.html'
self.initial_paths = %w(/api/index.html) self.initial_paths = %w(/api/index.html)
html_filters.push 'vue/entries', 'vue/clean_html' html_filters.push 'vue/entries', 'vue/clean_html'
end end

@ -22,13 +22,13 @@ module Docs
Licensed under the MIT License. Licensed under the MIT License.
HTML HTML
self.release = '9.4.0' self.release = '9.10.0'
self.base_url = 'https://vueuse.org/' self.base_url = 'https://vueuse.org/'
self.initial_paths = %w(functions.html) self.initial_paths = %w(functions.html)
html_filters.push 'vueuse/entries', 'vite/clean_html', 'vueuse/clean_html' html_filters.push 'vueuse/entries', 'vite/clean_html', 'vueuse/clean_html'
def get_latest_version(opts) def get_latest_version(opts)
get_npm_version('vueuse', opts) get_npm_version('@vueuse/core', opts)
end end
end end
end end

@ -0,0 +1,48 @@
module Docs
class Wagtail < UrlScraper
self.name = 'Wagtail'
self.type = 'sphinx'
self.root_path = 'index.html'
self.links = {
home: 'https://wagtail.org/',
code: 'https://github.com/wagtail/wagtail'
}
# adding filters from lib/docs/filters/wagtail
html_filters.push 'wagtail/entries', 'sphinx/clean_html', 'wagtail/clean_html'
# attributions are seen at the bottom of every page(copyright and license etc. details)
options[:attribution] = <<-HTML
&copy; 2014-present Torchbox Ltd and individual contributors.<br>
All rights are reserved.<br>
Licensed under the BSD License.
HTML
# no one wants to see docs about search or release notes
options[:skip] = %w[search.html]
options[:skip_patterns] = [
%r{\Areleases/}
]
# updating release and base_url for different versions
version do
self.release = '4.1.1'
self.base_url = 'https://docs.wagtail.org/en/stable/'
end
version '3' do
self.release = '3.0.3'
self.base_url = "https://docs.wagtail.org/en/v#{release}/"
end
version '2' do
self.release = '2.16.3'
self.base_url = "https://docs.wagtail.org/en/v#{release}/"
end
# this method will fetch the latest version of wagtail
def get_latest_version(opts)
get_latest_github_release('wagtail', 'wagtail', opts)
end
end
end

@ -36,7 +36,7 @@ module Docs
HTML HTML
version '5' do version '5' do
self.release = '5.72.0' self.release = '5.75.0'
self.base_url = 'https://webpack.js.org/' self.base_url = 'https://webpack.js.org/'
end end

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1 @@
https://raw.githubusercontent.com/qunitjs/qunitjs.com/main/img/logo.svg

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1 @@
https://github.com/wagtail/wagtail/blob/main/docs/logo.png

@ -3,8 +3,9 @@ require_relative '../../../../lib/docs'
class ManifestTest < MiniTest::Spec class ManifestTest < MiniTest::Spec
let :doc do let :doc do
doc = Class.new Docs::Doc doc = Class.new Docs::Scraper
doc.name = 'TestDoc' doc.name = 'TestDoc'
doc.options[:attribution] = 'foo'
doc doc
end end
@ -57,13 +58,13 @@ class ManifestTest < MiniTest::Spec
context "when the doc has a meta file" do context "when the doc has a meta file" do
before do before do
stub(store).exist?(meta_path) { true } stub(store).exist?(meta_path) { true }
stub(store).read(meta_path) { '{"name":"Test"}' } stub(store).read(meta_path) { '{"name":"Test", "db_size": 776533}' }
end end
it "includes the doc's meta representation" do it "includes the doc's meta representation" do
json = manifest.as_json json = manifest.as_json
assert_equal 1, json.length assert_equal 1, json.length
assert_equal 'Test', json[0]['name'] assert_equal "{\"name\"=>\"Test\", \"db_size\"=>776533, :attribution=>\"foo\"}", json[0].to_s
end end
end end

Loading…
Cancel
Save