History

Merge branch 'freeCodeCamp:main' into opengl

Suraj Yadav committed 2 years ago

Commit 20840ba2 parents 0b2cde3 7d24d9721 files · +110 −93Browse files

Unified · Split

21 files
  1. .github/workflows/build.yml +1 −1
  2. .github/workflows/schedule-doc-report.yml +1 −1
  3. .github/workflows/test.yml +1 −1
  4. Gemfile +0 −1
  5. Gemfile.lock +0 −4
  6. docs/file-scrapers.md +4 −1
  7. lib/docs/filters/elixir/clean_html.rb +7 −22
  8. lib/docs/filters/elixir/entries.rb +14 −24
  9. lib/docs/filters/qunit/clean_html.rb +1 −1
  10. lib/docs/scrapers/elixir.rb +31 −8
  11. lib/docs/scrapers/fastapi.rb +1 −1
  12. lib/docs/scrapers/laravel.rb +16 −2
  13. lib/docs/scrapers/pandas.rb +23 −0
  14. lib/docs/scrapers/python.rb +3 −3
  15. lib/docs/scrapers/qunit.rb +4 −3
  16. lib/docs/scrapers/rust.rb +1 −1
  17. lib/docs/scrapers/support_tables.rb +1 −1
  18. lib/docs/scrapers/vitest.rb +1 −1
  19. lib/tasks/docs.thor +0 −2
  20. techstack.md +0 −1
  21. techstack.yml +0 −14
.github/workflows/build.yml+1−1
@@ -13,7 +13,7 @@ jobs: · 12 unmodified lines
1313 steps:
1414 - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0
1515 - name: Set up Ruby
16− uses: ruby/setup-ruby@161cd54b698f1fb3ea539faab2e036d409550e3c # v1.187.0
16+ uses: ruby/setup-ruby@50ba3386b050ad5b97a41fcb81240cbee1d1821f # v1.188.0
1717 with:
1818 bundler-cache: true # runs 'bundle install' and caches installed gems automatically
1919 - name: Run tests
.github/workflows/schedule-doc-report.yml+1−1
@@ -11,7 +11,7 @@ jobs: · 10 unmodified lines
1111 steps:
1212 - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0
1313 - name: Set up Ruby
14− uses: ruby/setup-ruby@161cd54b698f1fb3ea539faab2e036d409550e3c # v1.187.0
14+ uses: ruby/setup-ruby@50ba3386b050ad5b97a41fcb81240cbee1d1821f # v1.188.0
1515 with:
1616 bundler-cache: true # runs 'bundle install' and caches installed gems automatically
1717 - name: Generate report
.github/workflows/test.yml+1−1
@@ -11,7 +11,7 @@ jobs: · 10 unmodified lines
1111 steps:
1212 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
1313 - name: Set up Ruby
14− uses: ruby/setup-ruby@161cd54b698f1fb3ea539faab2e036d409550e3c # v1.187.0
14+ uses: ruby/setup-ruby@50ba3386b050ad5b97a41fcb81240cbee1d1821f # v1.188.0
1515 with:
1616 bundler-cache: true # runs 'bundle install' and caches installed gems automatically
1717 - name: Run tests
Gemfile+0−1
@@ -39,7 +39,6 @@ group :development do · 38 unmodified lines
3939 end
4040
4141 group :docs do
42− gem 'net-sftp', require: false
4342 gem 'progress_bar', require: false
4443 gem 'redcarpet'
4544 gem 'tty-pager', require: false
Gemfile.lock+0−4
@@ -57,9 +57,6 @@ GEM · 56 unmodified lines
5757 mustermann (3.0.0)
5858 ruby2_keywords (~> 0.0.1)
5959 mutex_m (0.2.0)
60− net-sftp (4.0.0)
61− net-ssh (>= 5.0.0, < 8.0.0)
62− net-ssh (7.0.1)
6360 newrelic_rpm (8.16.0)
6461 nokogiri (1.16.6)
6562 mini_portile2 (~> 2.8.2)
@@ -159,7 +156,6 @@ DEPENDENCIES · 93 unmodified lines
159156 image_optim
160157 image_optim_pack
161158 minitest
162− net-sftp
163159 newrelic_rpm
164160 nokogiri
165161 progress_bar
docs/file-scrapers.md+4−1
@@ -196,10 +196,13 @@ mv ./usr/share/doc/openjdk-16-jre-headless/api/ docs/openjdk~$VERSION · 195 unmodified lines
196196
197197 ## Pandas
198198
199+From the home directory; `devdocs`, execute below:
200+
199201 ```sh
200−curl https://pandas.pydata.org/docs/pandas.zip | bsdtar --extract --file - --directory=docs/pandas~1
202+curl https://pandas.pydata.org/docs/pandas.zip -o tmp.zip && unzip tmp.zip -d docs/pandas~2 && rm tmp.zip
201203 ```
202204
205+
203206 ## PHP
204207 Click the link under the "Many HTML files" column on https://www.php.net/download-docs.php, extract the tarball, change its name to `php` and put it in `docs/`.
205208
lib/docs/filters/elixir/clean_html.rb+7−22
@@ -2,32 +2,12 @@ module Docs · 1 unmodified line
22 class Elixir
33 class CleanHtmlFilter < Filter
44 def call
5− if current_url.path.start_with?('/getting-started')
6− guide
7− else
8− api
9− end
5+ api
106 doc
117 end
128
13− def guide
14− @doc = at_css('#content article')
15−
16− css('pre > code').each do |node|
17− node.parent.content = node.content
18− end
19−
20− css('div > pre.highlight').each do |node|
21− node.content = node.content
22− node['data-language'] = node.parent['class'][/language-(\w+)/, 1]
23− node.parent.before(node).remove
24− end
25− end
26−
279 def api
28− css('.hover-link', 'footer', ':not(.detail-header) > .view-source').remove
29−
30− css('h1 .settings').remove
10+ css('.top-search').remove
3111
3212 css('.summary').each do |node|
3313 node.name = 'dl'
@@ -65,6 +45,11 @@ module Docs · 31 unmodified lines
6545 end
6646 end
6747
48+ css('h1 a.icon-action[title="View Source"]').each do |node|
49+ node['class'] = 'source'
50+ node.content = "Source"
51+ end
52+
6853 css('pre').each do |node|
6954 node['data-language'] = 'elixir'
7055 node.content = node.content
lib/docs/filters/elixir/entries.rb+14−24
@@ -3,25 +3,21 @@ module Docs · 2 unmodified lines
33 class EntriesFilter < Docs::EntriesFilter
44 def get_name
55 css('h1 .app-vsn').remove
6− name = (at_css('h1 > span') or at_css('h1')).content.strip
7−
8− if current_url.path.start_with?('/getting-started')
9− name.remove(/\.\z/)
10− else
11− name = name.split(' ').first unless name.start_with?('mix ') # ecto
12− name
13− end
6+ (at_css('h1 > span') or at_css('h1')).content.strip
147 end
158
169 def get_type
17− if current_url.path.start_with?('/getting-started')
18− if subpath.start_with?('mix-otp')
19− 'Guide: Mix & OTP'
20− elsif subpath.start_with?('meta')
21− 'Guide: Metaprogramming'
22− else
23− 'Guide'
24− end
10+ section = at_css('h1 a.source').attr('href').match('elixir/pages/([^/]+)/')&.captures&.first
11+ if section == "mix-and-otp"
12+ return "Mix & OTP"
13+ elsif section
14+ return section.gsub("-", " ").capitalize
15+ end
16+
17+ name = at_css('h1 span').text
18+ case name.split(' ').first
19+ when 'mix' then 'Mix Tasks'
20+ when 'Changelog' then 'References'
2521 else
2622 case at_css('h1 small').try(:content)
2723 when 'exception'
@@ -29,19 +25,13 @@ module Docs · 1 unmodified line
2925 when 'protocol'
3026 'Protocols'
3127 else
32− if name.start_with?('Phoenix')
33− name.split('.')[0..2].join('.')
34− elsif name.start_with?('mix ')
35− 'Mix Tasks'
36− else
37− name.split('.').first
38− end
28+ name
3929 end
4030 end
4131 end
4232
4333 def additional_entries
44− return [] if type == 'Exceptions' || type == 'Guide' || root_page?
34+ return [] if root_page?
4535
4636 css('.detail-header').map do |node|
4737 id = node['id']
lib/docs/filters/qunit/clean_html.rb+1−1
@@ -4,7 +4,7 @@ module Docs · 3 unmodified lines
44 class Qunit
55 class CleanHtmlFilter < Filter
66 def call
7− @doc = at_css('.content[role="main"]')
7+ @doc = at_css('.content[role="main"] > article')
88 css('.sidebar').remove
99 css('pre').each do |node|
1010 node['data-language'] = 'javascript'
lib/docs/scrapers/elixir.rb+31−8
@@ -4,7 +4,7 @@ module Docs · 3 unmodified lines
44
55 self.name = 'Elixir'
66 self.type = 'elixir'
7− self.root_path = 'api-reference.html'
7+ self.root_path = 'introduction.html'
88 self.links = {
99 home: 'https://elixir-lang.org/',
1010 code: 'https://github.com/elixir-lang/elixir'
@@ -12,27 +12,50 @@ module Docs · 1 unmodified line
1212
1313 html_filters.push 'elixir/clean_html', 'elixir/entries', 'title'
1414
15− options[:container] = ->(filter) {
16− filter.current_url.path.start_with?('/getting-started') ? '#main' : '#content'
17− }
15+ options[:container] = '#content'
1816 options[:title] = false
1917 options[:root_title] = 'Elixir'
2018
2119 options[:attribution] = <<-HTML
22− &copy; 2012 Plataformatec<br>
20+ &copy; 2012-2024 The Elixir Team<br>
2321 Licensed under the Apache License, Version 2.0.
2422 HTML
2523
2624 def initial_urls
27− [ "https://hexdocs.pm/elixir/#{self.class.release}/api-reference.html",
25+ [ "https://hexdocs.pm/elixir/#{self.class.release}/introduction.html",
2826 "https://hexdocs.pm/eex/#{self.class.release}/EEx.html",
2927 "https://hexdocs.pm/ex_unit/#{self.class.release}/ExUnit.html",
3028 "https://hexdocs.pm/iex/#{self.class.release}/IEx.html",
3129 "https://hexdocs.pm/logger/#{self.class.release}/Logger.html",
32− "https://hexdocs.pm/mix/#{self.class.release}/Mix.html",
33− "https://elixir-lang.org/getting-started/introduction.html" ]
30+ "https://hexdocs.pm/mix/#{self.class.release}/Mix.html" ]
31+ end
32+
33+ version '1.17' do
34+ self.release = '1.17.2'
35+ self.base_urls = [
36+ "https://hexdocs.pm/elixir/#{release}/",
37+ "https://hexdocs.pm/eex/#{release}/",
38+ "https://hexdocs.pm/ex_unit/#{release}/",
39+ "https://hexdocs.pm/iex/#{release}/",
40+ "https://hexdocs.pm/logger/#{release}/",
41+ "https://hexdocs.pm/mix/#{release}/"
42+ ]
3443 end
3544
45+ version '1.16' do
46+ self.release = '1.16.3'
47+ self.base_urls = [
48+ "https://hexdocs.pm/elixir/#{release}/",
49+ "https://hexdocs.pm/eex/#{release}/",
50+ "https://hexdocs.pm/ex_unit/#{release}/",
51+ "https://hexdocs.pm/iex/#{release}/",
52+ "https://hexdocs.pm/logger/#{release}/",
53+ "https://hexdocs.pm/mix/#{release}/"
54+ ]
55+ end
56+
57+ # scraping of older versions is no longer supported!
58+
3659 version '1.15' do
3760 self.release = '1.15.4'
3861 self.base_urls = [
lib/docs/scrapers/fastapi.rb+1−1
@@ -2,7 +2,7 @@ module Docs · 1 unmodified line
22 class Fastapi < UrlScraper
33 self.name = 'FastAPI'
44 self.type = 'fastapi'
5− self.release = '0.100.1'
5+ self.release = '0.111.1'
66 self.base_url = 'https://fastapi.tiangolo.com/'
77 self.root_path = '/'
88 self.links = {
lib/docs/scrapers/laravel.rb+16−2
@@ -29,8 +29,22 @@ module Docs · 28 unmodified lines
2929 Laravel is a trademark of Taylor Otwell.
3030 HTML
3131
32+ version '11' do
33+ self.release = '11.11.1'
34+ self.root_path = '/api/11.x/index.html'
35+ self.initial_paths = %w(/docs/11.x/installation /api/11.x/classes.html)
36+
37+ options[:only_patterns] = [%r{\A/api/11\.x/}, %r{\A/docs/11\.x/}]
38+
39+ options[:fix_urls] = ->(url) do
40+ url.sub! %r{11.x/+}, "11.x/"
41+ url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?![1-9]?\d)}, "#{Laravel.base_url}/docs/11.x/"
42+ url
43+ end
44+ end
45+
3246 version '10' do
33− self.release = '10.13.0'
47+ self.release = '10.48.14'
3448 self.root_path = '/api/10.x/index.html'
3549 self.initial_paths = %w(/docs/10.x/installation /api/10.x/classes.html)
3650
@@ -44,7 +58,7 @@ module Docs · 7 unmodified lines
4458 end
4559
4660 version '9' do
47− self.release = '9.52.8'
61+ self.release = '9.52.16'
4862 self.root_path = '/api/9.x/index.html'
4963 self.initial_paths = %w(/docs/9.x/installation /api/9.x/classes.html)
5064
lib/docs/scrapers/pandas.rb+23−0
@@ -16,6 +16,29 @@ module Docs · 15 unmodified lines
1616 Licensed under the 3-clause BSD License.
1717 HTML
1818
19+ version '2' do
20+ self.release = '2.2.2'
21+ self.base_url = "https://pandas.pydata.org/pandas-docs/version/#{self.release}/"
22+
23+ html_filters.push 'pandas/clean_html', 'pandas/entries'
24+
25+ options[:container] = 'main section'
26+
27+ options[:skip_patterns] = [
28+ /development/,
29+ /getting_started/,
30+ /whatsnew/
31+ ]
32+
33+ options[:skip] = [
34+ 'panel.html',
35+ 'pandas.pdf',
36+ 'pandas.zip',
37+ 'ecosystem.html'
38+ ]
39+
40+ end
41+
1942 version '1' do
2043 self.release = '1.5.0'
2144 self.base_url = "https://pandas.pydata.org/pandas-docs/version/#{self.release}/"
lib/docs/scrapers/python.rb+3−3
@@ -1,5 +1,5 @@
11 module Docs
2− class Python < FileScraper
2+ class Python < UrlScraper
33 self.type = 'python'
44 self.root_path = 'index.html'
55 self.links = {
@@ -23,12 +23,12 @@ module Docs · 17 unmodified lines
2323 library/sunau.html)
2424
2525 options[:attribution] = <<-HTML
26− &copy; 2001&ndash;2023 Python Software Foundation<br>
26+ &copy; 2001&ndash;2024 Python Software Foundation<br>
2727 Licensed under the PSF License.
2828 HTML
2929
3030 version '3.12' do
31− self.release = '3.12.1'
31+ self.release = '3.12.4'
3232 self.base_url = "https://docs.python.org/#{self.version}/"
3333
3434 html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html'
lib/docs/scrapers/qunit.rb+4−3
@@ -4,8 +4,8 @@ module Docs · 3 unmodified lines
44 class Qunit < UrlScraper
55 self.name = 'QUnit'
66 self.type = 'qunit'
7− self.release = '2.19.3'
8− self.base_url = 'https://api.qunitjs.com/'
7+ self.release = '2.21.0'
8+ self.base_url = 'https://qunitjs.com/api/'
99 self.root_path = '/'
1010 self.links = {
1111 home: 'https://qunitjs.com/',
@@ -18,13 +18,14 @@ module Docs · 6 unmodified lines
1818
1919 options[:container] = '.main'
2020 options[:skip_patterns] = [
21− /deprecated/,
2221 /^QUnit$/,
2322 /^assert$/,
2423 /^callbacks$/,
2524 /^async$/,
2625 /^config$/,
2726 /^extension$/,
27+ /^deprecated$/,
28+ /^removed$/,
2829 ]
2930
3031 options[:attribution] = <<-HTML
lib/docs/scrapers/rust.rb+1−1
@@ -3,7 +3,7 @@ · 2 unmodified lines
33 module Docs
44 class Rust < UrlScraper
55 self.type = 'rust'
6− self.release = '1.75.0'
6+ self.release = '1.79.0'
77 self.base_url = 'https://doc.rust-lang.org/'
88 self.root_path = 'book/index.html'
99 self.initial_paths = %w(
lib/docs/scrapers/support_tables.rb+1−1
@@ -7,7 +7,7 @@ module Docs · 6 unmodified lines
77 self.name = 'Support Tables'
88 self.slug = 'browser_support_tables'
99 self.type = 'support_tables'
10− self.release = '1.0.30001574'
10+ self.release = '1.0.30001642'
1111 self.base_url = 'https://github.com/Fyrd/caniuse/raw/main/'
1212
1313 # https://github.com/Fyrd/caniuse/blob/main/LICENSE
lib/docs/scrapers/vitest.rb+1−1
@@ -17,7 +17,7 @@ module Docs · 16 unmodified lines
1717 Licensed under the MIT License.
1818 HTML
1919
20− self.release = '1.2.2'
20+ self.release = '2.0.3'
2121 self.base_url = 'https://vitest.dev/'
2222 self.initial_paths = %w(guide/)
2323 html_filters.push 'vitest/entries', 'vite/clean_html'
lib/tasks/docs.thor+0−2
@@ -162,8 +162,6 @@ class DocsCLI < Thor · 161 unmodified lines
162162 option :dryrun, type: :boolean
163163 option :packaged, type: :boolean
164164 def upload(*names)
165− require 'net/sftp'
166−
167165 if options[:packaged]
168166 slugs = Dir[File.join(Docs.store_path, '*.tar.gz')].map { |f| File.basename(f, '.tar.gz') }
169167 docs = find_docs_by_slugs(slugs)
techstack.md+0−1
@@ -159,7 +159,6 @@ Full tech stack [here](/techstack.md) · 158 unmodified lines
159159 |[image_optim](https://rubygems.org/image_optim)|v0.31.3|11/14/22|Paul Sernatinger |MIT|N/A|
160160 |[image_optim_pack](https://rubygems.org/image_optim_pack)|v0.10.1|11/14/22|Paul Sernatinger |MIT|N/A|
161161 |[minitest](https://rubygems.org/minitest)|v5.21.2|01/03/15|Thibaut |MIT|N/A|
162−|[net-sftp](https://rubygems.org/net-sftp)|v4.0.0|11/14/22|Paul Sernatinger |MIT|N/A|
163162 |[newrelic_rpm](https://rubygems.org/newrelic_rpm)|v8.16.0|03/24/18|Thibaut Courouble |Apache-2.0|N/A|
164163 |[nokogiri](https://rubygems.org/nokogiri)|v1.16.0|10/21/18|Thibaut Courouble |MIT|N/A|
165164 |[progress_bar](https://rubygems.org/progress_bar)|v1.3.3|01/26/14|Thibaut |WTFPL|N/A|
techstack.yml+0−14
@@ -268,20 +268,6 @@ tools: · 267 unmodified lines
268268 detection_source: Gemfile
269269 last_updated_by: Thibaut
270270 last_updated_on: 2015-01-03 15:38:22.000000000 Z
271−- name: net-sftp
272− description: A pure Ruby implementation of the SFTP client protocol
273− package_url: https://rubygems.org/net-sftp
274− version: 4.0.0
275− license: MIT
276− open_source: true
277− hosted_saas: false
278− category: Libraries
279− sub_category: RubyGems Packages
280− image_url: https://img.stackshare.io/package/19106/default_92b412aaa5197ea1fc2d70a503018e4186714110.png
281− detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
282− detection_source: Gemfile
283− last_updated_by: Paul Sernatinger
284− last_updated_on: 2022-11-14 14:30:30.000000000 Z
285271 - name: newrelic_rpm
286272 description: New Relic is a performance management system, developed by New Relic,
287273 Inc