Skip to content

Commit b4d0c10

Browse files
authored
Add hexdocs.pm/package_names.csv (#54)
1 parent 1dc047b commit b4d0c10

File tree

12 files changed

+104
-10
lines changed

12 files changed

+104
-10
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929

3030
- name: Run tests
3131
run: |
32-
mix test --include typesense
32+
mix test.all
3333
3434
docker:
3535
name: Docker

config/config.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ config :hexdocs,
1212
cdn_impl: Hexdocs.CDN.Local,
1313
search_impl: Hexdocs.Search.Local,
1414
source_repo_impl: Hexdocs.SourceRepo.GitHub,
15+
hex_repo_impl: Hexdocs.HexRepo.HTTP,
1516
tmp_dir: "tmp",
1617
queue_id: "test",
1718
queue_producer: Broadway.DummyProducer,

config/test.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ config :hexdocs,
77
store_impl: Hexdocs.Store.Local,
88
cdn_impl: Hexdocs.CDN.Local,
99
search_impl: Hexdocs.Search.Local,
10-
source_repo_impl: Hexdocs.SourceRepo.Mock
10+
source_repo_impl: Hexdocs.SourceRepo.Mock,
11+
hex_repo_impl: Hexdocs.HexRepo.Mock
1112

1213
config :logger, level: :warning

lib/hexdocs/bucket.ex

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@ defmodule Hexdocs.Bucket do
55
@gcs_put_debounce Application.compile_env!(:hexdocs, :gcs_put_debounce)
66

77
def upload_index_sitemap(sitemap) do
8-
upload_sitemap("sitemap", "sitemap.xml", sitemap)
8+
upload_content("sitemap", "sitemap.xml", sitemap)
99
end
1010

1111
def upload_package_sitemap(package, sitemap) do
12-
upload_sitemap("sitemap/#{package}", "#{package}/sitemap.xml", sitemap)
12+
upload_content("sitemap/#{package}", "#{package}/sitemap.xml", sitemap)
1313
end
1414

15-
defp upload_sitemap(key, path, sitemap) do
15+
def upload_package_names_csv(contents) do
16+
upload_content("package_names.csv", "package_names.csv", contents)
17+
end
18+
19+
defp upload_content(key, path, content) do
1620
opts = [
1721
content_type: "text/xml",
1822
cache_control: "public, max-age=3600",
@@ -21,7 +25,7 @@ defmodule Hexdocs.Bucket do
2125

2226
Logger.info("Uploading docs_public_bucket #{path}")
2327

24-
case Hexdocs.Store.put(:docs_public_bucket, path, sitemap, opts) do
28+
case Hexdocs.Store.put(:docs_public_bucket, path, content, opts) do
2529
{:ok, 200, _headers, _body} ->
2630
:ok
2731

lib/hexdocs/hex_repo.ex

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
defmodule Hexdocs.HexRepo do
2+
@callback get_names() :: {:ok, [binary()]} | {:error, term()}
3+
4+
@module Application.fetch_env!(:hexdocs, :hex_repo_impl)
5+
6+
defdelegate get_names(), to: @module
7+
end
8+
9+
defmodule Hexdocs.HexRepo.HTTP do
10+
require Logger
11+
12+
def get_names do
13+
case :hex_repo.get_names(:hex_core.default_config()) do
14+
{:ok, {200, _, body}} ->
15+
%{repository: "hexpm", packages: packages} = body
16+
names = for package <- packages, do: package.name
17+
{:ok, names}
18+
19+
{:ok, {status, _headers, body}} ->
20+
message = """
21+
unexpected HTTP #{status}
22+
23+
#{body}\
24+
"""
25+
26+
{:error, message}
27+
28+
{:error, _reason} = error ->
29+
error
30+
end
31+
end
32+
end

lib/hexdocs/queue.ex

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ defmodule Hexdocs.Queue do
133133
if Hexdocs.Utils.latest_version?(package, version, all_versions) do
134134
update_index_sitemap(repository, key)
135135
update_package_sitemap(repository, key, package, files)
136+
update_package_names_csv(repository)
136137
end
137138

138139
if repository == "hexpm" do
@@ -253,6 +254,25 @@ defmodule Hexdocs.Queue do
253254
:ok
254255
end
255256

257+
defp update_package_names_csv("hexpm") do
258+
Logger.info("UPDATING package_names.csv")
259+
260+
case Hexdocs.HexRepo.get_names() do
261+
{:ok, names} ->
262+
csv = for name <- names, do: [name, "\n"]
263+
Hexdocs.Bucket.upload_package_names_csv(csv)
264+
265+
{:error, reason} ->
266+
Logger.error(inspect(reason))
267+
end
268+
269+
Logger.info("UPDATED package_names.csv")
270+
end
271+
272+
defp update_package_names_csv(_repository) do
273+
:ok
274+
end
275+
256276
defp update_search_index(key, package, version, files) do
257277
with {proglang, items} <- Hexdocs.Search.find_search_items(package, version, files) do
258278
Logger.info("UPDATING SEARCH INDEX #{key}")

mix.exs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,32 @@ defmodule Hexdocs.MixProject do
88
elixir: "~> 1.18",
99
start_permanent: Mix.env() == :prod,
1010
releases: releases(),
11+
aliases: aliases(),
1112
deps: deps()
1213
]
1314
end
1415

1516
def application do
1617
[
17-
extra_applications: [:eex, :logger, :runtime_tools],
18+
extra_applications: [:eex, :logger, :runtime_tools, :inets],
1819
mod: {Hexdocs.Application, []}
1920
]
2021
end
2122

23+
def cli do
24+
[
25+
preferred_envs: [
26+
"test.all": :test
27+
]
28+
]
29+
end
30+
31+
defp aliases do
32+
[
33+
"test.all": ["test --include typesense --include integration"]
34+
]
35+
end
36+
2237
defp deps do
2338
[
2439
{:broadway, "~> 1.0"},
@@ -34,7 +49,7 @@ defmodule Hexdocs.MixProject do
3449
{:sentry, "~> 10.8"},
3550
{:ssl_verify_fun, "~> 1.1", manager: :rebar3, override: true},
3651
{:sweet_xml, "~> 0.7.0"},
37-
{:hex_core, "~> 0.9.0", only: [:dev, :test]},
52+
{:hex_core, "~> 0.11.0"},
3853
{:mox, "~> 1.0", only: :test}
3954
]
4055
end

mix.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"gen_stage": {:hex, :gen_stage, "1.2.1", "19d8b5e9a5996d813b8245338a28246307fd8b9c99d1237de199d21efc4c76a1", [:mix], [], "hexpm", "83e8be657fa05b992ffa6ac1e3af6d57aa50aace8f691fcf696ff02f8335b001"},
1414
"goth": {:hex, :goth, "1.4.0", "29713dd3390021c6ccd2b8aa9fe7d8570b0816d807c5d84fa3eb06a4abfa29ce", [:mix], [{:finch, "~> 0.9", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:jose, "~> 1.10", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "1bf684f1fed7d31c46e49c1dcd4dc5cca454ef748abea2410a49cd8621fbede1"},
1515
"hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"},
16-
"hex_core": {:hex, :hex_core, "0.9.0", "ba2b3b8f3ff821b9bad0c9daf4d6f76807bb4a13185e2a2ee6ad89f76fc5753c", [:rebar3], [], "hexpm", "f160418b48511a08dfdb473814a8c8f95ed109878a74649464f13816036cc2f1"},
16+
"hex_core": {:hex, :hex_core, "0.11.0", "d1c6bbf2a4ee6b5f002bec6fa52b5080c53c8b63b7caf6eb88b943687547bff4", [:rebar3], [], "hexpm", "707893677a425491962a2db522f1d2b1f85f97ea27418b06f7929f1d30cde0b0"},
1717
"hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"},
1818
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
1919
"jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},

test/hexdocs/hex_repo_test.exs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
defmodule Hexdocs.HexRepo.HTTPTest do
2+
use ExUnit.Case, async: true
3+
4+
@moduletag :integration
5+
6+
test "it works" do
7+
assert {:ok, names} = Hexdocs.HexRepo.HTTP.get_names()
8+
assert "hex_core" in names
9+
end
10+
end

test/hexdocs/queue_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ defmodule Hexdocs.QueueTest do
1212
"this is the sitemap"
1313
end)
1414

15+
Mox.stub(Hexdocs.HexRepo.Mock, :get_names, fn ->
16+
{:ok, ["package1", "package2"]}
17+
end)
18+
1519
:ok
1620
end
1721

@@ -58,6 +62,7 @@ defmodule Hexdocs.QueueTest do
5862
Store.put!(:repo_bucket, key, tar)
5963

6064
ref = Broadway.test_message(Hexdocs.Queue, put_message(key))
65+
6166
assert_receive {:ack, ^ref, [_], []}
6267

6368
assert ls(@public_bucket, "#{test}/") == [
@@ -69,6 +74,7 @@ defmodule Hexdocs.QueueTest do
6974

7075
assert Store.get(@public_bucket, "#{test}/index.html") == "contents"
7176
assert Store.get(@public_bucket, "#{test}/1.0.0/index.html") == "contents"
77+
assert Store.get(@public_bucket, "package_names.csv") == "package1\npackage2\n"
7278
end
7379

7480
@tag :capture_log

0 commit comments

Comments
 (0)