diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..dd371d4e --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,4 @@ +# This controls who gets notified for review and allows branches to be protected. +# Protected branches can only be merged into after being approved by a codeowner. + +* @freeCodeCamp/devdocs diff --git a/Gemfile.lock b/Gemfile.lock index 473542b6..a73db036 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -26,7 +26,7 @@ GEM eventmachine (1.2.7) execjs (2.7.0) exifr (1.3.6) - ffi (1.11.1) + ffi (1.12.2) fspath (3.1.2) highline (2.0.3) html-pipeline (2.12.0) diff --git a/README.md b/README.md index 63d31ddc..8ff70029 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,10 @@ DevDocs combines multiple developer documentations in a clean and organized web DevDocs was created by [Thibaut Courouble](https://thibaut.me) and is operated by [freeCodeCamp](https://www.freecodecamp.org). +## We are currently searching for maintainers + +Please reach out to the community on [Gitter](https://gitter.im/FreeCodeCamp/DevDocs) if you would like to join the team! + Keep track of development news: * Join the contributor chat room on [Gitter](https://gitter.im/FreeCodeCamp/DevDocs) diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee index 8ac93ed4..64bb94d6 100644 --- a/assets/javascripts/templates/pages/about_tmpl.coffee +++ b/assets/javascripts/templates/pages/about_tmpl.coffee @@ -22,7 +22,7 @@ app.templates.aboutPage = -> """
- Copyright 2013–2019 Thibaut Courouble and other contributors
+ Copyright 2013–2020 Thibaut Courouble and other contributors
This software is licensed under the terms of the Mozilla Public License v2.0.
You may obtain a copy of the source code at github.com/freeCodeCamp/devdocs.
For more information, see the COPYRIGHT
@@ -82,8 +82,13 @@ app.templates.aboutPage = -> """
"""
credits = [
- [ 'Angular
Angular.js',
- '2010-2019 Google, Inc.',
+ [ 'Angular.js',
+ '2010-2020 Google, Inc.',
+ 'CC BY 3.0',
+ 'https://creativecommons.org/licenses/by/3.0/'
+ ], [
+ 'Angular',
+ '2010-2020 Google, Inc.',
'CC BY',
'https://creativecommons.org/licenses/by/4.0/'
], [
@@ -378,7 +383,7 @@ credits = [
'https://raw.githubusercontent.com/jekyll/jekyll/master/LICENSE'
], [
'Jest',
- 'Facebook, Inc. and its affiliates.',
+ '2020 Facebook, Inc.',
'MIT',
'https://raw.githubusercontent.com/facebook/jest/master/LICENSE'
], [
@@ -448,7 +453,7 @@ credits = [
'https://raw.githubusercontent.com/lodash/lodash/master/LICENSE'
], [
'Lua',
- '1994–2017 Lua.org, PUC-Rio',
+ '1994–2020 Lua.org, PUC-Rio',
'MIT',
'http://www.lua.org/license.html'
], [
@@ -508,7 +513,7 @@ credits = [
'https://github.com/LearnBoost/mongoose/blob/master/README.md#license'
], [
'nginx',
- '2002-2019 Igor Sysoev
© 2011-2019 Nginx, Inc.',
+ '2002-2020 Igor Sysoev
© 2011-2020 Nginx, Inc.',
'BSD',
'http://nginx.org/LICENSE'
], [
@@ -548,7 +553,7 @@ credits = [
'https://octave.org/doc/interpreter/'
], [
'OpenJDK',
- '1993-2017, Oracle and/or its affiliates. All rights reserved.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses.
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.',
+ '1993, 2020, Oracle and/or its affiliates. All rights reserved.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses.
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.',
'GPLv2',
'http://openjdk.java.net/legal/gplv2+ce.html'
], [
@@ -603,7 +608,7 @@ credits = [
'https://raw.githubusercontent.com/ponylang/ponyc/master/LICENSE'
], [
'PostgreSQL',
- '1996-2019 The PostgreSQL Global Development Group
© 1994 The Regents of the University of California',
+ '1996-2020 The PostgreSQL Global Development Group
© 1994 The Regents of the University of California',
'PostgreSQL',
'https://www.postgresql.org/about/licence/'
], [
diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss
index 1b1c3ad0..4a83095e 100644
--- a/assets/stylesheets/application.css.scss
+++ b/assets/stylesheets/application.css.scss
@@ -3,7 +3,7 @@
//= depend_on sprites/docs.json
/*!
- * Copyright 2013-2019 Thibaut Courouble and other contributors
+ * Copyright 2013-2020 Thibaut Courouble and other contributors
*
* This source code is licensed under the terms of the Mozilla
* Public License, v. 2.0, a copy of which may be obtained at:
diff --git a/docs/file-scrapers.md b/docs/file-scrapers.md
index 855c0a3f..506e9a59 100644
--- a/docs/file-scrapers.md
+++ b/docs/file-scrapers.md
@@ -80,6 +80,24 @@ $GS = '/usr/local/opt/ghostscript/bin/gs'; # GhostScript
## OpenJDK
+https://packages.debian.org/sid/openjdk-11-doc
+
+```sh
+mkdir docs/openjdk~11
+curl --remote-name http://ftp.debian.org/debian/pool/main/o/openjdk-11/openjdk-11-doc_11.0.9.1+1-1_all.deb
+bsdtar --extract --to-stdout --file openjdk-11-doc_11.0.9.1+1-1_all.deb data.tar.xz | \
+bsdtar --extract --xz --file - --strip-components=6 --directory=docs/openjdk\~11/ ./usr/share/doc/openjdk-11-jre-headless/api/
+```
+
+https://packages.debian.org/sid/openjdk-8-doc
+
+```sh
+mkdir docs/openjdk~8
+curl --remote-name http://ftp.debian.org/debian/pool/main/o/openjdk-8/openjdk-8-doc_8u272-b10-1_all.deb
+bsdtar --extract --to-stdout --file openjdk-8-doc_8u272-b10-1_all.deb data.tar.xz | \
+bsdtar --extract --xz --file - --strip-components=6 --directory=docs/openjdk\~8/ ./usr/share/doc/openjdk-8-jre-headless/api/
+```
+
## Perl
## PHP
diff --git a/lib/docs/core/doc.rb b/lib/docs/core/doc.rb
index a5268300..94611208 100644
--- a/lib/docs/core/doc.rb
+++ b/lib/docs/core/doc.rb
@@ -220,6 +220,8 @@ module Docs
if opts.key?(:github_token) and url.start_with?('https://api.github.com/')
headers['Authorization'] = "token #{opts[:github_token]}"
+ elsif ENV['GITHUB_TOKEN'] and url.start_with?('https://api.github.com/')
+ headers['Authorization'] = "token #{ENV['GITHUB_TOKEN']}"
end
opts[:logger].debug("Fetching #{url}")
diff --git a/lib/docs/filters/ansible/entries.rb b/lib/docs/filters/ansible/entries.rb
index d1097b99..a2af6062 100644
--- a/lib/docs/filters/ansible/entries.rb
+++ b/lib/docs/filters/ansible/entries.rb
@@ -7,6 +7,13 @@ module Docs
name.remove! %r{ \- .*}
name.remove! 'Introduction To '
name.remove! %r{ Guide\z}
+
+ if version == "2.10"
+ if slug =~ /\Acollections\// and slug !~ /index$/
+ name = name.split('.')[2]
+ end
+ end
+
name
end
@@ -21,6 +28,12 @@ module Docs
end
end
+ if version == "2.10"
+ if slug =~ /\Acollections\//
+ return "Collection #{slug.split('/')[1..-2].join(".")}"
+ end
+ end
+
if slug =~ /\Acli\//
'CLI Reference'
elsif slug =~ /\Anetwork\//
diff --git a/lib/docs/filters/haxe/clean_html.rb b/lib/docs/filters/haxe/clean_html.rb
index 4e9bd635..c75316b5 100644
--- a/lib/docs/filters/haxe/clean_html.rb
+++ b/lib/docs/filters/haxe/clean_html.rb
@@ -2,7 +2,7 @@ module Docs
class Haxe
class CleanHtmlFilter < Filter
def call
- css('.viewsource', 'hr', 'h1 > small', '.inherited-fields').remove
+ css('.viewsource', 'hr', 'h1 > small', '.inherited-fields', '.label-meta').remove
css('h4 + h1').each do |node|
node.after(node.previous_element)
@@ -28,8 +28,10 @@ module Docs
end
css('.field').each do |node|
+ h3 = node.at_css('h3:not(:empty)')
+ next unless h3.present?
link = node.at_css('a[name]')
- node.at_css('h3:not(:empty)')['id'] = link['name']
+ h3['id'] = link['name']
link.before(link.children).remove
node.before(node.children).remove
end
diff --git a/lib/docs/filters/jest/entries.rb b/lib/docs/filters/jest/entries.rb
index 14a697c2..82c346f9 100644
--- a/lib/docs/filters/jest/entries.rb
+++ b/lib/docs/filters/jest/entries.rb
@@ -19,6 +19,7 @@ module Docs
def additional_entries
return [] unless !root_page? && self.type == self.name # api page
+ return [] if self.slug == 'environment-variables'
entries = []
diff --git a/lib/docs/filters/leaflet/clean_html.rb b/lib/docs/filters/leaflet/clean_html.rb
index 802463de..717b7c74 100644
--- a/lib/docs/filters/leaflet/clean_html.rb
+++ b/lib/docs/filters/leaflet/clean_html.rb
@@ -8,25 +8,25 @@ module Docs
node.name = 'h2'
end
- at_css('> h2:first-child').name = 'h1'
-
- # remove "This reference reflects Leaflet 1.2.0."
- css('h1 ~ p').each do |node|
+ # remove "This reference reflects Leaflet"
+ css('p:contains("This reference reflects Leaflet")').each do |node|
node.remove
break
end
+ at_css('> h2:first-child').name = 'h1'
+
css('section', 'code b', '.accordion', '.accordion-overflow', '.accordion-content').each do |node|
node.before(node.children).remove
end
css('pre > code').each do |node|
node['class'] ||= ''
- lang = if node['class'].include?('lang-html') || node.content =~ /\A
+ lang = if node['class'].include?('lang-html') || node['class'].include?('language-html') || node.content =~ /\A
'html'
- elsif node['class'].include?('lang-css')
+ elsif node['class'].include?('lang-css') || node['class'].include?('language-css')
'css'
- elsif node['class'].include?('lang-js') || node['class'].include?('lang-javascript')
+ elsif node['class'].include?('lang-js') || node['class'].include?('language-js') || node['class'].include?('lang-javascript')
'javascript'
end
node.parent['data-language'] = lang if lang
diff --git a/lib/docs/filters/openjdk/clean_html.rb b/lib/docs/filters/openjdk/clean_html.rb
index 240bde57..44b4d9e1 100644
--- a/lib/docs/filters/openjdk/clean_html.rb
+++ b/lib/docs/filters/openjdk/clean_html.rb
@@ -33,7 +33,7 @@ module Docs
node.content = node.content.remove(' Summary').remove(' Detail').pluralize
end
- if root_page?
+ if root_page? && version == '8'
css('.header')[1].remove
css('.contentContainer')[0].remove
css('.contentContainer')[-1].remove
@@ -45,7 +45,10 @@ module Docs
end
end
- at_css('h1').content = "OpenJDK #{release} Documentation" + (version != release ? " (#{version.split(' ').last})" : '')
+ end
+
+ if root_page?
+ at_css('h1').content = "OpenJDK #{release} Documentation"
end
css('table').each do |node|
diff --git a/lib/docs/scrapers/angular.rb b/lib/docs/scrapers/angular.rb
index 5ca1a35d..0c4b9f43 100644
--- a/lib/docs/scrapers/angular.rb
+++ b/lib/docs/scrapers/angular.rb
@@ -11,7 +11,7 @@ module Docs
options[:max_image_size] = 256_000
options[:attribution] = <<-HTML
- © 2010–2019 Google, Inc.
+ © 2010–2020 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
HTML
@@ -59,7 +59,7 @@ module Docs
end
version do
- self.release = '8.2.14'
+ self.release = '11.0.0'
self.base_url = 'https://angular.io/'
self.root_path = 'docs'
@@ -78,6 +78,66 @@ module Docs
include Docs::Angular::Common
end
+ version '10' do
+ self.release = '10.2.3'
+ self.base_url = 'https://v10.angular.io/'
+ self.root_path = 'docs'
+
+ html_filters.push 'angular/clean_html', 'angular/entries'
+
+ options[:follow_links] = false
+ options[:only_patterns] = [/\Aguide/, /\Atutorial/, /\Aapi/]
+ options[:fix_urls_before_parse] = ->(url) do
+ url.sub! %r{\Aguide/}, '/guide/'
+ url.sub! %r{\Atutorial/}, '/tutorial/'
+ url.sub! %r{\Aapi/}, '/api/'
+ url.sub! %r{\Agenerated/}, '/generated/'
+ url
+ end
+
+ include Docs::Angular::Common
+ end
+
+ version '9' do
+ self.release = '9.1.12'
+ self.base_url = 'https://v9.angular.io/'
+ self.root_path = 'docs'
+
+ html_filters.push 'angular/clean_html', 'angular/entries'
+
+ options[:follow_links] = false
+ options[:only_patterns] = [/\Aguide/, /\Atutorial/, /\Aapi/]
+ options[:fix_urls_before_parse] = ->(url) do
+ url.sub! %r{\Aguide/}, '/guide/'
+ url.sub! %r{\Atutorial/}, '/tutorial/'
+ url.sub! %r{\Aapi/}, '/api/'
+ url.sub! %r{\Agenerated/}, '/generated/'
+ url
+ end
+
+ include Docs::Angular::Common
+ end
+
+ version '8' do
+ self.release = '8.2.14'
+ self.base_url = 'https://v8.angular.io/'
+ self.root_path = 'docs'
+
+ html_filters.push 'angular/clean_html', 'angular/entries'
+
+ options[:follow_links] = false
+ options[:only_patterns] = [/\Aguide/, /\Atutorial/, /\Aapi/]
+ options[:fix_urls_before_parse] = ->(url) do
+ url.sub! %r{\Aguide/}, '/guide/'
+ url.sub! %r{\Atutorial/}, '/tutorial/'
+ url.sub! %r{\Aapi/}, '/api/'
+ url.sub! %r{\Agenerated/}, '/generated/'
+ url
+ end
+
+ include Docs::Angular::Common
+ end
+
version '7' do
self.release = '7.2.15'
self.base_url = 'https://v7.angular.io/'
diff --git a/lib/docs/scrapers/angularjs.rb b/lib/docs/scrapers/angularjs.rb
index 4e563c82..07c3fe1e 100644
--- a/lib/docs/scrapers/angularjs.rb
+++ b/lib/docs/scrapers/angularjs.rb
@@ -38,8 +38,8 @@ module Docs
]
options[:attribution] = <<-HTML
- © 2010–2018 Google, Inc.
- Licensed under the Creative Commons Attribution License 4.0.
+ © 2010–2020 Google, Inc.
+ Licensed under the Creative Commons Attribution License 3.0.
HTML
stub '' do
@@ -49,6 +49,11 @@ module Docs
capybara.execute_script("return document.querySelector('.side-navigation').innerHTML")
end
+ version '1.8' do
+ self.release = '1.8.2'
+ self.base_url = "https://code.angularjs.org/#{release}/docs/partials/"
+ end
+
version '1.7' do
self.release = '1.7.8'
self.base_url = "https://code.angularjs.org/#{release}/docs/partials/"
diff --git a/lib/docs/scrapers/ansible.rb b/lib/docs/scrapers/ansible.rb
index 6826b393..d839095a 100644
--- a/lib/docs/scrapers/ansible.rb
+++ b/lib/docs/scrapers/ansible.rb
@@ -30,18 +30,23 @@ module Docs
/\Aroadmap.*/i,
]
+ version '2.10' do
+ self.release = '2.10.3'
+ self.base_url = "https://docs.ansible.com/ansible/#{version}/"
+ end
+
version '2.9' do
- self.release = '2.9.1'
+ self.release = '2.9.15'
self.base_url = "https://docs.ansible.com/ansible/#{version}/"
end
version '2.8' do
- self.release = '2.8.7'
+ self.release = '2.8.16'
self.base_url = "https://docs.ansible.com/ansible/#{version}/"
end
version '2.7' do
- self.release = '2.7.15'
+ self.release = '2.7.17'
self.base_url = "https://docs.ansible.com/ansible/#{version}/"
end
@@ -71,7 +76,7 @@ module Docs
def get_latest_version(opts)
doc = fetch_doc('https://docs.ansible.com/ansible/latest/index.html', opts)
- doc.at_css('.DocSiteProduct-CurrentVersion').content.strip
+ doc.at_css('.version').content.strip
end
end
end
diff --git a/lib/docs/scrapers/babel.rb b/lib/docs/scrapers/babel.rb
index c8d716f1..f8784e80 100644
--- a/lib/docs/scrapers/babel.rb
+++ b/lib/docs/scrapers/babel.rb
@@ -24,8 +24,7 @@ module Docs
end
def get_latest_version(opts)
- doc = fetch_doc('https://babeljs.io/docs/en/', opts)
- doc.at_css('a[href="/versions"] > h3').content
+ get_latest_github_release('babel', 'babel', opts)
end
end
end
diff --git a/lib/docs/scrapers/chef.rb b/lib/docs/scrapers/chef.rb
index f0b7d6b0..3295f2e4 100644
--- a/lib/docs/scrapers/chef.rb
+++ b/lib/docs/scrapers/chef.rb
@@ -49,8 +49,8 @@ module Docs
end
def get_latest_version(opts)
- doc = fetch_doc('https://downloads.chef.io/chef', opts)
- doc.at_css('h1.product-heading > span').content.strip
+ doc = fetch_doc('https://downloads.chef.io/products/infra', opts)
+ doc.at_css('#versions > option').content.strip
end
end
end
diff --git a/lib/docs/scrapers/codeigniter.rb b/lib/docs/scrapers/codeigniter.rb
index a8113210..4438abb9 100644
--- a/lib/docs/scrapers/codeigniter.rb
+++ b/lib/docs/scrapers/codeigniter.rb
@@ -40,9 +40,8 @@ module Docs
end
def get_latest_version(opts)
- doc = fetch_doc('https://codeigniter.com/userguide3/changelog.html', opts)
- header = doc.at_css('#change-log h2')
- header.content.scan(/([0-9.]+)/)[0][0]
+ tags = get_github_tags('codeigniter4', 'codeigniter4', opts)
+ tags[0]['name'][1..-1]
end
end
end
diff --git a/lib/docs/scrapers/dart.rb b/lib/docs/scrapers/dart.rb
index e3b8c289..4522762b 100644
--- a/lib/docs/scrapers/dart.rb
+++ b/lib/docs/scrapers/dart.rb
@@ -33,7 +33,7 @@ module Docs
def get_latest_version(opts)
doc = fetch_doc('https://api.dartlang.org/', opts)
label = doc.at_css('footer > span').content.strip
- label.sub(/Dart /, '')
+ label.sub(/Dart\s*/, '')
end
end
end
diff --git a/lib/docs/scrapers/docker.rb b/lib/docs/scrapers/docker.rb
index 06c3344d..6328644b 100644
--- a/lib/docs/scrapers/docker.rb
+++ b/lib/docs/scrapers/docker.rb
@@ -260,9 +260,9 @@ module Docs
end
def get_latest_version(opts)
- doc = fetch_doc('https://docs.docker.com/', opts)
- label = doc.at_css('.nav-container button.dropdown-toggle').content.strip
- label.scan(/([0-9.]+)/)[0][0]
+ doc = fetch_doc('https://docs.docker.com/engine/release-notes/', opts)
+ latest_version = doc.at_css('.content > section > h1[id^="version-"]').content.strip
+ latest_version.rpartition(' ')[-1]
end
end
end
diff --git a/lib/docs/scrapers/elixir.rb b/lib/docs/scrapers/elixir.rb
index f3cc94b2..0888bd44 100644
--- a/lib/docs/scrapers/elixir.rb
+++ b/lib/docs/scrapers/elixir.rb
@@ -126,7 +126,7 @@ module Docs
def get_latest_version(opts)
doc = fetch_doc('https://hexdocs.pm/elixir/api-reference.html', opts)
- doc.at_css('h2.sidebar-projectVersion').content.strip[1..-1]
+ doc.at_css('.sidebar-projectVersion').content.strip[1..-1]
end
end
end
diff --git a/lib/docs/scrapers/erlang.rb b/lib/docs/scrapers/erlang.rb
index 14a87cf5..a888e511 100644
--- a/lib/docs/scrapers/erlang.rb
+++ b/lib/docs/scrapers/erlang.rb
@@ -57,8 +57,7 @@ module Docs
end
def get_latest_version(opts)
- doc = fetch_doc('https://www.erlang.org/downloads', opts)
- doc.at_css('.col-lg-3 > ul > li').content.strip.sub(/OTP /, '')
+ get_latest_github_release('erlang', 'otp', opts)[4..-1]
end
end
end
diff --git a/lib/docs/scrapers/fish.rb b/lib/docs/scrapers/fish.rb
index 3dac427f..a8b1ce8b 100644
--- a/lib/docs/scrapers/fish.rb
+++ b/lib/docs/scrapers/fish.rb
@@ -54,8 +54,7 @@ module Docs
end
def get_latest_version(opts)
- doc = fetch_doc('http://fishshell.com/docs/current/index.html', opts)
- doc.at_css('#toc-index').content.scan(/([0-9.]+)/)[0][0]
+ get_latest_github_release('fish-shell', 'fish-shell', opts)
end
end
end
diff --git a/lib/docs/scrapers/gnu_cobol.rb b/lib/docs/scrapers/gnu_cobol.rb
index 9965359d..a211ef49 100644
--- a/lib/docs/scrapers/gnu_cobol.rb
+++ b/lib/docs/scrapers/gnu_cobol.rb
@@ -18,9 +18,11 @@ module Docs
HTML
def get_latest_version(opts)
- doc = fetch_doc('https://open-cobol.sourceforge.io/HTML/gnucobpg.html', opts)
- title = doc.at_css('h1').content
- title.scan(/([0-9.]+)/)[0][0]
+ fetch_doc('https://sourceforge.net/projects/gnucobol/files/gnucobol/', opts)
+ .css('#files_list > tbody > tr')
+ .map { |file| file['title'] }
+ .sort_by { |version| version.to_f }
+ .last
end
end
end
diff --git a/lib/docs/scrapers/gnuplot.rb b/lib/docs/scrapers/gnuplot.rb
index 0682ade4..d63f0dea 100644
--- a/lib/docs/scrapers/gnuplot.rb
+++ b/lib/docs/scrapers/gnuplot.rb
@@ -37,5 +37,10 @@ module Docs
Distributed under the gnuplot license (rights to distribute modified versions are withheld).
HTML
+ def get_latest_version(opts)
+ doc = fetch_doc('http://www.gnuplot.info/download.html', opts)
+ label = doc.at_css('h2').content.strip
+ label.sub(/[^0-9.]*/, '')
+ end
end
end
diff --git a/lib/docs/scrapers/go.rb b/lib/docs/scrapers/go.rb
index 05f8a531..210ef1f6 100644
--- a/lib/docs/scrapers/go.rb
+++ b/lib/docs/scrapers/go.rb
@@ -1,7 +1,7 @@
module Docs
class Go < UrlScraper
self.type = 'go'
- self.release = '1.13'
+ self.release = '1.15'
self.base_url = 'https://golang.org/pkg/'
self.links = {
home: 'https://golang.org/',
diff --git a/lib/docs/scrapers/godot.rb b/lib/docs/scrapers/godot.rb
index 1ccf693f..03f8192e 100644
--- a/lib/docs/scrapers/godot.rb
+++ b/lib/docs/scrapers/godot.rb
@@ -44,8 +44,7 @@ module Docs
end
def get_latest_version(opts)
- doc = fetch_doc('https://docs.godotengine.org/', opts)
- doc.at_css('.version').content.strip
+ get_latest_github_release('godotengine', 'godot', opts).split('-')[0]
end
end
end
diff --git a/lib/docs/scrapers/haxe.rb b/lib/docs/scrapers/haxe.rb
index 2dbab01a..4950ed67 100644
--- a/lib/docs/scrapers/haxe.rb
+++ b/lib/docs/scrapers/haxe.rb
@@ -2,7 +2,7 @@ module Docs
class Haxe < UrlScraper
self.name = 'Haxe'
self.type = 'simple'
- self.release = '3.4.7'
+ self.release = '4.1.3'
self.base_url = 'https://api.haxe.org/'
html_filters.push 'haxe/clean_html', 'haxe/entries'
@@ -10,7 +10,7 @@ module Docs
options[:container] = '.span9'
options[:attribution] = <<-HTML
- © 2005–2018 Haxe Foundation
+ © 2005–2020 Haxe Foundation
Licensed under a MIT license.
HTML
@@ -20,7 +20,7 @@ module Docs
code: 'https://github.com/HaxeFoundation/haxe'
}
- options[:skip_patterns] = [/\A(?:cpp|cs|flash|java|js|neko|php|python|lua|hl|sys)/i]
+ options[:skip_patterns] = [/\A(?:cpp|cs|flash|java|js|neko|php|python|lua|hl|sys|eval)/i]
end
version 'C++' do
@@ -67,6 +67,10 @@ module Docs
self.base_url = 'https://api.haxe.org/python/'
end
+ version 'Eval' do
+ self.base_url = 'https://api.haxe.org/eval/'
+ end
+
def get_latest_version(opts)
doc = fetch_doc('https://api.haxe.org/', opts)
label = doc.at_css('.container.main-content h1 > small').content
diff --git a/lib/docs/scrapers/influxdata.rb b/lib/docs/scrapers/influxdata.rb
index db160f9c..6a6bff7e 100644
--- a/lib/docs/scrapers/influxdata.rb
+++ b/lib/docs/scrapers/influxdata.rb
@@ -48,9 +48,7 @@ module Docs
HTML
def get_latest_version(opts)
- doc = fetch_doc('https://docs.influxdata.com/influxdb/', opts)
- label = doc.at_css('.navbar--current-product').content.strip
- label.scan(/([0-9.]+)/)[0][0]
+ get_latest_github_release('influxdata', 'influxdb', opts)
end
end
end
diff --git a/lib/docs/scrapers/jest.rb b/lib/docs/scrapers/jest.rb
index 4b60ba75..5591b4ce 100644
--- a/lib/docs/scrapers/jest.rb
+++ b/lib/docs/scrapers/jest.rb
@@ -1,7 +1,7 @@
module Docs
class Jest < UrlScraper
self.type = 'simple'
- self.release = '24.9'
+ self.release = '26.6'
self.base_url = 'https://jestjs.io/docs/en/'
self.root_path = 'getting-started'
self.links = {
@@ -14,7 +14,7 @@ module Docs
options[:container] = '.docMainWrapper'
options[:attribution] = <<-HTML
- © 2019 Facebook, Inc. and its affiliates.
+ © 2020 Facebook, Inc.
Licensed under the MIT License.
HTML
diff --git a/lib/docs/scrapers/leaflet.rb b/lib/docs/scrapers/leaflet.rb
index ca75ea57..69abef25 100644
--- a/lib/docs/scrapers/leaflet.rb
+++ b/lib/docs/scrapers/leaflet.rb
@@ -19,6 +19,11 @@ module Docs
Maps © OpenStreetMap contributors.
HTML
+ version '1.7' do
+ self.release = '1.7.1'
+ self.base_url = "https://leafletjs.com/reference-#{release}.html"
+ end
+
version '1.6' do
self.release = '1.6.0'
self.base_url = "https://leafletjs.com/reference-#{release}.html"
diff --git a/lib/docs/scrapers/lua.rb b/lib/docs/scrapers/lua.rb
index e3608918..5192548a 100644
--- a/lib/docs/scrapers/lua.rb
+++ b/lib/docs/scrapers/lua.rb
@@ -8,12 +8,17 @@ module Docs
options[:skip_links] = true
options[:attribution] = <<-HTML
- © 1994–2017 Lua.org, PUC-Rio.
+ © 1994–2020 Lua.org, PUC-Rio.
Licensed under the MIT License.
HTML
+ version '5.4' do
+ self.release = '5.4.1'
+ self.base_url = 'https://www.lua.org/manual/5.4/'
+ end
+
version '5.3' do
- self.release = '5.3.4'
+ self.release = '5.3.6'
self.base_url = 'https://www.lua.org/manual/5.3/'
end
diff --git a/lib/docs/scrapers/moment.rb b/lib/docs/scrapers/moment.rb
index 5b7491ea..e74163be 100644
--- a/lib/docs/scrapers/moment.rb
+++ b/lib/docs/scrapers/moment.rb
@@ -24,8 +24,7 @@ module Docs
HTML
def get_latest_version(opts)
- doc = fetch_doc('http://momentjs.com/', opts)
- doc.at_css('.hero-title > h1 > span').content
+ get_github_tags('moment', 'moment', opts)[0]['name']
end
end
end
diff --git a/lib/docs/scrapers/nginx.rb b/lib/docs/scrapers/nginx.rb
index 98a927fc..89a9db64 100644
--- a/lib/docs/scrapers/nginx.rb
+++ b/lib/docs/scrapers/nginx.rb
@@ -2,7 +2,7 @@ module Docs
class Nginx < UrlScraper
self.name = 'nginx'
self.type = 'nginx'
- self.release = '1.17.2'
+ self.release = '1.19.3'
self.base_url = 'https://nginx.org/en/docs/'
self.links = {
home: 'https://nginx.org/',
@@ -20,9 +20,10 @@ module Docs
options[:skip_patterns] = [/\/faq\//]
+ # http://nginx.org/LICENSE
options[:attribution] = <<-HTML
- © 2002-2019 Igor Sysoev
- © 2011-2019 Nginx, Inc.
+ © 2002-2020 Igor Sysoev
+ © 2011-2020 Nginx, Inc.
Licensed under the BSD License.
HTML
diff --git a/lib/docs/scrapers/node.rb b/lib/docs/scrapers/node.rb
index c5ac060c..c448df10 100644
--- a/lib/docs/scrapers/node.rb
+++ b/lib/docs/scrapers/node.rb
@@ -23,7 +23,12 @@ module Docs
HTML
version do
- self.release = '12.9.1'
+ self.release = '14.15.0'
+ self.base_url = 'https://nodejs.org/dist/latest-v14.x/docs/api/'
+ end
+
+ version '12 LTS' do
+ self.release = '12.19.0'
self.base_url = 'https://nodejs.org/dist/latest-v12.x/docs/api/'
end
diff --git a/lib/docs/scrapers/openjdk.rb b/lib/docs/scrapers/openjdk.rb
index c26bce4c..20656e8d 100644
--- a/lib/docs/scrapers/openjdk.rb
+++ b/lib/docs/scrapers/openjdk.rb
@@ -18,13 +18,20 @@ module Docs
/doc-files\//]
options[:attribution] = <<-HTML
- © 1993–2017, Oracle and/or its affiliates. All rights reserved.
+ © 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
HTML
+ version '11' do
+ self.release = '11.0.9'
+ self.root_path = 'index.html'
+ self.base_url = 'https://docs.oracle.com/en/java/javase/11/docs/api/'
+ options[:only_patterns] = [/\Ajava\./]
+ end
+
version '8' do
self.release = '8'
diff --git a/lib/docs/scrapers/pandas.rb b/lib/docs/scrapers/pandas.rb
index e333da7f..fedba47b 100644
--- a/lib/docs/scrapers/pandas.rb
+++ b/lib/docs/scrapers/pandas.rb
@@ -62,9 +62,7 @@ module Docs
end
def get_latest_version(opts)
- doc = fetch_doc('http://pandas.pydata.org/pandas-docs/stable/', opts)
- label = doc.at_css('.body > .section > p').content
- label.scan(/Version: ([0-9.]+)/)[0][0]
+ get_latest_github_release('pandas-dev', 'pandas', opts)
end
end
end
diff --git a/lib/docs/scrapers/perl.rb b/lib/docs/scrapers/perl.rb
index ebf0a653..8c0462e5 100644
--- a/lib/docs/scrapers/perl.rb
+++ b/lib/docs/scrapers/perl.rb
@@ -46,8 +46,7 @@ module Docs
def get_latest_version(opts)
doc = fetch_doc('https://perldoc.perl.org/', opts)
- header = doc.at_css('h2.h1').content
- header.scan(/Perl ([0-9.]+)/)[0][0]
+ doc.at_css('#dropdownlink-stable').content
end
end
end
diff --git a/lib/docs/scrapers/php.rb b/lib/docs/scrapers/php.rb
index 181d8b67..c6ab0581 100644
--- a/lib/docs/scrapers/php.rb
+++ b/lib/docs/scrapers/php.rb
@@ -68,9 +68,8 @@ module Docs
HTML
def get_latest_version(opts)
- doc = fetch_doc('https://secure.php.net/manual/en/doc.changelog.php', opts)
- label = doc.at_css('tbody.gen-changelog > tr > td').content
- label.split(',').last.strip
+ doc = fetch_doc('https://www.php.net/supported-versions.php', opts)
+ doc.at_css('table > tbody > .stable:last-of-type > td > a').content.strip
end
end
end
diff --git a/lib/docs/scrapers/postgresql.rb b/lib/docs/scrapers/postgresql.rb
index 9483bfde..3c428bf8 100644
--- a/lib/docs/scrapers/postgresql.rb
+++ b/lib/docs/scrapers/postgresql.rb
@@ -51,10 +51,15 @@ module Docs
/\Aunsupported-features/ ]
options[:attribution] = <<-HTML
- © 1996–2019 The PostgreSQL Global Development Group
+ © 1996–2020 The PostgreSQL Global Development Group
Licensed under the PostgreSQL License.
HTML
+ version '13' do
+ self.release = '13.1'
+ self.base_url = "https://www.postgresql.org/docs/#{version}/"
+ end
+
version '12' do
self.release = '12.1'
self.base_url = "https://www.postgresql.org/docs/#{version}/"
diff --git a/lib/docs/scrapers/pug.rb b/lib/docs/scrapers/pug.rb
index 79a1b0a8..f95f3d9b 100644
--- a/lib/docs/scrapers/pug.rb
+++ b/lib/docs/scrapers/pug.rb
@@ -3,7 +3,7 @@ module Docs
self.type = 'pug'
self.base_url = 'https://pugjs.org/'
self.root_path = 'api/getting-started.html'
- self.release = '2.0.3'
+ self.release = '3.0.0'
self.links = {
home: 'https://pugjs.org/',
code: 'https://github.com/pugjs/pug'
@@ -18,6 +18,10 @@ module Docs
Licensed under the MIT license.
HTML
+ options[:skip_patterns] = [
+ /support/
+ ]
+
def get_latest_version(opts)
get_npm_version('pug', opts)
end
diff --git a/lib/docs/scrapers/python.rb b/lib/docs/scrapers/python.rb
index 89f1c3c0..2676b5bf 100644
--- a/lib/docs/scrapers/python.rb
+++ b/lib/docs/scrapers/python.rb
@@ -23,22 +23,30 @@ module Docs
Licensed under the PSF License.
HTML
+ # mkdir -p docs/python~3.9 && cd docs/python~3.9 && curl -L https://docs.python.org/3.9/archives/python-3.9.0-docs-html.tar.bz2 | tar xj --strip-components=1
+ version '3.9' do # docs.python.org/3.9/download.html
+ self.release = '3.9.0'
+ self.base_url = 'https://docs.python.org/3.9/'
+
+ html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html'
+ end
+
version '3.8' do # docs.python.org/3.8/download.html
- self.release = '3.8.1'
+ self.release = '3.8.6'
self.base_url = 'https://docs.python.org/3.8/'
html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html'
end
version '3.7' do # docs.python.org/3.7/download.html
- self.release = '3.7.6'
+ self.release = '3.7.9'
self.base_url = 'https://docs.python.org/3.7/'
html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html'
end
version '3.6' do # docs.python.org/3.6/download.html
- self.release = '3.6.10'
+ self.release = '3.6.12'
self.base_url = 'https://docs.python.org/3.6/'
html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html'
@@ -60,7 +68,7 @@ module Docs
def get_latest_version(opts)
doc = fetch_doc('https://docs.python.org/', opts)
- doc.at_css('.version_switcher_placeholder').content
+ doc.at_css('title').content.split(' ')[0]
end
end
end
diff --git a/lib/docs/scrapers/rdoc/ruby.rb b/lib/docs/scrapers/rdoc/ruby.rb
index 3a2b8b76..157af2fe 100644
--- a/lib/docs/scrapers/rdoc/ruby.rb
+++ b/lib/docs/scrapers/rdoc/ruby.rb
@@ -69,6 +69,10 @@ module Docs
Licensed under their own licenses.
HTML
+ version '2.7' do
+ self.release = '2.7.2'
+ end
+
version '2.6' do
self.release = '2.6.3'
end
diff --git a/lib/docs/scrapers/react.rb b/lib/docs/scrapers/react.rb
index e293cf11..2a9990b0 100644
--- a/lib/docs/scrapers/react.rb
+++ b/lib/docs/scrapers/react.rb
@@ -2,7 +2,7 @@ module Docs
class React < UrlScraper
self.name = 'React'
self.type = 'simple'
- self.release = '16.12.0'
+ self.release = '17.0.1'
self.base_url = 'https://reactjs.org/docs/'
self.root_path = 'hello-world.html'
self.links = {
diff --git a/lib/docs/scrapers/react_native.rb b/lib/docs/scrapers/react_native.rb
index fe87e492..d00e55c2 100644
--- a/lib/docs/scrapers/react_native.rb
+++ b/lib/docs/scrapers/react_native.rb
@@ -32,8 +32,8 @@ module Docs
HTML
def get_latest_version(opts)
- doc = fetch_doc('https://facebook.github.io/react-native/docs/getting-started.html', opts)
- doc.at_css('header > a > h3').content
+ doc = fetch_doc('https://reactnative.dev/docs/getting-started', opts)
+ doc.at_css('meta[name="docsearch:version"]')['content']
end
end
end
diff --git a/lib/docs/scrapers/scikit_learn.rb b/lib/docs/scrapers/scikit_learn.rb
index 973c9d7e..933484f0 100644
--- a/lib/docs/scrapers/scikit_learn.rb
+++ b/lib/docs/scrapers/scikit_learn.rb
@@ -26,8 +26,7 @@ module Docs
HTML
def get_latest_version(opts)
- doc = fetch_doc('https://scikit-learn.org/stable/documentation.html', opts)
- doc.at_css('.body h1').content.scan(/([0-9.]+)/)[0][0]
+ get_latest_github_release('scikit-learn', 'scikit-learn', opts)
end
end
end
diff --git a/lib/docs/scrapers/sqlite.rb b/lib/docs/scrapers/sqlite.rb
index 9b245326..246ee6e9 100644
--- a/lib/docs/scrapers/sqlite.rb
+++ b/lib/docs/scrapers/sqlite.rb
@@ -2,7 +2,7 @@ module Docs
class Sqlite < FileScraper
self.name = 'SQLite'
self.type = 'sqlite'
- self.release = '3.30.1'
+ self.release = '3.33.0'
self.base_url = 'https://sqlite.org/'
self.root_path = 'docs.html'
self.initial_paths = %w(keyword_index.html)
diff --git a/lib/docs/scrapers/statsmodels.rb b/lib/docs/scrapers/statsmodels.rb
index 3e8a357c..74dcaf9c 100644
--- a/lib/docs/scrapers/statsmodels.rb
+++ b/lib/docs/scrapers/statsmodels.rb
@@ -22,8 +22,7 @@ module Docs
HTML
def get_latest_version(opts)
- doc = fetch_doc('http://www.statsmodels.org/stable/', opts)
- doc.at_css('.sphinxsidebarwrapper h3 + p > b').content[1..-1]
+ get_latest_github_release('statsmodels', 'statsmodels', opts)
end
end
end
diff --git a/lib/docs/scrapers/vagrant.rb b/lib/docs/scrapers/vagrant.rb
index 7400fc8c..fe38cc55 100644
--- a/lib/docs/scrapers/vagrant.rb
+++ b/lib/docs/scrapers/vagrant.rb
@@ -20,8 +20,7 @@ module Docs
HTML
def get_latest_version(opts)
- contents = get_github_file_contents('hashicorp', 'vagrant', 'website/config.rb', opts)
- contents.scan(/version\s+=\s+"([0-9.]+)"/)[0][0]
+ get_github_tags('hashicorp', 'vagrant', opts)[0]['name'][1..-1]
end
end
end
diff --git a/public/icons/docs/postgresql/SOURCE b/public/icons/docs/postgresql/SOURCE
index 84ce600b..e9a53dcf 100644
--- a/public/icons/docs/postgresql/SOURCE
+++ b/public/icons/docs/postgresql/SOURCE
@@ -1 +1 @@
-http://www.postgresql.org/about/press/presskit93/#logos
+https://www.postgresql.org/about/press/presskit93/#logos
diff --git a/public/icons/docs/ruby/SOURCE b/public/icons/docs/ruby/SOURCE
index d1822cdc..73b53b6d 100644
--- a/public/icons/docs/ruby/SOURCE
+++ b/public/icons/docs/ruby/SOURCE
@@ -1 +1,2 @@
-http://commons.wikimedia.org/wiki/File:Ruby_logo.svg
+https://www.ruby-lang.org/en/about/logo/
+https://commons.wikimedia.org/wiki/File:Ruby_logo.svg