History

Merge pull request #2 from snzow/Yton

Yton

Aodhan Bower committed 2 years ago

Commit e7816ab2 parents ccba127 4c7592037 files · +1141 −69Browse files

Unified · Split

37 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.lock +7 −7
  5. README.md +1 −0
  6. assets/javascripts/news.json +9 −1
  7. docs/file-scrapers.md +2 −2
  8. lib/docs/filters/htmx/clean_html.rb +13 −0
  9. lib/docs/filters/htmx/entries.rb +31 −0
  10. lib/docs/filters/nextjs/clean_html.rb +2 −1
  11. lib/docs/filters/nextjs/entries.rb +25 −9
  12. lib/docs/filters/nim/entries.rb +7 −4
  13. lib/docs/filters/openjdk/clean_html_new.rb +1 −0
  14. lib/docs/filters/playwright/clean_html.rb +29 −0
  15. lib/docs/filters/playwright/entries.rb +23 −0
  16. lib/docs/filters/pytorch/entries.rb +89 −31
  17. lib/docs/filters/vitest/entries.rb +2 −0
  18. lib/docs/scrapers/django.rb +5 −0
  19. lib/docs/scrapers/esbuild.rb +1 −1
  20. lib/docs/scrapers/git.rb +2 −2
  21. lib/docs/scrapers/go.rb +1 −1
  22. lib/docs/scrapers/haproxy.rb +5 −0
  23. lib/docs/scrapers/htmx.rb +35 −0
  24. lib/docs/scrapers/kubernetes.rb +22 −2
  25. lib/docs/scrapers/nim.rb +9 −2
  26. lib/docs/scrapers/playwright.rb +27 −0
  27. lib/docs/scrapers/pytorch.rb +3 −5
  28. lib/docs/scrapers/sqlite.rb +1 −1
  29. lib/docs/scrapers/vitest.rb +2 −1
  30. public/icons/docs/htmx/16.png +0 −0
  31. public/icons/docs/htmx/16@2x.png +0 −0
  32. public/icons/docs/htmx/SOURCE +1 −0
  33. public/icons/docs/playwright/16.png +0 −0
  34. public/icons/docs/playwright/16@2x.png +0 −0
  35. public/icons/docs/playwright/SOURCE +1 −0
  36. techstack.md +189 −0
  37. techstack.yml +597 −0
.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@360dc864d5da99d54fcb8e9148c14a84b90d3e88 # v1.165.1
16+ uses: ruby/setup-ruby@22fdc77bf4148f810455b226c90fb81b5cbc00a7 # v1.171.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@360dc864d5da99d54fcb8e9148c14a84b90d3e88 # v1.165.1
14+ uses: ruby/setup-ruby@22fdc77bf4148f810455b226c90fb81b5cbc00a7 # v1.171.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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
1313 - name: Set up Ruby
14− uses: ruby/setup-ruby@360dc864d5da99d54fcb8e9148c14a84b90d3e88 # v1.165.1
14+ uses: ruby/setup-ruby@22fdc77bf4148f810455b226c90fb81b5cbc00a7 # v1.171.0
1515 with:
1616 bundler-cache: true # runs 'bundle install' and caches installed gems automatically
1717 - name: Run tests
Gemfile.lock+7−7
@@ -1,7 +1,7 @@
11 GEM
22 remote: https://rubygems.org/
33 specs:
4− activesupport (7.1.2)
4+ activesupport (7.1.3)
55 base64
66 bigdecimal
77 concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -16,12 +16,12 @@ GEM · 8 unmodified lines
1616 erubi (>= 1.0.0)
1717 rack (>= 0.9.0)
1818 rouge (>= 1.0.0)
19− bigdecimal (3.1.5)
19+ bigdecimal (3.1.6)
2020 browser (5.3.1)
2121 byebug (11.1.3)
2222 chunky_png (1.4.0)
2323 coderay (1.1.3)
24− concurrent-ruby (1.2.2)
24+ concurrent-ruby (1.2.3)
2525 connection_pool (2.4.1)
2626 daemons (1.4.1)
2727 drb (2.2.0)
@@ -30,7 +30,7 @@ GEM · 2 unmodified lines
3030 ethon (0.16.0)
3131 ffi (>= 1.15.0)
3232 eventmachine (1.2.7)
33− execjs (2.8.1)
33+ execjs (2.9.1)
3434 exifr (1.4.0)
3535 ffi (1.15.5)
3636 fspath (3.1.2)
@@ -53,7 +53,7 @@ GEM · 16 unmodified lines
5353 in_threads (1.6.0)
5454 method_source (1.0.0)
5555 mini_portile2 (2.8.5)
56− minitest (5.21.1)
56+ minitest (5.22.2)
5757 multi_json (1.15.0)
5858 mustermann (3.0.0)
5959 ruby2_keywords (~> 0.0.1)
@@ -62,7 +62,7 @@ GEM · 2 unmodified lines
6262 net-ssh (>= 5.0.0, < 8.0.0)
6363 net-ssh (7.0.1)
6464 newrelic_rpm (8.16.0)
65− nokogiri (1.16.0)
65+ nokogiri (1.16.2)
6666 mini_portile2 (~> 2.8.2)
6767 racc (~> 1.4)
6868 options (2.3.2)
@@ -125,7 +125,7 @@ GEM · 56 unmodified lines
125125 strings-ansi (0.2.0)
126126 terminal-table (3.0.2)
127127 unicode-display_width (>= 1.1.1, < 3)
128− terser (1.1.20)
128+ terser (1.2.0)
129129 execjs (>= 0.3.0, < 3)
130130 thin (1.8.2)
131131 daemons (~> 1.0, >= 1.0.9)
README.md+1−0
@@ -176,6 +176,7 @@ Made something cool? Feel free to open a PR to add a new row to this table! You · 175 unmodified lines
176176 | [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) |
177177 | [luckasRanarison/nvim-devdocs](https://github.com/luckasRanarison/nvim-devdocs) | Neovim plugin | ![Latest GitHub commit](https://img.shields.io/github/last-commit/luckasRanarison/nvim-devdocs?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/luckasRanarison/nvim-devdocs?logo=github&label) |
178178 | [toiletbril/dedoc](https://github.com/toiletbril/dedoc) | Terminal based viewer | ![Latest GitHub commit](https://img.shields.io/github/last-commit/toiletbril/dedoc?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/toiletbril/dedoc?logo=github&label) |
179+| [Raycast Devdocs](https://www.raycast.com/pomdtr/devdocs) | Raycast extension | Unavailable | Unavailable |
179180
180181 ## Copyright / License
181182
assets/javascripts/news.json+9−1
@@ -1,8 +1,16 @@
11 [
22 [
3− "2024-01-24",
3+ "2024-02-20",
44 "New documentation: <a href=\"/nextjs/\">Nextjs</a>"
55 ],
6+ [
7+ "2024-01-24",
8+ "New documentation: <a href=\"/playwright/\">Playwright</a>"
9+ ],
10+ [
11+ "2024-01-20",
12+ "New documentation: <a href=\"/htmx/\">htmx</a>"
13+ ],
614 [
715 "2024-01-12",
816 "New documentation: <a href=\"/hammerspoon/\">Hammerspoon</a>"
docs/file-scrapers.md+2−2
@@ -167,8 +167,8 @@ download it, extract it with `dpkg -x $PACKAGE ./` and move `./usr/share/doc/ope · 166 unmodified lines
167167 to `path/to/devdocs/docs/openjdk~$VERSION`
168168
169169 ```sh
170−curl -O http://ftp.at.debian.org/debian/pool/main/o/openjdk-21/openjdk-21-doc_21.0.1+12-3_all.deb
171−tar xf openjdk-21-doc_21.0.1+12-3_all.deb
170+curl -O http://ftp.at.debian.org/debian/pool/main/o/openjdk-21/openjdk-21-doc_21.0.2+13-2_all.deb
171+tar xf openjdk-21-doc_21.0.2+13-2_all.deb
172172 tar xf data.tar.xz
173173 mv ./usr/share/doc/openjdk-21-jre-headless/api/ docs/openjdk~$VERSION
174174 ```
lib/docs/filters/htmx/clean_html.rb+13−0
@@ -0,0 +1,13 @@
1+module Docs
2+ class Htmx
3+ class CleanHtmlFilter < Filter
4+ def call
5+ css('.zola-anchor').remove
6+ doc.prepend_child("<h1>htmx</h1>") if root_page?
7+ css('div:contains("NEWS:")').remove
8+ css('h2:contains("sponsors"), #sponsor-table').remove
9+ doc
10+ end
11+ end
12+ end
13+end
lib/docs/filters/htmx/entries.rb+31−0
@@ -0,0 +1,31 @@
1+module Docs
2+ class Htmx
3+ class EntriesFilter < Docs::EntriesFilter
4+ def get_name
5+ at_css('h1').content
6+ end
7+
8+ def get_type
9+ if slug.start_with?('attributes')
10+ 'Attributes'
11+ elsif slug.start_with?('headers')
12+ 'Headers'
13+ elsif slug.start_with?('events')
14+ 'Events'
15+ elsif slug.start_with?('extensions')
16+ 'Extensions'
17+ else
18+ get_name
19+ end
20+ end
21+
22+ def additional_entries
23+ css('h3[id]:has(code)').each_with_object [] do |node, entries|
24+ name = node.at_css('code').content
25+ id = node['id']
26+ entries << [name, id]
27+ end
28+ end
29+ end
30+ end
31+end
lib/docs/filters/nextjs/clean_html.rb+2−1
@@ -3,9 +3,10 @@ module Docs · 2 unmodified lines
33 class CleanHtmlFilter < Filter
44 def call
55 css('.zola-anchor').remove
6− doc.prepend_child("<h1>NextJS</h1>") if root_page?
6+ doc.prepend_child("<h1>NextJS2</h1>") if root_page?
77 css('div:contains("NEWS:")').remove
88 css('h2:contains("sponsors"), #sponsor-table').remove
9+ css('div.sticky').remove #remove the floating menu
910 doc
1011 end
1112 end
lib/docs/filters/nextjs/entries.rb+25−9
@@ -1,13 +1,29 @@
11 module Docs
2− class Nextjs
3− class EntriesFilter < Docs::EntriesFilter
4− def get_name
5− at_css('h1').content
6− end
2+ class Nextjs
3+ class EntriesFilter < Docs::EntriesFilter
4+ def get_name
5+ name = at_css('h1').content
6+ name.strip!
7+ name
8+ end
79
8− def get_type
9− get_name
10− end
10+ def get_type
11+ if subpath.include?('/architecture')
12+ 'Architecture'
13+ elsif subpath.include?('/community')
14+ 'Community'
15+ elsif subpath.include?('/getting-started')
16+ 'Getting Started'
17+ elsif subpath.include?('/messages')
18+ 'Messages'
19+ elsif subpath.include?('/app')
20+ 'Using App Router'
21+ elsif subpath.include?('/pages')
22+ 'Using Pages Router'
23+ else
24+ get_name
1125 end
26+ end
1227 end
13−end
28+ end
29+end
lib/docs/filters/nim/entries.rb+7−4
@@ -16,8 +16,10 @@ module Docs · 15 unmodified lines
1616 name.remove! ' User Guide'
1717 name.remove! ' User\'s manual'
1818 name.remove! %r{ \-.*}
19+ name.remove! %r{\Asrc/}
20+ name.remove! %r{\Astd/}
1921 name.strip!
20− name
22+ name.split("/").last
2123 end
2224
2325 def get_type
@@ -54,10 +56,11 @@ module Docs · 30 unmodified lines
5456 else
5557
5658 css('.simple-toc-section a, .nested-toc-section a').each do |node|
57− entry_name = node.content
58− entry_name.gsub!(/,.*/, '')
59+ match = /^`(.*)`|^(\w+)/.match(node.content)
60+ entry_name = match[1] || match[2]
61+
5962 entry_id = slug + node['href']
60− entries << [entry_name, entry_id, name]
63+ entries << ["#{entry_name} (#{name})", entry_id, name]
6164 end
6265
6366 end
lib/docs/filters/openjdk/clean_html_new.rb+1−0
@@ -12,6 +12,7 @@ module Docs · 11 unmodified lines
1212 end
1313
1414 css('.header .sub-title', 'hr', '.table-tabs').remove
15+ css('.copy').remove
1516
1617 # fix ul section that contains summaries or tables
1718 css('ul').each do |node|
lib/docs/filters/playwright/clean_html.rb+29−0
@@ -0,0 +1,29 @@
1+module Docs
2+ class Playwright
3+ class CleanHtmlFilter < Filter
4+ def call
5+ @doc = at_css('.markdown')
6+
7+ css('x-search').remove
8+ css('hr').remove
9+ css('font:contains("Added in")').remove
10+ css('.list-anchor').remove
11+
12+ css('.alert').each do |node|
13+ node.name = 'blockquote'
14+ end
15+
16+ css('pre').each do |node|
17+ node.content = node.css('.token-line').map(&:content).join("\n")
18+ node.remove_attribute('style')
19+ node['data-language'] = node.content =~ /\A\s*</ ? 'html' : 'javascript'
20+ node.ancestors('.theme-code-block').first.replace(node)
21+ end
22+
23+ css('*[class]').remove_attribute('class')
24+
25+ doc
26+ end
27+ end
28+ end
29+end
lib/docs/filters/playwright/entries.rb+23−0
@@ -0,0 +1,23 @@
1+module Docs
2+ class Playwright
3+ class EntriesFilter < Docs::EntriesFilter
4+ def get_name
5+ at_css('h1').children.select(&:text?).map(&:content).join.strip
6+ end
7+
8+ def type
9+ type = at_css('.menu__link--active').content
10+ return "#{type}: #{name}" if slug.starts_with?('api/')
11+ type
12+ end
13+
14+ def additional_entries
15+ css('x-search').each_with_object [] do |node, entries|
16+ prev = node.previous_element
17+ prev = prev.previous_element until prev['id']
18+ entries << [node.text, prev['id']]
19+ end
20+ end
21+ end
22+ end
23+end
lib/docs/filters/pytorch/entries.rb+89−31
@@ -1,57 +1,115 @@
11 module Docs
22 class Pytorch
33 class EntriesFilter < Docs::EntriesFilter
4− NAME_REPLACEMENTS = {
5− "Distributed communication package - torch.distributed" => "torch.distributed"
4+ TYPE_REPLACEMENTS = {
5+ "torch.Tensor" => "Tensor",
6+ "torch.nn" => "Neuro Network",
7+ "Probability distributions - torch.distributions" => "Probability Distributions",
8+ "torch" => "Torch",
9+ "Quantization" => "Quantization",
10+ "torch.optim" => "Optimization",
11+ "torch.Storage" => "Storage",
12+ "torch.nn.functional" => "NN Functions",
13+ "torch.cuda" => "CUDA",
14+ "Torch Distributed Elastic" => "Distributed Elastic",
15+ "torch.fx" => "FX",
16+ "TorchScript" => "Torch Script",
17+ "torch.onnx" => "ONNX",
18+ "Distributed communication package - torch.distributed" => "Distributed Communication",
19+ "Automatic differentiation package - torch.autograd" => "Automatic Differentiation",
20+ "torch.linalg" => "Linear Algebra",
21+ "Distributed Checkpoint - torch.distributed.checkpoint" => "Distributed Checkpoint",
22+ "Distributed RPC Framework" => "Distributed RPC",
23+ "torch.special" => "SciPy-like Special",
24+ "torch.package" => "Package",
25+ "torch.backends" => "Backends",
26+ "FullyShardedDataParallel" => "Fully Sharded Data Parallel",
27+ "torch.sparse" => "Sparse Tensors",
28+ "torch.export" => "Traced Graph Export",
29+ "torch.fft" => "Discrete Fourier Transforms",
30+ "torch.utils.data" => "Datasets and Data Loaders",
31+ "torch.monitor" => "Monitor",
32+ "Automatic Mixed Precision package - torch.amp" => "Automatic Mixed Precision",
33+ "torch.utils.tensorboard" => "Tensorboard",
34+ "torch.profiler" => "Profiler",
35+ "torch.mps" => "MPS",
36+ "DDP Communication Hooks" => "DDP Communication Hooks",
37+ "Benchmark Utils - torch.utils.benchmark" => "Benchmark Utils",
38+ "torch.nn.init" => "Parameter Initializations",
39+ "Tensor Parallelism - torch.distributed.tensor.parallel" => "Tensor Parallelism",
40+ "torch.func" => "JAX-like Function Transforms",
41+ "Distributed Optimizers" => "Distributed Optimizers",
42+ "torch.signal" => "SciPy-like Signal",
43+ "torch.futures" => "Miscellaneous",
44+ "torch.utils.cpp_extension" => "Miscellaneous",
45+ "torch.overrides" => "Miscellaneous",
46+ "Generic Join Context Manager" => "Miscellaneous",
47+ "torch.hub" => "Miscellaneous",
48+ "torch.cpu" => "Miscellaneous",
49+ "torch.random" => "Miscellaneous",
50+ "torch.compiler" => "Miscellaneous",
51+ "Pipeline Parallelism" => "Miscellaneous",
52+ "Named Tensors" => "Miscellaneous",
53+ "Multiprocessing package - torch.multiprocessing" => "Miscellaneous",
54+ "torch.utils" => "Miscellaneous",
55+ "torch.library" => "Miscellaneous",
56+ "Tensor Attributes" => "Miscellaneous",
57+ "torch.testing" => "Miscellaneous",
58+ "torch.nested" => "Miscellaneous",
59+ "Understanding CUDA Memory Usage" => "Miscellaneous",
60+ "torch.utils.dlpack" => "Miscellaneous",
61+ "torch.utils.checkpoint" => "Miscellaneous",
62+ "torch.__config__" => "Miscellaneous",
63+ "Type Info" => "Miscellaneous",
64+ "torch.utils.model_zoo" => "Miscellaneous",
65+ "torch.utils.mobile_optimizer" => "Miscellaneous",
66+ "torch._logging" => "Miscellaneous",
67+ "torch.masked" => "Miscellaneous",
68+ "torch.utils.bottleneck" => "Miscellaneous"
669 }
770
8− def get_breadcrumbs()
9− css('.pytorch-breadcrumbs > li').map { |node| node.content.delete_suffix(' >') }
71+ def get_breadcrumbs
72+ css('.pytorch-breadcrumbs > li').map {
73+ |node| node.content.delete_suffix(' >').strip
74+ }.reject { |item| item.nil? || item.empty? }
1075 end
1176
1277 def get_name
13− # The id of the container `div.section` indicates the page type.
14− # If the id starts with `module-`, then it's an API reference,
15− # otherwise it is a note or design doc.
16− section_id = at_css('.section[id], section[id]')['id']
17− if section_id.starts_with? 'module-'
18− section_id.remove('module-')
19− else
20− name = get_breadcrumbs()[1]
21− NAME_REPLACEMENTS.fetch(name, name)
22− end
78+ b = get_breadcrumbs
79+ b[(b[1] == 'torch' ? 2 : 1)..].join('.')
2380 end
2481
2582 def get_type
26− name
83+ t = get_breadcrumbs[1]
84+ TYPE_REPLACEMENTS.fetch(t, t)
2785 end
2886
2987 def include_default_entry?
30− # Only include API references, and ignore notes or design docs
31− !subpath.start_with? 'generated/' and type.start_with? 'torch'
88+ # Only include API entries to simplify and unify the list
89+ return name.start_with?('torch.')
3290 end
3391
3492 def additional_entries
3593 return [] if root_page?
3694
3795 entries = []
38−
39− css('dt').each do |node|
40− name = node['id']
41− if name == self.name or name == nil
96+ css('dl').each do |node|
97+ dt = node.at_css('dt')
98+ if dt == nil
99+ next
100+ end
101+ id = dt['id']
102+ if id == name or id == nil
42103 next
43104 end
44105
45− case node.parent['class']
46− when 'method', 'function'
47− if node.at_css('code').content.starts_with? 'property '
48− # this instance method is a property, so treat it as an attribute
49− entries << [name, node['id']]
50− else
51− entries << [name + '()', node['id']]
52− end
53− when 'class', 'attribute'
54− entries << [name, node['id']]
106+ case node['class']
107+ when 'py method', 'py function'
108+ entries << [id + '()', id]
109+ when 'py class', 'py attribute', 'py property'
110+ entries << [id, id]
111+ when 'footnote brackets', 'field-list simple'
112+ next
55113 end
56114 end
57115
lib/docs/filters/vitest/entries.rb+2−0
@@ -4,12 +4,14 @@ module Docs · 3 unmodified lines
44 def get_name
55 name = at_css('h1').content
66 name.sub! %r{\s*#\s*}, ''
7+ name.sub! %r{\s*\u200B\s*}, ''
78 name
89 end
910
1011 def get_type
1112 name = at_css('h1').content
1213 name.sub! %r{\s*#\s*}, ''
14+ name.sub! %r{\s*\u200B\s*}, ''
1315 name
1416 end
1517
lib/docs/scrapers/django.rb+5−0
@@ -34,6 +34,11 @@ module Docs · 33 unmodified lines
3434 Licensed under the BSD License.
3535 HTML
3636
37+ version '5.0' do
38+ self.release = '5.0'
39+ self.base_url = "https://docs.djangoproject.com/en/#{self.version}/"
40+ end
41+
3742 version '4.2' do
3843 self.release = '4.2'
3944 self.base_url = "https://docs.djangoproject.com/en/#{self.version}/"
lib/docs/scrapers/esbuild.rb+1−1
@@ -16,7 +16,7 @@ module Docs · 15 unmodified lines
1616 Licensed under the MIT License.
1717 HTML
1818
19− self.release = '0.19.11'
19+ self.release = '0.20.0'
2020 self.base_url = 'https://esbuild.github.io/'
2121 html_filters.push 'esbuild/clean_html', 'esbuild/entries'
2222
lib/docs/scrapers/git.rb+2−2
@@ -1,7 +1,7 @@
11 module Docs
22 class Git < UrlScraper
33 self.type = 'git'
4− self.release = '2.42.0'
4+ self.release = '2.43.1'
55 self.base_url = 'https://git-scm.com/docs'
66 self.initial_paths = %w(/git.html)
77 self.links = {
@@ -16,7 +16,7 @@ module Docs · 8 unmodified lines
1616 options[:skip] = %w(/howto-index.html)
1717
1818 options[:attribution] = <<-HTML
19− &copy; 2012&ndash;2023 Scott Chacon and others<br>
19+ &copy; 2012&ndash;2024 Scott Chacon and others<br>
2020 Licensed under the MIT License.
2121 HTML
2222
lib/docs/scrapers/go.rb+1−1
@@ -1,7 +1,7 @@
11 module Docs
22 class Go < UrlScraper
33 self.type = 'go'
4− self.release = '1.21.5'
4+ self.release = '1.22.0'
55 self.base_url = 'https://golang.org/pkg/'
66 self.links = {
77 home: 'https://golang.org/',
lib/docs/scrapers/haproxy.rb+5−0
@@ -20,6 +20,11 @@ module Docs · 19 unmodified lines
2020 Licensed under the GNU General Public License version 2.
2121 HTML
2222
23+ version '2.9' do
24+ self.release = '2.9.0'
25+ self.base_url = "https://docs.haproxy.org/#{self.version}/"
26+ end
27+
2328 version '2.8' do
2429 self.release = '2.8.0'
2530 self.base_url = "https://docs.haproxy.org/#{self.version}/"
lib/docs/scrapers/htmx.rb+35−0
@@ -0,0 +1,35 @@
1+module Docs
2+ class Htmx < UrlScraper
3+ self.name = 'htmx'
4+ self.type = 'simple'
5+ self.slug = 'htmx'
6+ self.links = {
7+ home: 'https://htmx.org/',
8+ code: 'https://github.com/bigskysoftware/htmx'
9+ }
10+ self.release = '1.9.10'
11+ self.base_url = "https://htmx.org/"
12+ self.initial_paths = %w(reference/)
13+
14+ html_filters.push 'htmx/entries', 'htmx/clean_html'
15+
16+ options[:trailing_slash] = true
17+ options[:container] = '.content'
18+ options[:download_images] = false
19+ options[:skip_patterns] = [
20+ /\Aessays/,
21+ /\Aexamples/,
22+ /\Amigration-guide/,
23+ /\Aposts/,
24+ ]
25+
26+ # https://github.com/bigskysoftware/htmx/blob/master/LICENSE
27+ options[:attribution] = <<-HTML
28+ Licensed under the Zero-Clause BSD License.
29+ HTML
30+
31+ def get_latest_version(opts)
32+ get_npm_version('htmx.org', opts)
33+ end
34+ end
35+end
lib/docs/scrapers/kubernetes.rb+22−2
@@ -20,15 +20,35 @@ module Docs · 19 unmodified lines
2020
2121 # latest version has a special URL that does not include the version identifier
2222 version do
23− self.release = "1.26"
23+ self.release = "1.29"
2424 self.base_url = "https://kubernetes.io/docs/reference/kubernetes-api/"
2525 end
2626
27− version '1.20' do
27+ version '1.28' do
2828 self.release = "#{version}"
2929 self.base_url = "https://v#{version.sub('.', '-')}.docs.kubernetes.io/docs/reference/kubernetes-api/"
3030 end
3131
32+ version '1.27' do
33+ self.release = "#{version}"
34+ self.base_url = "https://v#{version.sub('.', '-')}.docs.kubernetes.io/docs/reference/kubernetes-api/"
35+ end
36+
37+ version '1.26' do
38+ self.release = "#{version}"
39+ self.base_url = "https://v#{version.sub('.', '-')}.docs.kubernetes.io/docs/reference/kubernetes-api/"
40+ end
41+
42+ version '1.25' do
43+ self.release = "#{version}"
44+ self.base_url = "https://v#{version.sub('.', '-')}.docs.kubernetes.io/docs/reference/kubernetes-api/"
45+ end
46+
47+ version '1.24' do
48+ self.release = "#{version}"
49+ self.base_url = "https://v#{version.sub('.', '-')}.docs.kubernetes.io/docs/reference/kubernetes-api/"
50+ end
51+
3252 def get_latest_version(opts)
3353 get_latest_github_release('kubernetes', 'kubernetes', opts)
3454 end
lib/docs/scrapers/nim.rb+9−2
@@ -1,7 +1,6 @@
11 module Docs
22 class Nim < UrlScraper
33 self.type = 'simple'
4− self.release = '1.4.8'
54 self.base_url = 'https://nim-lang.org/docs/'
65 self.root_path = 'overview.html'
76 self.links = {
@@ -14,10 +13,18 @@ module Docs · 6 unmodified lines
1413 options[:skip] = %w(theindex.html docgen.html tut1.html tut2.html tut3.html tools.html)
1514
1615 options[:attribution] = <<-HTML
17− &copy; 2006&ndash;2021 Andreas Rumpf<br>
16+ &copy; 2006&ndash;2024 Andreas Rumpf<br>
1817 Licensed under the MIT License.
1918 HTML
2019
20+ version do
21+ self.release = '2.0.2'
22+ end
23+
24+ version '1' do
25+ self.release = '1.4.8'
26+ end
27+
2128 def get_latest_version(opts)
2229 doc = fetch_doc('https://nim-lang.org/docs/overview.html', opts)
2330 doc.at_css('.container > .docinfo > tbody > tr:last-child > td').content.strip
lib/docs/scrapers/playwright.rb+27−0
@@ -0,0 +1,27 @@
1+module Docs
2+ class Playwright < UrlScraper
3+ self.name = 'Playwright'
4+ self.type = 'simple'
5+ self.release = '1.41.1'
6+ self.base_url = 'https://playwright.dev/docs/'
7+ self.root_path = 'intro'
8+ self.links = {
9+ home: 'https://playwright.dev/',
10+ code: 'https://github.com/microsoft/playwright'
11+ }
12+
13+ # Docusaurus like react_native
14+ html_filters.push 'playwright/entries', 'playwright/clean_html'
15+ options[:download_images] = false
16+
17+ # https://github.com/microsoft/playwright/blob/main/LICENSE
18+ options[:attribution] = <<-HTML
19+ &copy; 2024 Microsoft<br>
20+ Licensed under the Apache License, Version 2.0.
21+ HTML
22+
23+ def get_latest_version(opts)
24+ get_npm_version('@playwright/test', opts)
25+ end
26+ end
27+end
lib/docs/scrapers/pytorch.rb+3−5
@@ -3,7 +3,6 @@ module Docs · 2 unmodified lines
33 self.name = 'PyTorch'
44 self.slug = 'pytorch'
55 self.type = 'sphinx'
6− self.force_gzip = true
76 self.links = {
87 home: 'https://pytorch.org/',
98 code: 'https://github.com/pytorch/pytorch'
@@ -11,13 +10,12 @@ module Docs · 1 unmodified line
1110
1211 html_filters.push 'pytorch/entries', 'pytorch/clean_html', 'sphinx/clean_html'
1312
14− options[:skip] = ['cpp_index.html', 'packages.html', 'py-modindex.html', 'genindex.html']
13+ options[:skip] = ['cpp_index.html', 'deploy.html', 'packages.html', 'py-modindex.html', 'genindex.html']
1514 options[:skip_patterns] = [/\Acommunity/, /\A_modules/, /\Anotes/, /\Aorg\/pytorch\//]
16− options[:max_image_size] = 256_000
1715
1816 options[:attribution] = <<-HTML
19− &copy; 2019-2024 Torch Contributors<br>
20− Licensed under the 3-clause BSD License.
17+ &copy; 2024, PyTorch Contributors<br>
18+ PyTorch has a BSD-style license, as found in the <a href="https://github.com/pytorch/pytorch/blob/main/LICENSE">LICENSE</a> file.
2119 HTML
2220
2321 version '2' do
lib/docs/scrapers/sqlite.rb+1−1
@@ -2,7 +2,7 @@ module Docs · 1 unmodified line
22 class Sqlite < UrlScraper
33 self.name = 'SQLite'
44 self.type = 'sqlite'
5− self.release = '3.44.2'
5+ self.release = '3.45.1'
66 self.base_url = 'https://sqlite.org/'
77 self.root_path = 'docs.html'
88 self.initial_paths = %w(keyword_index.html)
lib/docs/scrapers/vitest.rb+2−1
@@ -9,6 +9,7 @@ module Docs · 8 unmodified lines
99 }
1010
1111 options[:root_title] = 'Vitest'
12+ options[:download_images] = false
1213
1314 options[:attribution] = <<-HTML
1415 &copy; 2021-Present Anthony Fu<br>
@@ -16,7 +17,7 @@ module Docs · 1 unmodified line
1617 Licensed under the MIT License.
1718 HTML
1819
19− self.release = '1.1.3'
20+ self.release = '1.2.2'
2021 self.base_url = 'https://vitest.dev/'
2122 self.initial_paths = %w(guide/)
2223 html_filters.push 'vitest/entries', 'vite/clean_html'
public/icons/docs/htmx/16.png+0−0

Binary file not shown.

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

Binary file not shown.

public/icons/docs/htmx/SOURCE+1−0
@@ -0,0 +1 @@
1+https://github.com/bigskysoftware/htmx/blob/v1.9.10/www/static/img/htmx_logo.2.png
public/icons/docs/playwright/16.png+0−0

Binary file not shown.

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

Binary file not shown.

public/icons/docs/playwright/SOURCE+1−0
@@ -0,0 +1 @@
1+https://playwright.dev/img/playwright-logo.svg
techstack.md+189−0
@@ -0,0 +1,189 @@
1+<!--
2+&lt;--- Readme.md Snippet without images Start ---&gt;
3+## Tech Stack
4+freeCodeCamp/devdocs is built on the following main stack:
5+
6+- [New Relic](http://newrelic.com) – Performance Monitoring
7+- [Ruby](https://www.ruby-lang.org) – Languages
8+- [Sinatra](http://www.sinatrarb.com/) – Microframeworks (Backend)
9+- [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript) – Languages
10+- [Capybara](http://jnicklas.github.io/capybara/) – Testing Frameworks
11+- [GitHub Actions](https://github.com/features/actions) – Continuous Integration
12+- [Docker](https://www.docker.com/) – Virtual Machine Platforms & Containers
13+
14+Full tech stack [here](/techstack.md)
15+
16+&lt;--- Readme.md Snippet without images End ---&gt;
17+
18+&lt;--- Readme.md Snippet with images Start ---&gt;
19+## Tech Stack
20+freeCodeCamp/devdocs is built on the following main stack:
21+
22+- <img width='25' height='25' src='https://img.stackshare.io/service/103/default_193410db3a7e419c7b436961bf41d733c7346b59.png' alt='New Relic'/> [New Relic](http://newrelic.com) – Performance Monitoring
23+- <img width='25' height='25' src='https://img.stackshare.io/service/989/ruby.png' alt='Ruby'/> [Ruby](https://www.ruby-lang.org) – Languages
24+- <img width='25' height='25' src='https://img.stackshare.io/service/999/logo.png' alt='Sinatra'/> [Sinatra](http://www.sinatrarb.com/) – Microframeworks (Backend)
25+- <img width='25' height='25' src='https://img.stackshare.io/service/1209/javascript.jpeg' alt='JavaScript'/> [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript) – Languages
26+- <img width='25' height='25' src='https://img.stackshare.io/service/2595/capybara.png' alt='Capybara'/> [Capybara](http://jnicklas.github.io/capybara/) – Testing Frameworks
27+- <img width='25' height='25' src='https://img.stackshare.io/service/11563/actions.png' alt='GitHub Actions'/> [GitHub Actions](https://github.com/features/actions) – Continuous Integration
28+- <img width='25' height='25' src='https://img.stackshare.io/service/586/n4u37v9t_400x400.png' alt='Docker'/> [Docker](https://www.docker.com/) – Virtual Machine Platforms & Containers
29+
30+Full tech stack [here](/techstack.md)
31+
32+&lt;--- Readme.md Snippet with images End ---&gt;
33+-->
34+<div align="center">
35+
36+# Tech Stack File
37+![](https://img.stackshare.io/repo.svg "repo") [freeCodeCamp/devdocs](https://github.com/freeCodeCamp/devdocs)![](https://img.stackshare.io/public_badge.svg "public")
38+<br/><br/>
39+|43<br/>Tools used|01/27/24 <br/>Report generated|
40+|------|------|
41+</div>
42+
43+## <img src='https://img.stackshare.io/languages.svg'/> Languages (3)
44+<table><tr>
45+ <td align='center'>
46+ <img width='36' height='36' src='https://img.stackshare.io/service/6727/css.png' alt='CSS 3'>
47+ <br>
48+ <sub><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS3">CSS 3</a></sub>
49+ <br>
50+ <sub></sub>
51+</td>
52+
53+<td align='center'>
54+ <img width='36' height='36' src='https://img.stackshare.io/service/1209/javascript.jpeg' alt='JavaScript'>
55+ <br>
56+ <sub><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript">JavaScript</a></sub>
57+ <br>
58+ <sub></sub>
59+</td>
60+
61+<td align='center'>
62+ <img width='36' height='36' src='https://img.stackshare.io/service/989/ruby.png' alt='Ruby'>
63+ <br>
64+ <sub><a href="https://www.ruby-lang.org">Ruby</a></sub>
65+ <br>
66+ <sub>v3.3.0</sub>
67+</td>
68+
69+</tr>
70+</table>
71+
72+## <img src='https://img.stackshare.io/frameworks.svg'/> Frameworks (1)
73+<table><tr>
74+ <td align='center'>
75+ <img width='36' height='36' src='https://img.stackshare.io/service/999/logo.png' alt='Sinatra'>
76+ <br>
77+ <sub><a href="http://www.sinatrarb.com/">Sinatra</a></sub>
78+ <br>
79+ <sub></sub>
80+</td>
81+
82+</tr>
83+</table>
84+
85+## <img src='https://img.stackshare.io/devops.svg'/> DevOps (7)
86+<table><tr>
87+ <td align='center'>
88+ <img width='36' height='36' src='https://img.stackshare.io/service/2595/capybara.png' alt='Capybara'>
89+ <br>
90+ <sub><a href="http://jnicklas.github.io/capybara/">Capybara</a></sub>
91+ <br>
92+ <sub></sub>
93+</td>
94+
95+<td align='center'>
96+ <img width='36' height='36' src='https://img.stackshare.io/service/586/n4u37v9t_400x400.png' alt='Docker'>
97+ <br>
98+ <sub><a href="https://www.docker.com/">Docker</a></sub>
99+ <br>
100+ <sub></sub>
101+</td>
102+
103+<td align='center'>
104+ <img width='36' height='36' src='https://img.stackshare.io/service/1046/git.png' alt='Git'>
105+ <br>
106+ <sub><a href="http://git-scm.com/">Git</a></sub>
107+ <br>
108+ <sub></sub>
109+</td>
110+
111+<td align='center'>
112+ <img width='36' height='36' src='https://img.stackshare.io/service/11563/actions.png' alt='GitHub Actions'>
113+ <br>
114+ <sub><a href="https://github.com/features/actions">GitHub Actions</a></sub>
115+ <br>
116+ <sub></sub>
117+</td>
118+
119+<td align='center'>
120+ <img width='36' height='36' src='https://img.stackshare.io/service/103/default_193410db3a7e419c7b436961bf41d733c7346b59.png' alt='New Relic'>
121+ <br>
122+ <sub><a href="http://newrelic.com">New Relic</a></sub>
123+ <br>
124+ <sub></sub>
125+</td>
126+
127+<td align='center'>
128+ <img width='36' height='36' src='https://img.stackshare.io/service/12795/5jL6-BA5_400x400.jpeg' alt='RubyGems'>
129+ <br>
130+ <sub><a href="https://rubygems.org/">RubyGems</a></sub>
131+ <br>
132+ <sub></sub>
133+</td>
134+
135+<td align='center'>
136+ <img width='36' height='36' src='https://img.stackshare.io/service/1120/lejvzrnlpb308aftn31u.png' alt='npm'>
137+ <br>
138+ <sub><a href="https://www.npmjs.com/">npm</a></sub>
139+ <br>
140+ <sub></sub>
141+</td>
142+
143+</tr>
144+</table>
145+
146+
147+## <img src='https://img.stackshare.io/group.svg' /> Open source packages (32)</h2>
148+
149+## <img width='24' height='24' src='https://img.stackshare.io/service/12795/5jL6-BA5_400x400.jpeg'/> RubyGems (32)
150+
151+|NAME|VERSION|LAST UPDATED|LAST UPDATED BY|LICENSE|VULNERABILITIES|
152+|:------|:------|:------|:------|:------|:------|
153+|[activesupport](https://rubygems.org/activesupport)|v7.1.3|11/14/22|Paul Sernatinger |MIT|N/A|
154+|[better_errors](https://rubygems.org/better_errors)|v2.10.1|10/24/13|Thibaut |MIT|N/A|
155+|[browser](https://rubygems.org/browser)|v5.3.1|11/14/22|Paul Sernatinger |MIT|N/A|
156+|[chunky_png](https://rubygems.org/chunky_png)|v1.4.0|11/14/22|Paul Sernatinger |MIT|N/A|
157+|[erubi](https://rubygems.org/erubi)|v1.12.0|11/14/22|Paul Sernatinger |MIT|N/A|
158+|[html-pipeline](https://rubygems.org/html-pipeline)|v2.14.3|10/21/18|Thibaut Courouble |MIT|N/A|
159+|[image_optim](https://rubygems.org/image_optim)|v0.31.3|11/14/22|Paul Sernatinger |MIT|N/A|
160+|[image_optim_pack](https://rubygems.org/image_optim_pack)|v0.10.1|11/14/22|Paul Sernatinger |MIT|N/A|
161+|[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|
163+|[newrelic_rpm](https://rubygems.org/newrelic_rpm)|v8.16.0|03/24/18|Thibaut Courouble |Apache-2.0|N/A|
164+|[nokogiri](https://rubygems.org/nokogiri)|v1.16.0|10/21/18|Thibaut Courouble |MIT|N/A|
165+|[progress_bar](https://rubygems.org/progress_bar)|v1.3.3|01/26/14|Thibaut |WTFPL|N/A|
166+|[pry-byebug](https://rubygems.org/pry-byebug)|v3.10.1|11/14/22|Paul Sernatinger |MIT|N/A|
167+|[rack](https://rubygems.org/rack)|v2.2.8|11/14/22|Paul Sernatinger |MIT|N/A|
168+|[rack-ssl-enforcer](https://rubygems.org/rack-ssl-enforcer)|v0.2.9|11/14/22|Paul Sernatinger |MIT|N/A|
169+|[rack-test](https://rubygems.org/rack-test)|v2.1.0|11/14/22|Paul Sernatinger |MIT|N/A|
170+|[rake](https://rubygems.org/rake)|v13.1.0|11/14/22|Paul Sernatinger |MIT|N/A|
171+|[redcarpet](https://rubygems.org/redcarpet)|v3.6.0|11/14/22|Paul Sernatinger |MIT|N/A|
172+|[rr](https://rubygems.org/rr)|v3.1.0|10/24/13|Thibaut |MIT|N/A|
173+|[sass](https://rubygems.org/sass)|v3.7.4|01/13/24|Simon Legner |MIT|N/A|
174+|[selenium-webdriver](https://rubygems.org/selenium-webdriver)|N/A|01/26/14|Thibaut |Apache-2.0|N/A|
175+|[sinatra-contrib](https://rubygems.org/sinatra-contrib)|v3.2.0|11/14/22|Paul Sernatinger |MIT|N/A|
176+|[sprockets](https://rubygems.org/sprockets)|v3.7.2|01/13/24|Simon Legner |MIT|N/A|
177+|[sprockets-helpers](https://rubygems.org/sprockets-helpers)|v1.4.0|01/13/24|Simon Legner |MIT|N/A|
178+|[sprockets-sass](https://rubygems.org/sprockets-sass)|N/A|01/13/24|Simon Legner |MIT|N/A|
179+|[terminal-table](https://rubygems.org/terminal-table)|v3.0.2|10/11/19|Jasper van Merle |MIT|N/A|
180+|[thin](https://rubygems.org/thin)|v1.8.2|11/14/22|Paul Sernatinger |GPL-2.0+,Ruby|N/A|
181+|[thor](https://rubygems.org/thor)|v1.3.0|11/14/22|Paul Sernatinger |MIT|N/A|
182+|[tty-pager](https://rubygems.org/tty-pager)|v0.14.0|01/24/16|Thibaut Courouble |MIT|N/A|
183+|[typhoeus](https://rubygems.org/typhoeus)|v1.4.1|11/14/22|Paul Sernatinger |MIT|N/A|
184+|[yajl-ruby](https://rubygems.org/yajl-ruby)|v1.4.3|01/09/24|Nicholas La Roux |MIT|N/A|
185+
186+<br/>
187+<div align='center'>
188+
189+Generated via [Stack File](https://github.com/marketplace/stack-file)
techstack.yml+597−0
@@ -0,0 +1,597 @@
1+repo_name: freeCodeCamp/devdocs
2+report_id: 281e8991a46b88702952b7b18dd5e2b0
3+version: 0.1
4+repo_type: Public
5+timestamp: '2024-01-27T03:50:22+00:00'
6+requested_by: renovate[bot]
7+provider: github
8+branch: main
9+detected_tools_count: 43
10+tools:
11+- name: CSS 3
12+ description: The latest evolution of the Cascading Style Sheets language
13+ website_url: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS3
14+ open_source: true
15+ hosted_saas: false
16+ category: Languages & Frameworks
17+ sub_category: Languages
18+ image_url: https://img.stackshare.io/service/6727/css.png
19+ detection_source_url: https://github.com/freeCodeCamp/devdocs
20+ detection_source: Repo Metadata
21+- name: JavaScript
22+ description: Lightweight, interpreted, object-oriented language with first-class
23+ functions
24+ website_url: https://developer.mozilla.org/en-US/docs/Web/JavaScript
25+ open_source: true
26+ hosted_saas: false
27+ category: Languages & Frameworks
28+ sub_category: Languages
29+ image_url: https://img.stackshare.io/service/1209/javascript.jpeg
30+ detection_source_url: https://github.com/freeCodeCamp/devdocs
31+ detection_source: Repo Metadata
32+- name: Ruby
33+ description: A dynamic, interpreted, open source programming language with a focus
34+ on simplicity and productivity
35+ website_url: https://www.ruby-lang.org
36+ version: 3.3.0
37+ open_source: true
38+ hosted_saas: false
39+ category: Languages & Frameworks
40+ sub_category: Languages
41+ image_url: https://img.stackshare.io/service/989/ruby.png
42+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
43+ detection_source: Repo Metadata
44+ last_updated_by: Thibaut
45+ last_updated_on: 2013-10-24 18:25:52.000000000 Z
46+- name: Sinatra
47+ description: Classy web-development dressed in a DSL
48+ website_url: http://www.sinatrarb.com/
49+ license: MIT
50+ open_source: true
51+ hosted_saas: false
52+ category: Languages & Frameworks
53+ sub_category: Microframeworks (Backend)
54+ image_url: https://img.stackshare.io/service/999/logo.png
55+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile
56+ detection_source: Gemfile
57+ last_updated_by: Paul Sernatinger
58+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
59+- name: Capybara
60+ description: Acceptance test framework for web applications
61+ website_url: http://jnicklas.github.io/capybara/
62+ license: MIT
63+ open_source: true
64+ hosted_saas: false
65+ category: Build, Test, Deploy
66+ sub_category: Testing Frameworks
67+ image_url: https://img.stackshare.io/service/2595/capybara.png
68+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile
69+ detection_source: Gemfile
70+ last_updated_by: Thibaut
71+ last_updated_on: 2014-01-26 21:01:54.000000000 Z
72+- name: Docker
73+ description: Enterprise Container Platform for High-Velocity Innovation.
74+ website_url: https://www.docker.com/
75+ license: Apache-2.0
76+ open_source: true
77+ hosted_saas: false
78+ category: Build, Test, Deploy
79+ sub_category: Virtual Machine Platforms & Containers
80+ image_url: https://img.stackshare.io/service/586/n4u37v9t_400x400.png
81+ detection_source_url: https://github.com/freeCodeCamp/devdocs
82+ detection_source: Repo Metadata
83+- name: Git
84+ description: Fast, scalable, distributed revision control system
85+ website_url: http://git-scm.com/
86+ open_source: true
87+ hosted_saas: false
88+ category: Build, Test, Deploy
89+ sub_category: Version Control System
90+ image_url: https://img.stackshare.io/service/1046/git.png
91+ detection_source_url: https://github.com/freeCodeCamp/devdocs
92+ detection_source: Repo Metadata
93+- name: GitHub Actions
94+ description: Automate your workflow from idea to production
95+ website_url: https://github.com/features/actions
96+ open_source: false
97+ hosted_saas: true
98+ category: Build, Test, Deploy
99+ sub_category: Continuous Integration
100+ image_url: https://img.stackshare.io/service/11563/actions.png
101+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/.github/workflows/build.yml
102+ detection_source: ".github/workflows/build.yml"
103+ last_updated_by: renovate[bot]
104+ last_updated_on: 2023-03-25 01:01:01.000000000 Z
105+- name: New Relic
106+ description: New Relic is the industry’s largest and most comprehensive cloud-based
107+ observability platform.
108+ website_url: http://newrelic.com
109+ open_source: false
110+ hosted_saas: true
111+ category: Monitoring
112+ sub_category: Performance Monitoring
113+ image_url: https://img.stackshare.io/service/103/default_193410db3a7e419c7b436961bf41d733c7346b59.png
114+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile
115+ detection_source: Gemfile
116+ last_updated_by: Thibaut Courouble
117+ last_updated_on: 2018-03-24 19:06:19.000000000 Z
118+- name: RubyGems
119+ description: Easily download, install, and use ruby software packages on your system
120+ website_url: https://rubygems.org/
121+ open_source: false
122+ hosted_saas: false
123+ category: Build, Test, Deploy
124+ sub_category: Package Managers
125+ image_url: https://img.stackshare.io/service/12795/5jL6-BA5_400x400.jpeg
126+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile
127+ detection_source: Gemfile
128+ last_updated_by: Thibaut
129+ last_updated_on: 2013-10-24 18:25:52.000000000 Z
130+- name: npm
131+ description: The package manager for JavaScript.
132+ website_url: https://www.npmjs.com/
133+ open_source: false
134+ hosted_saas: false
135+ category: Build, Test, Deploy
136+ sub_category: Front End Package Manager
137+ image_url: https://img.stackshare.io/service/1120/lejvzrnlpb308aftn31u.png
138+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile
139+ detection_source: Gemfile
140+ last_updated_by: Thibaut
141+ last_updated_on: 2013-10-24 18:25:52.000000000 Z
142+- name: activesupport
143+ description: A toolkit of support libraries and Ruby core extensions extracted from
144+ the Rails framework
145+ package_url: https://rubygems.org/activesupport
146+ version: 7.1.3
147+ license: MIT
148+ open_source: true
149+ hosted_saas: false
150+ category: Libraries
151+ sub_category: RubyGems Packages
152+ image_url: https://img.stackshare.io/package/18817/default_b17f14dbef6c1275120b34d9ec2eff5942499bd5.png
153+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
154+ detection_source: Gemfile
155+ last_updated_by: Paul Sernatinger
156+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
157+- name: better_errors
158+ description: Provides a better error page for Rails and other Rack apps
159+ package_url: https://rubygems.org/better_errors
160+ version: 2.10.1
161+ license: MIT
162+ open_source: true
163+ hosted_saas: false
164+ category: Libraries
165+ sub_category: RubyGems Packages
166+ image_url: https://img.stackshare.io/package/19224/default_90da4313847baa579409c050c1ebb8de5a6e0fbc.png
167+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
168+ detection_source: Gemfile
169+ last_updated_by: Thibaut
170+ last_updated_on: 2013-10-24 18:25:52.000000000 Z
171+- name: browser
172+ description: Do some browser detection with Ruby
173+ package_url: https://rubygems.org/browser
174+ version: 5.3.1
175+ license: MIT
176+ open_source: true
177+ hosted_saas: false
178+ category: Libraries
179+ sub_category: RubyGems Packages
180+ image_url: https://img.stackshare.io/package/19740/default_dd31b4f280886d69f8a43459d55ecc7f1ae44486.png
181+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
182+ detection_source: Gemfile
183+ last_updated_by: Paul Sernatinger
184+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
185+- name: chunky_png
186+ description: This pure Ruby library can read and write PNG images without depending
187+ on an external image library, like RMagick
188+ package_url: https://rubygems.org/chunky_png
189+ version: 1.4.0
190+ license: MIT
191+ open_source: true
192+ hosted_saas: false
193+ category: Libraries
194+ sub_category: RubyGems Packages
195+ image_url: https://img.stackshare.io/package/19118/default_ab0024f54be625eb1e21abc015158fc74b2e3704.png
196+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
197+ detection_source: Gemfile
198+ last_updated_by: Paul Sernatinger
199+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
200+- name: erubi
201+ description: Erubi is a ERB template engine for ruby
202+ package_url: https://rubygems.org/erubi
203+ version: 1.12.0
204+ license: MIT
205+ open_source: true
206+ hosted_saas: false
207+ category: Libraries
208+ sub_category: RubyGems Packages
209+ image_url: https://img.stackshare.io/package/rubygems/image.png
210+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
211+ detection_source: Gemfile
212+ last_updated_by: Paul Sernatinger
213+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
214+- name: html-pipeline
215+ description: GitHub HTML processing filters and utilities
216+ package_url: https://rubygems.org/html-pipeline
217+ version: 2.14.3
218+ license: MIT
219+ open_source: true
220+ hosted_saas: false
221+ category: Libraries
222+ sub_category: RubyGems Packages
223+ image_url: https://img.stackshare.io/package/19386/default_b0770ebdd12e1eb479a98261d0175b1714524f87.png
224+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
225+ detection_source: Gemfile
226+ last_updated_by: Thibaut Courouble
227+ last_updated_on: 2018-10-21 22:41:35.000000000 Z
228+- name: image_optim
229+ description: Command line tool and ruby interface to optimize
230+ package_url: https://rubygems.org/image_optim
231+ version: 0.31.3
232+ license: MIT
233+ open_source: true
234+ hosted_saas: false
235+ category: Libraries
236+ sub_category: RubyGems Packages
237+ image_url: https://img.stackshare.io/package/19798/default_5acb201e8340ca5b337b8c46c2fcaff7aa0db0ec.png
238+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
239+ detection_source: Gemfile
240+ last_updated_by: Paul Sernatinger
241+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
242+- name: image_optim_pack
243+ description: 'Precompiled binaries for image_optim: advpng'
244+ package_url: https://rubygems.org/image_optim_pack
245+ version: 0.10.1
246+ license: MIT
247+ open_source: true
248+ hosted_saas: false
249+ category: Libraries
250+ sub_category: RubyGems Packages
251+ image_url: https://img.stackshare.io/package/rubygems/image.png
252+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
253+ detection_source: Gemfile
254+ last_updated_by: Paul Sernatinger
255+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
256+- name: minitest
257+ description: Minitest provides a complete suite of testing facilities supporting
258+ TDD, BDD, mocking, and benchmarking
259+ package_url: https://rubygems.org/minitest
260+ version: 5.21.2
261+ license: MIT
262+ open_source: true
263+ hosted_saas: false
264+ category: Libraries
265+ sub_category: RubyGems Packages
266+ image_url: https://img.stackshare.io/package/18818/default_f36df1cfa9ff6061d7f9b4879088be8538581c49.png
267+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
268+ detection_source: Gemfile
269+ last_updated_by: Thibaut
270+ 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
285+- name: newrelic_rpm
286+ description: New Relic is a performance management system, developed by New Relic,
287+ Inc
288+ package_url: https://rubygems.org/newrelic_rpm
289+ version: 8.16.0
290+ license: Apache-2.0
291+ open_source: true
292+ hosted_saas: false
293+ category: Libraries
294+ sub_category: RubyGems Packages
295+ image_url: https://img.stackshare.io/package/19246/default_518f3430d0c3ea4653c591ebd7e75da67f51cfaf.png
296+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
297+ detection_source: Gemfile
298+ last_updated_by: Thibaut Courouble
299+ last_updated_on: 2018-03-24 19:06:19.000000000 Z
300+- name: nokogiri
301+ description: Nokogiri
302+ package_url: https://rubygems.org/nokogiri
303+ version: 1.16.0
304+ license: MIT
305+ open_source: true
306+ hosted_saas: false
307+ category: Libraries
308+ sub_category: RubyGems Packages
309+ image_url: https://img.stackshare.io/package/18823/default_b8fbb83e23c963442e15398c5b56262cc6267d6f.png
310+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
311+ detection_source: Gemfile
312+ last_updated_by: Thibaut Courouble
313+ last_updated_on: 2018-10-21 22:41:35.000000000 Z
314+- name: progress_bar
315+ description: 'Give people feedback about long-running tasks without overloading
316+ them with information: Use a progress bar'
317+ package_url: https://rubygems.org/progress_bar
318+ version: 1.3.3
319+ license: WTFPL
320+ open_source: true
321+ hosted_saas: false
322+ category: Libraries
323+ sub_category: RubyGems Packages
324+ image_url: https://img.stackshare.io/package/19696/default_2312d4d1847ef96af6bbd57ed9959234ab92321c.png
325+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
326+ detection_source: Gemfile
327+ last_updated_by: Thibaut
328+ last_updated_on: 2014-01-26 21:01:54.000000000 Z
329+- name: pry-byebug
330+ description: Combine 'pry' with 'byebug'
331+ package_url: https://rubygems.org/pry-byebug
332+ version: 3.10.1
333+ license: MIT
334+ open_source: true
335+ hosted_saas: false
336+ category: Libraries
337+ sub_category: RubyGems Packages
338+ image_url: https://img.stackshare.io/package/18848/default_1c2935fa69cec14d38adad302e002464101cd71f.png
339+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
340+ detection_source: Gemfile
341+ last_updated_by: Paul Sernatinger
342+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
343+- name: rack
344+ description: Rack provides a minimal, modular and adaptable interface for developing
345+ web applications in Ruby
346+ package_url: https://rubygems.org/rack
347+ version: 2.2.8
348+ license: MIT
349+ open_source: true
350+ hosted_saas: false
351+ category: Libraries
352+ sub_category: RubyGems Packages
353+ image_url: https://img.stackshare.io/package/18839/default_db5cfb0d85d9fd8bfb40a863581417a2a57791ab.png
354+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
355+ detection_source: Gemfile
356+ last_updated_by: Paul Sernatinger
357+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
358+- name: rack-ssl-enforcer
359+ description: Rack::SslEnforcer is a simple Rack middleware to enforce ssl connections
360+ package_url: https://rubygems.org/rack-ssl-enforcer
361+ version: 0.2.9
362+ license: MIT
363+ open_source: true
364+ hosted_saas: false
365+ category: Libraries
366+ sub_category: RubyGems Packages
367+ image_url: https://img.stackshare.io/package/rubygems/image.png
368+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
369+ detection_source: Gemfile
370+ last_updated_by: Paul Sernatinger
371+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
372+- name: rack-test
373+ description: Rack::Test is a small, simple testing API for Rack apps
374+ package_url: https://rubygems.org/rack-test
375+ version: 2.1.0
376+ license: MIT
377+ open_source: true
378+ hosted_saas: false
379+ category: Libraries
380+ sub_category: RubyGems Packages
381+ image_url: https://img.stackshare.io/package/18845/default_db5cfb0d85d9fd8bfb40a863581417a2a57791ab.png
382+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
383+ detection_source: Gemfile
384+ last_updated_by: Paul Sernatinger
385+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
386+- name: rake
387+ description: Rake is a Make-like program implemented in Ruby
388+ package_url: https://rubygems.org/rake
389+ version: 13.1.0
390+ license: MIT
391+ open_source: true
392+ hosted_saas: false
393+ category: Libraries
394+ sub_category: RubyGems Packages
395+ image_url: https://img.stackshare.io/package/18812/default_f582e4648f4682adb72d2b201218cda7f8e894ac.png
396+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
397+ detection_source: Gemfile
398+ last_updated_by: Paul Sernatinger
399+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
400+- name: redcarpet
401+ description: A fast, safe and extensible Markdown to
402+ package_url: https://rubygems.org/redcarpet
403+ version: 3.6.0
404+ license: MIT
405+ open_source: true
406+ hosted_saas: false
407+ category: Libraries
408+ sub_category: RubyGems Packages
409+ image_url: https://img.stackshare.io/package/18853/default_b87d202e13d56f87c63181fa49bc5e099c9abaac.png
410+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
411+ detection_source: Gemfile
412+ last_updated_by: Paul Sernatinger
413+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
414+- name: rr
415+ description: RR is a test double framework that features a rich selection of double
416+ techniques and a terse syntax
417+ package_url: https://rubygems.org/rr
418+ version: 3.1.0
419+ license: MIT
420+ open_source: true
421+ hosted_saas: false
422+ category: Libraries
423+ sub_category: RubyGems Packages
424+ image_url: https://img.stackshare.io/package/18915/default_353d3fd998e68372ebd6d80dbb4c0632f387d091.png
425+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
426+ detection_source: Gemfile
427+ last_updated_by: Thibaut
428+ last_updated_on: 2013-10-24 18:25:52.000000000 Z
429+- name: sass
430+ description: Ruby Sass is deprecated! See https://sass-lang.com/ruby-sass for details
431+ package_url: https://rubygems.org/sass
432+ version: 3.7.4
433+ license: MIT
434+ open_source: true
435+ hosted_saas: false
436+ category: Libraries
437+ sub_category: RubyGems Packages
438+ image_url: https://img.stackshare.io/package/18882/default_b1cb499f3e62fe773109c989f76e3365fbe49857.png
439+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
440+ detection_source: Gemfile
441+ last_updated_by: Simon Legner
442+ last_updated_on: 2024-01-13 21:26:48.000000000 Z
443+- name: selenium-webdriver
444+ description: WebDriver is a tool for writing automated tests of websites
445+ package_url: https://rubygems.org/selenium-webdriver
446+ license: Apache-2.0
447+ open_source: true
448+ hosted_saas: false
449+ category: Libraries
450+ sub_category: RubyGems Packages
451+ image_url: https://img.stackshare.io/package/18901/default_f0ad2b1ffbe10fdd866f9f8e5f812599d9e8085b.png
452+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile
453+ detection_source: Gemfile
454+ last_updated_by: Thibaut
455+ last_updated_on: 2014-01-26 21:01:54.000000000 Z
456+- name: sinatra-contrib
457+ description: Collection of useful Sinatra extensions
458+ package_url: https://rubygems.org/sinatra-contrib
459+ version: 3.2.0
460+ license: MIT
461+ open_source: true
462+ hosted_saas: false
463+ category: Libraries
464+ sub_category: RubyGems Packages
465+ image_url: https://img.stackshare.io/package/19010/default_4361ccfae4dee655802081d8182ddcaebd7a2b3f.png
466+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
467+ detection_source: Gemfile
468+ last_updated_by: Paul Sernatinger
469+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
470+- name: sprockets
471+ description: Sprockets is a Rack-based asset packaging system that concatenates
472+ and serves JavaScript
473+ package_url: https://rubygems.org/sprockets
474+ version: 3.7.2
475+ license: MIT
476+ open_source: true
477+ hosted_saas: false
478+ category: Libraries
479+ sub_category: RubyGems Packages
480+ image_url: https://img.stackshare.io/package/18932/default_36bbb38c1cd5521e90d6e99982778960b00ec515.png
481+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
482+ detection_source: Gemfile
483+ last_updated_by: Simon Legner
484+ last_updated_on: 2024-01-13 21:26:48.000000000 Z
485+- name: sprockets-helpers
486+ description: Asset path helpers for Sprockets 2.x &amp;amp; 3.x applications
487+ package_url: https://rubygems.org/sprockets-helpers
488+ version: 1.4.0
489+ license: MIT
490+ open_source: true
491+ hosted_saas: false
492+ category: Libraries
493+ sub_category: RubyGems Packages
494+ image_url: https://img.stackshare.io/package/19732/default_be22d39d0c697424d0da2019daf25b87c93b4c6e.png
495+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
496+ detection_source: Gemfile
497+ last_updated_by: Simon Legner
498+ last_updated_on: 2024-01-13 21:26:48.000000000 Z
499+- name: sprockets-sass
500+ description: When using Sprockets 2.0 with Sass you will eventually run into a pretty
501+ big issue
502+ package_url: https://rubygems.org/sprockets-sass
503+ license: MIT
504+ open_source: true
505+ hosted_saas: false
506+ category: Libraries
507+ sub_category: RubyGems Packages
508+ image_url: https://img.stackshare.io/package/19683/default_5a5984fb57132e73bff841a1ebf058577d3c8cb9.png
509+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile
510+ detection_source: Gemfile
511+ last_updated_by: Simon Legner
512+ last_updated_on: 2024-01-13 21:26:48.000000000 Z
513+- name: terminal-table
514+ description: Simple, feature rich ascii table generation library
515+ package_url: https://rubygems.org/terminal-table
516+ version: 3.0.2
517+ license: MIT
518+ open_source: true
519+ hosted_saas: false
520+ category: Libraries
521+ sub_category: RubyGems Packages
522+ image_url: https://img.stackshare.io/package/18923/default_401820e785202ca0018a36ea3e12ee9a92b3efac.png
523+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
524+ detection_source: Gemfile
525+ last_updated_by: Jasper van Merle
526+ last_updated_on: 2019-10-11 15:55:09.000000000 Z
527+- name: thin
528+ description: A thin and fast web server
529+ package_url: https://rubygems.org/thin
530+ version: 1.8.2
531+ license: GPL-2.0+,Ruby
532+ open_source: true
533+ hosted_saas: false
534+ category: Libraries
535+ sub_category: RubyGems Packages
536+ image_url: https://img.stackshare.io/package/18900/default_f0ad2b1ffbe10fdd866f9f8e5f812599d9e8085b.png
537+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
538+ detection_source: Gemfile
539+ last_updated_by: Paul Sernatinger
540+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
541+- name: thor
542+ description: Thor is a toolkit for building powerful command-line interfaces
543+ package_url: https://rubygems.org/thor
544+ version: 1.3.0
545+ license: MIT
546+ open_source: true
547+ hosted_saas: false
548+ category: Libraries
549+ sub_category: RubyGems Packages
550+ image_url: https://img.stackshare.io/package/18827/default_fa0604c1b3b2c413c942b4fa310935704d314c2f.png
551+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
552+ detection_source: Gemfile
553+ last_updated_by: Paul Sernatinger
554+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
555+- name: tty-pager
556+ description: Terminal output paging in a cross-platform way supporting all major
557+ ruby interpreters
558+ package_url: https://rubygems.org/tty-pager
559+ version: 0.14.0
560+ license: MIT
561+ open_source: true
562+ hosted_saas: false
563+ category: Libraries
564+ sub_category: RubyGems Packages
565+ image_url: https://img.stackshare.io/package/rubygems/image.png
566+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
567+ detection_source: Gemfile
568+ last_updated_by: Thibaut Courouble
569+ last_updated_on: 2016-01-24 15:03:12.000000000 Z
570+- name: typhoeus
571+ description: Like a modern code version of the mythical beast with 100 serpent heads
572+ package_url: https://rubygems.org/typhoeus
573+ version: 1.4.1
574+ license: MIT
575+ open_source: true
576+ hosted_saas: false
577+ category: Libraries
578+ sub_category: RubyGems Packages
579+ image_url: https://img.stackshare.io/package/18891/default_b7088ec778267614a78a5a472c67252ec1721d10.png
580+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
581+ detection_source: Gemfile
582+ last_updated_by: Paul Sernatinger
583+ last_updated_on: 2022-11-14 14:30:30.000000000 Z
584+- name: yajl-ruby
585+ description: Ruby C bindings to the excellent Yajl JSON stream-based parser library
586+ package_url: https://rubygems.org/yajl-ruby
587+ version: 1.4.3
588+ license: MIT
589+ open_source: true
590+ hosted_saas: false
591+ category: Libraries
592+ sub_category: RubyGems Packages
593+ image_url: https://img.stackshare.io/package/18895/default_9386886dd1c6c396a11bd4b49732afb9ec444f8d.png
594+ detection_source_url: https://github.com/freeCodeCamp/devdocs/blob/main/Gemfile.lock
595+ detection_source: Gemfile
596+ last_updated_by: Nicholas La Roux
597+ last_updated_on: 2024-01-09 12:48:51.000000000 Z