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
13 steps:13 steps:
14 - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.014 - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0
15 - name: Set up Ruby15 - name: Set up Ruby
16 uses: ruby/setup-ruby@360dc864d5da99d54fcb8e9148c14a84b90d3e88 # v1.165.116 uses: ruby/setup-ruby@22fdc77bf4148f810455b226c90fb81b5cbc00a7 # v1.171.0
17 with:17 with:
18 bundler-cache: true # runs 'bundle install' and caches installed gems automatically18 bundler-cache: true # runs 'bundle install' and caches installed gems automatically
19 - name: Run tests19 - name: Run tests
.github/workflows/schedule-doc-report.yml+1−1
@@ -11,7 +11,7 @@ jobs: · 10 unmodified lines
11 steps:11 steps:
12 - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.012 - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0
13 - name: Set up Ruby13 - name: Set up Ruby
14 uses: ruby/setup-ruby@360dc864d5da99d54fcb8e9148c14a84b90d3e88 # v1.165.114 uses: ruby/setup-ruby@22fdc77bf4148f810455b226c90fb81b5cbc00a7 # v1.171.0
15 with:15 with:
16 bundler-cache: true # runs 'bundle install' and caches installed gems automatically16 bundler-cache: true # runs 'bundle install' and caches installed gems automatically
17 - name: Generate report17 - name: Generate report
.github/workflows/test.yml+1−1
@@ -11,7 +11,7 @@ jobs: · 10 unmodified lines
11 steps:11 steps:
12 - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.112 - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
13 - name: Set up Ruby13 - name: Set up Ruby
14 uses: ruby/setup-ruby@360dc864d5da99d54fcb8e9148c14a84b90d3e88 # v1.165.114 uses: ruby/setup-ruby@22fdc77bf4148f810455b226c90fb81b5cbc00a7 # v1.171.0
15 with:15 with:
16 bundler-cache: true # runs 'bundle install' and caches installed gems automatically16 bundler-cache: true # runs 'bundle install' and caches installed gems automatically
17 - name: Run tests17 - name: Run tests
Gemfile.lock+7−7
@@ -1,7 +1,7 @@
1GEM1GEM
2 remote: https://rubygems.org/2 remote: https://rubygems.org/
3 specs:3 specs:
4 activesupport (7.1.2)4 activesupport (7.1.3)
5 base645 base64
6 bigdecimal6 bigdecimal
7 concurrent-ruby (~> 1.0, >= 1.0.2)7 concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -16,12 +16,12 @@ GEM · 8 unmodified lines
16 erubi (>= 1.0.0)16 erubi (>= 1.0.0)
17 rack (>= 0.9.0)17 rack (>= 0.9.0)
18 rouge (>= 1.0.0)18 rouge (>= 1.0.0)
19 bigdecimal (3.1.5)19 bigdecimal (3.1.6)
20 browser (5.3.1)20 browser (5.3.1)
21 byebug (11.1.3)21 byebug (11.1.3)
22 chunky_png (1.4.0)22 chunky_png (1.4.0)
23 coderay (1.1.3)23 coderay (1.1.3)
24 concurrent-ruby (1.2.2)24 concurrent-ruby (1.2.3)
25 connection_pool (2.4.1)25 connection_pool (2.4.1)
26 daemons (1.4.1)26 daemons (1.4.1)
27 drb (2.2.0)27 drb (2.2.0)
@@ -30,7 +30,7 @@ GEM · 2 unmodified lines
30 ethon (0.16.0)30 ethon (0.16.0)
31 ffi (>= 1.15.0)31 ffi (>= 1.15.0)
32 eventmachine (1.2.7)32 eventmachine (1.2.7)
33 execjs (2.8.1)33 execjs (2.9.1)
34 exifr (1.4.0)34 exifr (1.4.0)
35 ffi (1.15.5)35 ffi (1.15.5)
36 fspath (3.1.2)36 fspath (3.1.2)
@@ -53,7 +53,7 @@ GEM · 16 unmodified lines
53 in_threads (1.6.0)53 in_threads (1.6.0)
54 method_source (1.0.0)54 method_source (1.0.0)
55 mini_portile2 (2.8.5)55 mini_portile2 (2.8.5)
56 minitest (5.21.1)56 minitest (5.22.2)
57 multi_json (1.15.0)57 multi_json (1.15.0)
58 mustermann (3.0.0)58 mustermann (3.0.0)
59 ruby2_keywords (~> 0.0.1)59 ruby2_keywords (~> 0.0.1)
@@ -62,7 +62,7 @@ GEM · 2 unmodified lines
62 net-ssh (>= 5.0.0, < 8.0.0)62 net-ssh (>= 5.0.0, < 8.0.0)
63 net-ssh (7.0.1)63 net-ssh (7.0.1)
64 newrelic_rpm (8.16.0)64 newrelic_rpm (8.16.0)
65 nokogiri (1.16.0)65 nokogiri (1.16.2)
66 mini_portile2 (~> 2.8.2)66 mini_portile2 (~> 2.8.2)
67 racc (~> 1.4)67 racc (~> 1.4)
68 options (2.3.2)68 options (2.3.2)
@@ -125,7 +125,7 @@ GEM · 56 unmodified lines
125 strings-ansi (0.2.0)125 strings-ansi (0.2.0)
126 terminal-table (3.0.2)126 terminal-table (3.0.2)
127 unicode-display_width (>= 1.1.1, < 3)127 unicode-display_width (>= 1.1.1, < 3)
128 terser (1.1.20)128 terser (1.2.0)
129 execjs (>= 0.3.0, < 3)129 execjs (>= 0.3.0, < 3)
130 thin (1.8.2)130 thin (1.8.2)
131 daemons (~> 1.0, >= 1.0.9)131 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
176| [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) |176| [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) |
177| [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) |177| [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) |
178| [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) |178| [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 |
179 180
180## Copyright / License181## Copyright / License
181 182
assets/javascripts/news.json+9−1
@@ -1,8 +1,16 @@
1[1[
2 [2 [
3 "2024-01-24",3 "2024-02-20",
4 "New documentation: <a href=\"/nextjs/\">Nextjs</a>"4 "New documentation: <a href=\"/nextjs/\">Nextjs</a>"
5 ],5 ],
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 ],
6 [14 [
7 "2024-01-12",15 "2024-01-12",
8 "New documentation: <a href=\"/hammerspoon/\">Hammerspoon</a>"16 "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
167to `path/to/devdocs/docs/openjdk~$VERSION`167to `path/to/devdocs/docs/openjdk~$VERSION`
168 168
169```sh169```sh
170curl -O http://ftp.at.debian.org/debian/pool/main/o/openjdk-21/openjdk-21-doc_21.0.1+12-3_all.deb170curl -O http://ftp.at.debian.org/debian/pool/main/o/openjdk-21/openjdk-21-doc_21.0.2+13-2_all.deb
171tar xf openjdk-21-doc_21.0.1+12-3_all.deb171tar xf openjdk-21-doc_21.0.2+13-2_all.deb
172tar xf data.tar.xz172tar xf data.tar.xz
173mv ./usr/share/doc/openjdk-21-jre-headless/api/ docs/openjdk~$VERSION173mv ./usr/share/doc/openjdk-21-jre-headless/api/ docs/openjdk~$VERSION
174```174```
lib/docs/filters/htmx/clean_html.rb+13−0
@@ -0,0 +1,13 @@
1module 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
13end
lib/docs/filters/htmx/entries.rb+31−0
@@ -0,0 +1,31 @@
1module 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
31end
lib/docs/filters/nextjs/clean_html.rb+2−1
@@ -3,9 +3,10 @@ module Docs · 2 unmodified lines
3 class CleanHtmlFilter < Filter3 class CleanHtmlFilter < Filter
4 def call4 def call
5 css('.zola-anchor').remove5 css('.zola-anchor').remove
6 doc.prepend_child("<h1>NextJS</h1>") if root_page?6 doc.prepend_child("<h1>NextJS2</h1>") if root_page?
7 css('div:contains("NEWS:")').remove7 css('div:contains("NEWS:")').remove
8 css('h2:contains("sponsors"), #sponsor-table').remove8 css('h2:contains("sponsors"), #sponsor-table').remove
9 css('div.sticky').remove #remove the floating menu
9 doc10 doc
10 end11 end
11 end12 end
lib/docs/filters/nextjs/entries.rb+25−9
@@ -1,13 +1,29 @@
1module Docs1module Docs
2 class Nextjs2 class Nextjs
3 class EntriesFilter < Docs::EntriesFilter3 class EntriesFilter < Docs::EntriesFilter
4 def get_name4 def get_name
5 at_css('h1').content5 name = at_css('h1').content
6 end6 name.strip!
7 name
8 end
7 9
8 def get_type10 def get_type
9 get_name11 if subpath.include?('/architecture')
10 end12 '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
11 end25 end
26 end
12 end27 end
13end28 end
29end
lib/docs/filters/nim/entries.rb+7−4
@@ -16,8 +16,10 @@ module Docs · 15 unmodified lines
16 name.remove! ' User Guide'16 name.remove! ' User Guide'
17 name.remove! ' User\'s manual'17 name.remove! ' User\'s manual'
18 name.remove! %r{ \-.*}18 name.remove! %r{ \-.*}
19 name.remove! %r{\Asrc/}
20 name.remove! %r{\Astd/}
19 name.strip!21 name.strip!
20 name22 name.split("/").last
21 end23 end
22 24
23 def get_type25 def get_type
@@ -54,10 +56,11 @@ module Docs · 30 unmodified lines
54 else56 else
55 57
56 css('.simple-toc-section a, .nested-toc-section a').each do |node|58 css('.simple-toc-section a, .nested-toc-section a').each do |node|
57 entry_name = node.content59 match = /^`(.*)`|^(\w+)/.match(node.content)
58 entry_name.gsub!(/,.*/, '')60 entry_name = match[1] || match[2]
61
59 entry_id = slug + node['href']62 entry_id = slug + node['href']
60 entries << [entry_name, entry_id, name]63 entries << ["#{entry_name} (#{name})", entry_id, name]
61 end64 end
62 65
63 end66 end
lib/docs/filters/openjdk/clean_html_new.rb+1−0
@@ -12,6 +12,7 @@ module Docs · 11 unmodified lines
12 end12 end
13 13
14 css('.header .sub-title', 'hr', '.table-tabs').remove14 css('.header .sub-title', 'hr', '.table-tabs').remove
15 css('.copy').remove
15 16
16 # fix ul section that contains summaries or tables17 # fix ul section that contains summaries or tables
17 css('ul').each do |node|18 css('ul').each do |node|
lib/docs/filters/playwright/clean_html.rb+29−0
@@ -0,0 +1,29 @@
1module 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
29end
lib/docs/filters/playwright/entries.rb+23−0
@@ -0,0 +1,23 @@
1module 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
23end
lib/docs/filters/pytorch/entries.rb+89−31
@@ -1,57 +1,115 @@
1module Docs1module Docs
2 class Pytorch2 class Pytorch
3 class EntriesFilter < Docs::EntriesFilter3 class EntriesFilter < Docs::EntriesFilter
4 NAME_REPLACEMENTS = {4 TYPE_REPLACEMENTS = {
5 "Distributed communication package - torch.distributed" => "torch.distributed"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"
6 }69 }
7 70
8 def get_breadcrumbs()71 def get_breadcrumbs
9 css('.pytorch-breadcrumbs > li').map { |node| node.content.delete_suffix(' >') }72 css('.pytorch-breadcrumbs > li').map {
73 |node| node.content.delete_suffix(' >').strip
74 }.reject { |item| item.nil? || item.empty? }
10 end75 end
11 76
12 def get_name77 def get_name
13 # The id of the container `div.section` indicates the page type.78 b = get_breadcrumbs
14 # If the id starts with `module-`, then it's an API reference,79 b[(b[1] == 'torch' ? 2 : 1)..].join('.')
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
23 end80 end
24 81
25 def get_type82 def get_type
26 name83 t = get_breadcrumbs[1]
84 TYPE_REPLACEMENTS.fetch(t, t)
27 end85 end
28 86
29 def include_default_entry?87 def include_default_entry?
30 # Only include API references, and ignore notes or design docs88 # Only include API entries to simplify and unify the list
31 !subpath.start_with? 'generated/' and type.start_with? 'torch'89 return name.start_with?('torch.')
32 end90 end
33 91
34 def additional_entries92 def additional_entries
35 return [] if root_page?93 return [] if root_page?
36 94
37 entries = []95 entries = []
38 96 css('dl').each do |node|
39 css('dt').each do |node|97 dt = node.at_css('dt')
40 name = node['id']98 if dt == nil
41 if name == self.name or name == nil99 next
100 end
101 id = dt['id']
102 if id == name or id == nil
42 next103 next
43 end104 end
44 105
45 case node.parent['class']106 case node['class']
46 when 'method', 'function'107 when 'py method', 'py function'
47 if node.at_css('code').content.starts_with? 'property '108 entries << [id + '()', id]
48 # this instance method is a property, so treat it as an attribute109 when 'py class', 'py attribute', 'py property'
49 entries << [name, node['id']]110 entries << [id, id]
50 else111 when 'footnote brackets', 'field-list simple'
51 entries << [name + '()', node['id']]112 next
52 end
53 when 'class', 'attribute'
54 entries << [name, node['id']]
55 end113 end
56 end114 end
57 115
lib/docs/filters/vitest/entries.rb+2−0
@@ -4,12 +4,14 @@ module Docs · 3 unmodified lines
4 def get_name4 def get_name
5 name = at_css('h1').content5 name = at_css('h1').content
6 name.sub! %r{\s*#\s*}, ''6 name.sub! %r{\s*#\s*}, ''
7 name.sub! %r{\s*\u200B\s*}, ''
7 name8 name
8 end9 end
9 10
10 def get_type11 def get_type
11 name = at_css('h1').content12 name = at_css('h1').content
12 name.sub! %r{\s*#\s*}, ''13 name.sub! %r{\s*#\s*}, ''
14 name.sub! %r{\s*\u200B\s*}, ''
13 name15 name
14 end16 end
15 17
lib/docs/scrapers/django.rb+5−0
@@ -34,6 +34,11 @@ module Docs · 33 unmodified lines
34 Licensed under the BSD License.34 Licensed under the BSD License.
35 HTML35 HTML
36 36
37 version '5.0' do
38 self.release = '5.0'
39 self.base_url = "https://docs.djangoproject.com/en/#{self.version}/"
40 end
41
37 version '4.2' do42 version '4.2' do
38 self.release = '4.2'43 self.release = '4.2'
39 self.base_url = "https://docs.djangoproject.com/en/#{self.version}/"44 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
16 Licensed under the MIT License.16 Licensed under the MIT License.
17 HTML17 HTML
18 18
19 self.release = '0.19.11'19 self.release = '0.20.0'
20 self.base_url = 'https://esbuild.github.io/'20 self.base_url = 'https://esbuild.github.io/'
21 html_filters.push 'esbuild/clean_html', 'esbuild/entries'21 html_filters.push 'esbuild/clean_html', 'esbuild/entries'
22 22
lib/docs/scrapers/git.rb+2−2
@@ -1,7 +1,7 @@
1module Docs1module Docs
2 class Git < UrlScraper2 class Git < UrlScraper
3 self.type = 'git'3 self.type = 'git'
4 self.release = '2.42.0'4 self.release = '2.43.1'
5 self.base_url = 'https://git-scm.com/docs'5 self.base_url = 'https://git-scm.com/docs'
6 self.initial_paths = %w(/git.html)6 self.initial_paths = %w(/git.html)
7 self.links = {7 self.links = {
@@ -16,7 +16,7 @@ module Docs · 8 unmodified lines
16 options[:skip] = %w(/howto-index.html)16 options[:skip] = %w(/howto-index.html)
17 17
18 options[:attribution] = <<-HTML18 options[:attribution] = <<-HTML
19 &copy; 2012&ndash;2023 Scott Chacon and others<br>19 &copy; 2012&ndash;2024 Scott Chacon and others<br>
20 Licensed under the MIT License.20 Licensed under the MIT License.
21 HTML21 HTML
22 22
lib/docs/scrapers/go.rb+1−1
@@ -1,7 +1,7 @@
1module Docs1module Docs
2 class Go < UrlScraper2 class Go < UrlScraper
3 self.type = 'go'3 self.type = 'go'
4 self.release = '1.21.5'4 self.release = '1.22.0'
5 self.base_url = 'https://golang.org/pkg/'5 self.base_url = 'https://golang.org/pkg/'
6 self.links = {6 self.links = {
7 home: 'https://golang.org/',7 home: 'https://golang.org/',
lib/docs/scrapers/haproxy.rb+5−0
@@ -20,6 +20,11 @@ module Docs · 19 unmodified lines
20 Licensed under the GNU General Public License version 2.20 Licensed under the GNU General Public License version 2.
21 HTML21 HTML
22 22
23 version '2.9' do
24 self.release = '2.9.0'
25 self.base_url = "https://docs.haproxy.org/#{self.version}/"
26 end
27
23 version '2.8' do28 version '2.8' do
24 self.release = '2.8.0'29 self.release = '2.8.0'
25 self.base_url = "https://docs.haproxy.org/#{self.version}/"30 self.base_url = "https://docs.haproxy.org/#{self.version}/"
lib/docs/scrapers/htmx.rb+35−0
@@ -0,0 +1,35 @@
1module 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
35end
lib/docs/scrapers/kubernetes.rb+22−2
@@ -20,15 +20,35 @@ module Docs · 19 unmodified lines
20 20
21 # latest version has a special URL that does not include the version identifier 21 # latest version has a special URL that does not include the version identifier
22 version do22 version do
23 self.release = "1.26"23 self.release = "1.29"
24 self.base_url = "https://kubernetes.io/docs/reference/kubernetes-api/"24 self.base_url = "https://kubernetes.io/docs/reference/kubernetes-api/"
25 end25 end
26 26
27 version '1.20' do27 version '1.28' do
28 self.release = "#{version}"28 self.release = "#{version}"
29 self.base_url = "https://v#{version.sub('.', '-')}.docs.kubernetes.io/docs/reference/kubernetes-api/"29 self.base_url = "https://v#{version.sub('.', '-')}.docs.kubernetes.io/docs/reference/kubernetes-api/"
30 end30 end
31 31
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
32 def get_latest_version(opts)52 def get_latest_version(opts)
33 get_latest_github_release('kubernetes', 'kubernetes', opts)53 get_latest_github_release('kubernetes', 'kubernetes', opts)
34 end54 end
lib/docs/scrapers/nim.rb+9−2
@@ -1,7 +1,6 @@
1module Docs1module Docs
2 class Nim < UrlScraper2 class Nim < UrlScraper
3 self.type = 'simple'3 self.type = 'simple'
4 self.release = '1.4.8'
5 self.base_url = 'https://nim-lang.org/docs/'4 self.base_url = 'https://nim-lang.org/docs/'
6 self.root_path = 'overview.html'5 self.root_path = 'overview.html'
7 self.links = {6 self.links = {
@@ -14,10 +13,18 @@ module Docs · 6 unmodified lines
14 options[:skip] = %w(theindex.html docgen.html tut1.html tut2.html tut3.html tools.html)13 options[:skip] = %w(theindex.html docgen.html tut1.html tut2.html tut3.html tools.html)
15 14
16 options[:attribution] = <<-HTML15 options[:attribution] = <<-HTML
17 &copy; 2006&ndash;2021 Andreas Rumpf<br>16 &copy; 2006&ndash;2024 Andreas Rumpf<br>
18 Licensed under the MIT License.17 Licensed under the MIT License.
19 HTML18 HTML
20 19
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
21 def get_latest_version(opts)28 def get_latest_version(opts)
22 doc = fetch_doc('https://nim-lang.org/docs/overview.html', opts)29 doc = fetch_doc('https://nim-lang.org/docs/overview.html', opts)
23 doc.at_css('.container > .docinfo > tbody > tr:last-child > td').content.strip30 doc.at_css('.container > .docinfo > tbody > tr:last-child > td').content.strip
lib/docs/scrapers/playwright.rb+27−0
@@ -0,0 +1,27 @@
1module 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
27end
lib/docs/scrapers/pytorch.rb+3−5
@@ -3,7 +3,6 @@ module Docs · 2 unmodified lines
3 self.name = 'PyTorch'3 self.name = 'PyTorch'
4 self.slug = 'pytorch'4 self.slug = 'pytorch'
5 self.type = 'sphinx'5 self.type = 'sphinx'
6 self.force_gzip = true
7 self.links = {6 self.links = {
8 home: 'https://pytorch.org/',7 home: 'https://pytorch.org/',
9 code: 'https://github.com/pytorch/pytorch'8 code: 'https://github.com/pytorch/pytorch'
@@ -11,13 +10,12 @@ module Docs · 1 unmodified line
11 10
12 html_filters.push 'pytorch/entries', 'pytorch/clean_html', 'sphinx/clean_html'11 html_filters.push 'pytorch/entries', 'pytorch/clean_html', 'sphinx/clean_html'
13 12
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']
15 options[:skip_patterns] = [/\Acommunity/, /\A_modules/, /\Anotes/, /\Aorg\/pytorch\//]14 options[:skip_patterns] = [/\Acommunity/, /\A_modules/, /\Anotes/, /\Aorg\/pytorch\//]
16 options[:max_image_size] = 256_000
17 15
18 options[:attribution] = <<-HTML16 options[:attribution] = <<-HTML
19 &copy; 2019-2024 Torch Contributors<br>17 &copy; 2024, PyTorch Contributors<br>
20 Licensed under the 3-clause BSD License.18 PyTorch has a BSD-style license, as found in the <a href="https://github.com/pytorch/pytorch/blob/main/LICENSE">LICENSE</a> file.
21 HTML19 HTML
22 20
23 version '2' do21 version '2' do
lib/docs/scrapers/sqlite.rb+1−1
@@ -2,7 +2,7 @@ module Docs · 1 unmodified line
2 class Sqlite < UrlScraper2 class Sqlite < UrlScraper
3 self.name = 'SQLite'3 self.name = 'SQLite'
4 self.type = 'sqlite'4 self.type = 'sqlite'
5 self.release = '3.44.2'5 self.release = '3.45.1'
6 self.base_url = 'https://sqlite.org/'6 self.base_url = 'https://sqlite.org/'
7 self.root_path = 'docs.html'7 self.root_path = 'docs.html'
8 self.initial_paths = %w(keyword_index.html)8 self.initial_paths = %w(keyword_index.html)
lib/docs/scrapers/vitest.rb+2−1
@@ -9,6 +9,7 @@ module Docs · 8 unmodified lines
9 }9 }
10 10
11 options[:root_title] = 'Vitest'11 options[:root_title] = 'Vitest'
12 options[:download_images] = false
12 13
13 options[:attribution] = <<-HTML14 options[:attribution] = <<-HTML
14 &copy; 2021-Present Anthony Fu<br>15 &copy; 2021-Present Anthony Fu<br>
@@ -16,7 +17,7 @@ module Docs · 1 unmodified line
16 Licensed under the MIT License.17 Licensed under the MIT License.
17 HTML18 HTML
18 19
19 self.release = '1.1.3'20 self.release = '1.2.2'
20 self.base_url = 'https://vitest.dev/'21 self.base_url = 'https://vitest.dev/'
21 self.initial_paths = %w(guide/)22 self.initial_paths = %w(guide/)
22 html_filters.push 'vitest/entries', 'vite/clean_html'23 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 @@
1https://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 @@
1https://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
4freeCodeCamp/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
14Full 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
20freeCodeCamp/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
30Full 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
189Generated via [Stack File](https://github.com/marketplace/stack-file)
techstack.yml+597−0
@@ -0,0 +1,597 @@
1repo_name: freeCodeCamp/devdocs
2report_id: 281e8991a46b88702952b7b18dd5e2b0
3version: 0.1
4repo_type: Public
5timestamp: '2024-01-27T03:50:22+00:00'
6requested_by: renovate[bot]
7provider: github
8branch: main
9detected_tools_count: 43
10tools:
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