From 2692bcc2b18c4711d92db1478d75a4e8c49ce6de Mon Sep 17 00:00:00 2001 From: Adam Wight Date: Thu, 3 Apr 2025 09:33:05 +0200 Subject: [PATCH 1/2] Mix task to refresh popular_packages.txt Includes an update to the file demonstrating output. Closes #3 --- lib/mix/tasks/popular_packages.ex | 64 ++ mix.exs | 2 +- popular_packages.txt | 1471 ++++++++++++++--------------- 3 files changed, 796 insertions(+), 741 deletions(-) create mode 100644 lib/mix/tasks/popular_packages.ex diff --git a/lib/mix/tasks/popular_packages.ex b/lib/mix/tasks/popular_packages.ex new file mode 100644 index 0000000..fdeb3ac --- /dev/null +++ b/lib/mix/tasks/popular_packages.ex @@ -0,0 +1,64 @@ +defmodule Mix.Tasks.PopularPackages do + use Mix.Task + + @shortdoc "Rebuild popular_packages.txt" + + @moduledoc """ + Fetches a list of most downloaded packages from hex.pm and stores into the + top-level popular_packages.txt file. + + ## Usage + + mix popular_packages + """ + + @base_url "https://hex.pm/api/packages" + @file_path File.cwd!() <> "/popular_packages.txt" + @page_count 11 + + def run([]) do + Mix.shell().info("Fetching #{@page_count} pages of packages...") + + names = build_popular_list() + count = length(names) + + header = """ + # The #{count} most popular packages on hex.pm, according to #{@base_url} on #{Date.utc_today() |> Date.to_string()} + # Generated using: + # mix popular_packages + """ + + File.write!(@file_path, header <> Enum.join(names, "\n")) + Mix.shell().info("Wrote #{count} package names to #{@file_path}") + end + + defp build_popular_list() do + 1..@page_count + |> Enum.flat_map(&fetch_page/1) + |> Enum.map(& &1["name"]) + end + + defp fetch_page(page), + do: api_get(@base_url <> "?sort=recent_downloads&page=#{page}") + + defp user_agent do + mix_config = Mix.Project.config() + to_string(mix_config[:app]) <> " " <> mix_config[:version] + end + + defp api_get(url) do + {:ok, {{_, 200, _}, _, body}} = + :httpc.request( + :get, + {to_charlist(url), + [ + {~c"user-agent", to_charlist(user_agent())}, + {~c"accept", ~c"application/json"} + ]}, + [], + [] + ) + + body |> to_string() |> :json.decode() + end +end diff --git a/mix.exs b/mix.exs index 413e01a..bf2ae2c 100644 --- a/mix.exs +++ b/mix.exs @@ -13,7 +13,7 @@ defmodule LocalHexdocs.MixProject do def application do [ - extra_applications: [:logger] + extra_applications: [:logger, :inets, :ssl] ] end diff --git a/popular_packages.txt b/popular_packages.txt index 170f74b..46ad23f 100644 --- a/popular_packages.txt +++ b/popular_packages.txt @@ -1,20 +1,20 @@ -# The 1,110 most popular packages on hex.pm, according to https://hex.pm/packages on 2025-03-16 +# The 1100 most popular packages on hex.pm, according to https://hex.pm/api/packages on 2025-04-03 # Generated using: -# `const a_links = document.getElementsByTagName("a"); for (let i = 0; i < a_links.length; i++) {console.log(a_links[i].innerText);};` +# mix popular_packages jason telemetry ranch -mime ssl_verify_fun +mime certifi -parse_trans +cowlib plug +parse_trans mimerl unicode_util_compat idna plug_crypto metrics -cowlib hackney cowboy decimal @@ -24,1089 +24,1080 @@ ecto phoenix db_connection phoenix_pubsub -file_system ecto_sql plug_cowboy +file_system gettext cowboy_telemetry hpax postgrex phoenix_template mint -credo -phoenix_html telemetry_metrics +phoenix_html +credo bunt recon websock -websock_adapter telemetry_poller +websock_adapter nimble_pool -phoenix_ecto finch +phoenix_ecto expo jose nimble_parsec phoenix_live_view -verl httpoison +verl tzdata -hex_core -rebar3_hex tesla combine +hex_core +rebar3_hex phoenix_view -dialyxir phoenix_live_dashboard -erlex +dialyxir timex +erlex pc -poison yamerl sweet_xml +poison elixir_make earmark_parser makeup_elixir makeup joken -ex_aws ex_doc +ex_aws gen_stage oban -makeup_erlang yaml_elixir -mox +makeup_erlang floki -ex_aws_s3 +mox poolboy +meck +ex_aws_s3 comeonin nimble_ownership -meck +csv phoenix_live_reload excoveralls swoosh -jsx sentry -csv -esbuild observer_cli +jsx +esbuild ex_machina -hpack_erl bandit thousand_island +libcluster +hpack_erl req -redix +credentials_obfuscation decorator opentelemetry_api sobelow gproc +redix tls_certificate_check -credentials_obfuscation opentelemetry ctx -ts_chatterbox tailwind +ts_chatterbox acceptor_pool -grpcbox -opentelemetry_semantic_conventions cors_plug -opentelemetry_exporter thoas +grpcbox +opentelemetry_exporter +opentelemetry_semantic_conventions faker cachex eternal -bcrypt_elixir -nimble_csv jumper unsafe sleeplocks +nimble_csv +bcrypt_elixir opentelemetry_telemetry opentelemetry_process_propagator junit_formatter -mock broadway +protobuf absinthe +mock opentelemetry_phoenix -protobuf +table_rex absinthe_plug logger_json -uuid getopt -table_rex +uuid phoenix_html_helpers -goth +ecto_psql_extras +open_api_spex opentelemetry_ecto -inflex elixir_uuid -open_api_spex -crc32cer -ecto_psql_extras +inflex +goth rabbit_common -katana_code +crc32cer amqp_client -connection gun -telemetry_registry +mix_audit +katana_code earmark +telemetry_registry retry -mix_audit -snappyer telemetry_metrics_prometheus_core -stream_data -kafka_protocol +connection dns_cluster configparser_ex -brod -recase -mix_test_watch -crontab +snappyer +kafka_protocol oauth2 +mix_test_watch +recase +rebar3_ex_doc +brod amqp +crontab +gen_smtp saxy deep_merge -gen_smtp -rebar3_ex_doc +number rustler_precompiled +stream_data ex_aws_sts -number -google_gax +redbug html_entities guardian +google_gax typed_struct -gpb dataloader ex_phone_number -zipper -telemetry_metrics_statsd remote_ip -ex_json_schema -bamboo -redbug +zipper opentelemetry_cowboy -bypass +bamboo +ex_json_schema +telemetry_metrics_statsd scrivener +bypass ex_cldr +gen_batch_server +xml_builder absinthe_phoenix +gpb opentelemetry_oban -xml_builder cldr_utils -msgpax scrivener_ecto -covertool +msgpax +json +aten ex2ms -quantile_estimator -quantum -corsica +hammer ueberauth +corsica +quantile_estimator argon2_elixir -ex_cldr_currencies -ex_cldr_numbers -gen_batch_server -hammer -benchee +ra mimic +ex_cldr_numbers +ex_cldr_currencies +quantum uniq -mochiweb -ex_aws_sqs -digital_token prometheus +covertool +mochiweb uri_query +ex_aws_sqs +benchee nebulex -aten -flow +digital_token cloak +eredis +flow +systemd +enough +phoenix_swoosh +horus statistex -json styler -opentelemetry_tesla html_sanitize_ex -ra -phoenix_swoosh +cuttlefish +opentelemetry_tesla +stdout_formatter ecto_enum -eredis -parallel_stream +sysmon_handler +khepri money -sourceror -rebar3_proper -google_protos -bbmustache -appsignal excellent_migrations -toml +appsignal +khepri_mnesia_migration octo_fetch +toml +parallel_stream +sourceror grpc +google_protos +ex_hash_ring +uuid_erl +quickrand +fun_with_flags prom_ex -goldrush ordinal -systemd -quickrand -uuid_erl -horus erlsom optimal -neotoma -enough -khepri -fun_with_flags +bbmustache cloak_ecto -cuttlefish +goldrush opentelemetry_logger_metadata -stdout_formatter -sysmon_handler -ex_hash_ring absinthe_relay -khepri_mnesia_migration -statix -elvis_core -hammox appsignal_plug -slugify -elixlsx -rebar3_neotoma_plugin +rebar3_proper +hammox appsignal_phoenix rustler -coveralls +elixlsx +slugify +flop +statix +neotoma +elvis_core +backoff libgraph -lager -myxql rebar3_archive_plugin inaka_aleppo -proper -flop -erlfmt -backoff -jsone -ex_rated +myxql spandex -open_telemetry_decorator -aws_signature -opentelemetry_redix +ex_rated broadway_sqs +aws_signature +coveralls +geo +lager +ham grpc_gun +open_telemetry_decorator +opentelemetry_redix +stripity_stripe spandex_datadog +libring +jsone +erlfmt o11y -geo +cc_precompiler +paginator +proper logger_file_backend +rebar3_neotoma_plugin rebar3_lint -libring -stripity_stripe -ham -providers -paginator -cc_precompiler accept +fun_with_flags_ui nimble_totp ex_cldr_calendars +ueberauth_google ex_cldr_dates_times joken_jwks -exjsx -gen_state_machine -fun_with_flags_ui -exconstructor multipart -ueberauth_google typed_ecto_schema -google_api_storage owl -rewrite +ymlr +exjsx +gen_state_machine +otel_http +exconstructor +providers +shotgun x509 +lru spandex_phoenix -jiffy +google_api_storage temp -glob_ex polymorphic_embed -supervisor3 telemetry_metrics_prometheus -proper_case -tesla_request_id -exactor -shotgun -ymlr -lru -otel_http -igniter -waffle +jiffy spandex_ecto +rewrite +geo_postgis +waffle +tesla_request_id shards +glob_ex +launchdarkly_server_sdk +oban_met +proper_case +oban_web +igniter +patch +supervisor3 uinta -knigge mockery -geo_postgis +broadway_dashboard +exactor +table opentelemetry_absinthe -launchdarkly_server_sdk -patch -broadway_rabbitmq +knigge +esaml +ex_aws_sns exvcr -table +broadway_rabbitmq +broadway_kafka +briefly websockex prometheus_ex -broadway_dashboard -ex_twilio -ex_aws_sns ex_money -broadway_kafka -spitfire -esaml kadabra -artificery +ex_twilio bodyguard bamboo_phoenix -heroicons +makeup_html +spitfire xlsxir -hammer_backend_redis +nestru +peep +heroicons phoenix_pubsub_redis -makeup_html -briefly -con_cache +inet_cidr eqrcode -hut +hammer_backend_redis +fuse +artificery +con_cache +makeup_eex tz moar protox -peep +phoenix_storybook +exqlite google_api_secret_manager text_diff -fuse -eministat -exqlite -bugsnag -assertions -makeup_eex mogrify prometheus_plugs -dotenvy +attrs pigeon -eini -ets +assertions waffle_ecto -phoenix_storybook -vex -oban_web -uf2tool -mint_web_socket +dotenvy sizeable -oban_met -attrs -neuron -fss vix +hut +ets +mint_web_socket +fss +neuron +vex morphix -cf -rebar3_path_deps -plugsnag +bugsnag +boundary +opentelemetry_finch +premailex +eini complex -rebar3_gpb_plugin -pre_plug +instruments +cf nx -aws absinthe_error_payload -inet_cidr -assent -opentelemetry_finch -pbkdf2_elixir -pdf_generator -boundary -map_diff -exq -premailex bamboo_smtp -erlware_commons -seshat +pdf_generator +aws +assent +eministat wallaby web_driver_client -ecto_sqlite3 -simple_token_authentication -instruments -phoenix_swagger -mjml +uuidv7 flop_phoenix -gleam_stdlib new_relic_agent -sftp_client -distillery +mjml +rebar3_path_deps ex_image_info +pbkdf2_elixir +rebar3_gpb_plugin +gleam_stdlib +eredis_cluster +exq +sftp_client +map_diff +simple_token_authentication +opentelemetry_req +segment spark -rfc3339 +phoenix_swagger nebulex_redis_adapter -opentelemetry_function -erl_csv -countries -email_checker -segment -opentelemetry_req -nestru -uuidv7 +erlware_commons +seshat +ecto_sqlite3 guardian_db -ed25519 +plugsnag +image +rexbug +pre_plug +uf2tool ash +opentelemetry_function mail -base64url -norm -hashids +ed25519 +email_checker +countries +trie ecto_network -reactor +distillery ex_aws_lambda -ex_money_sql -varint -rexbug -wormhole -image +norm +base64url murmur +hashids sage +wormhole +merkle_map +delta_crdt +samly +ex_money_sql +erl_csv +ua_parser +rfc3339 +varint graphql_markdown -nanoid -provider_asn1 -trie -jaxon zstream -git_hooks +jaxon +reactor +broadway_cloud_pub_sub +erlexec +nanoid +petal_components +horde socket -phx_new -ash_postgres -jesse -ex_check -samly -kino -rebar3_format -merkle_map opentelemetry_liveview -broadway_cloud_pub_sub -confex -blankable ex_aws_secretsmanager -ash_sql -ua_parser -lhttpc +confex +ecto_enum_migration +result +kino +ash_postgres +git_hooks +ex_aws_dynamo +gen_registry aws_rds_castore +matrix_reloaded +ex_maybe opentelemetry_broadway -delta_crdt -memoize +pgvector +phx_new +qr_code doctor -splode -petal_components -eredis_cluster -honeybadger -base16 -ex_aws_dynamo -guardian_phoenix +memoize +iso8601 +puid slipstream +ex_check +rebar3_format +solid secure_random -iterex -iso8601 -horde -ash_phoenix -gnat +ash_sql +splode +fsm +xlsx_reader gleeunit -puid +gnat +guardian_phoenix abacus -erlexec -fsm -hammer_plug -pgvector -epgsql +blankable +scrivener_list +honeybadger +provider_asn1 +jesse nkeys +pngex +epgsql +iterex +ash_phoenix +base16 elixir_xml_to_map -xlsx_reader +ex_cldr_lists git_cli +lhttpc kayrock +prometheus_ecto enum_type -result -gen_registry +ex_cldr_territories atomic_map -ex_maybe -matrix_reloaded -ecto_enum_migration -scrivener_list -solid -qr_code -rollbax -ex_cldr_lists -numbers -websocket_client +hammer_plug +eventstore +liveness +tailwind_formatter ex_aws_ec2 +websocket_client +absinthe_federation +opentelemetry_bandit +process_tree +numbers coerce -liveness +vmstats +prometheus_phoenix ratio -ex_cldr_territories -eventstore -chromic_pdf markdown_formatter -vmstats +rollbax calendar -prometheus_ecto -tailwind_formatter -prometheus_phoenix -pngex -opentelemetry_bandit -rebar3_eetcd_plugin -trails -exprintf -absinthe_federation -ja_serializer -progress_bar -picosat_elixir -sext -elastix -ueberauth_microsoft -ecto_erd pot mdex -nimble_strftime -erlport -process_tree +ueberauth_microsoft explorer +chromic_pdf +exprintf +ecto_erd +progress_bar +vector ecto_dev_logger +blacksmith +ja_serializer +zen_monitor xema -exla -p1_utils -absinthe_graphql_ws -pow -unplug -vega_lite +elastix +dns parent -curve25519 +nimble_strftime +credo_naming +picosat_elixir +conv_case +ex_cldr_units +live_isolated_component exprof -xla +unplug +curve25519 kcl poly1305 +ex_crypto salsa20 -equivalex chacha20 -conv_case -erlavro -vector -ex_cldr_units +equivalex +erlport +trails +pow +rebar3_eetcd_plugin +absinthe_graphql_ws +ua_inspector ex_aws_ses -credo_naming -blacksmith -ex_crypto -zen_monitor -memcachex -ex_aws_kms -live_isolated_component -swarm -luhn -domainatrex -google_api_big_query -nodejs -contex +exla +vega_lite dart_sass -statistics -google_api_pub_sub -ua_inspector -highlander +erlavro +distance crc +nodejs +xla +p1_utils +workos +domainatrex +sext +google_api_pub_sub +oidcc +mongodb_driver +contex porcelain +ex_aws_kms +luhn +memcachex +google_api_big_query unzip -prometheus_httpd -dns -mongodb_driver -unicode -reverse_proxy_plug +apollo_tracing +swarm +ueberauth_auth0 +stream_gzip +pfx +radix +iptrie +statistics browser -workos -live_select ex_cldr_plugs -ueberauth_auth0 -apollo_tracing +circular_buffer +reverse_proxy_plug +unicode +highlander +live_select ex_keccak avrora -circular_buffer +prometheus_httpd +plug_attack +ueberauth_okta +paper_trail +commanded_eventstore_adapter +paraxial +ex_cldr_languages +commanded gleam_erlang -openai gleam_json -fs -mustache -ex_cldr_languages -plug_attack -bear ash_authentication -commanded +bear +syn +ex_unit_notifier +extrace redis_mutex +openai +rebar3_fmt luerl -commanded_eventstore_adapter +json_xema +seg_seg +licensir ueberauth_identity -syn -paper_trail -ex_unit_notifier iconv -stream_gzip +fs setup mjml_eex -oidcc -distance +mustache params -extrace -rebar3_fmt arc -geohash -ecto_commons geocalc -json_xema -sitemapper -google_api_drive -tokenizers -carbonite -sasl_auth -kafka_ex -swoosh_gallery +geohash +libcluster_ec2 +semaphore cidr -polaris -towel waffle_gcs -brcpfcnpj -propcheck -libcluster_ec2 +kafka_ex +valdi +oath +sitemapper +gleam_http +mentat +file_size exsync +sql_fmt +brcpfcnpj +towel ex_abi -socket_drano -ash_authentication_phoenix ibrowse +swoosh_gallery +carbonite +polaris +ecto_commons +brotli knock -date_time_parser -mix_test_interactive -logster -valdi -gleam_http -rebar3_bench -worker_pool -google_maps -oath +tokenizers +socket_drano +ueberauth_github +ash_authentication_phoenix +google_api_drive +dotenv_parser +fast64 folsom -mentat -tz_extra +kaffy +mix_test_interactive +date_time_parser +propcheck gcs_signed_url -plug_heartbeat -sql_fmt -semaphore -seg_seg +ex_aws_firehose +prometheus_process_collector +custom_base +opentelemetry_honeycomb_sampler braintree +logster geocoder +accessible exmoji grpc_mock -erlang_psq -machinery +lua +google_maps +logfmt soap +worker_pool +ecto_cursor_based_stream +phone git_ops -telepoison +langchain +sasl_auth +tz_extra google_api_translate -ecto_cursor_based_stream -lua -brotli -ueberauth_okta -ex_aws_firehose -custom_base -dotenv -fast64 -opentelemetry_honeycomb_sampler -file_size -prometheus_cowboy -elasticachex +tarams +png +cbor randex -rebar3_elixir -prometheus_process_collector config_tuples -phone -gleam_otp -commanded_ecto_projections -k8s -deadline -accessible -grpcbox_plugin -tarams +elasticachex +machinery +slack singleton -langchain -grpc_fresha -memcachir -herd -cbor -breadcrumble +dotenv +commanded_ecto_projections +barlix +plug_heartbeat live_toast -logfmt -plug_checkup +telepoison rebar3_hank -locus -dotenv_parser -slack -signaturex -png -openid_connect -cocktail -gleam_crypto +breadcrumble +gleam_otp +deadline +herd +memcachir +error_tracker +rebar3_elixir +grpc_fresha +ex_marcel assert_value -kaffe +redirect +cocktail +prometheus_cowboy +net_address flame_on -filtrex -spandex_phoenix_fresha -confix -ex_marcel +ex_rlp +openid_connect plug_signature -bamboo_ses -barlix -exometer_core -net_address -ueberauth_github -tz_world +gleam_crypto +any_ascii cpu_util +spandex_phoenix_fresha +k8s +confix +signaturex +plug_checkup +ex_aws_ssm +etop query_builder -torch -ecto_autoslug_field +grpcbox_plugin +cli_options +locus +kaffe +workspace +filtrex opentelemetry_nebulex -slugger -eunomo -etop -inch_ex -ok -elasticsearch -oauther -bureaucrat +let_me shortuuid -ranger -influxql -kaffy +inch_ex +exometer_core +torch +eunomo unleash_fresha -birl -canada -cli_options -ex_rlp +ecto_autoslug_field +oauther surgex -jabbax -qdate_localtime -benchfella -math -workspace +slugger +bamboo_ses global_flags -exq_ui -ex_parameterized -filepath -licensir -simplifile -ex_aws_ssm -pgoutput_decoder +xandra nerves_bootstrap -any_ascii -ecto_soft_delete -instream +jabbax +benchfella string_compat +crypto_rand +pgoutput_decoder +external_service +ok ex_aws_cloudwatch -axon +ex_parameterized +tz_world local_cluster -external_service -gleam_regexp -mmdb2_decoder -eini_beam +snap +bureaucrat +gleam_javascript +canada exlasticsearch +elasticsearch +exq_ui +qdate_localtime +gleam_regexp +ecto_morph +tds cereal -slugy -ash_json_api -zarex -atomex +snowflex +ex_aws_bedrock +simplifile +avalanche +blake2 +ecto_soft_delete +filepath +math +zxcvbn +influxql +size scribe -pane -unpickler -gleam_javascript -logger_backends -azurex -xandra +birl +mmdb2_decoder +gleam_yielder ex_audit +pane +ranger +eini_beam +zarex +axon +ash_json_api +jchash +set_locale erlcloud -tds -nx_image -blake2 -bumblebee -redirect -snowflex -envoy -geolix -pfx -radix +logger_backends +skogsra kday -nx_signal +instream live_svelte -ex_aws_bedrock -evision -error_tracker -unicode_set -gleam_yielder +slugy +req_telemetry +unpickler +atomex polyline -iptrie -crypto_rand -word_smith -google_api_sheets -size -zxcvbn -jchash -circuits_uart +geolix +bumblebee +nx_image +phoenix_test +azurex +evision +struct_access telemetry_metrics_cloudwatch -ecto_ulid -exception -jsonpatch -set_locale -geolix_adapter_mmdb2 -ecto_mysql_extras -topo +nx_signal +ex_ulid +circuits_uart +word_smith exgencode +rebar3_bench +nimble_publisher +pretty_log +machete +rambo +unicode_set +topo +envoy +geolix_adapter_mmdb2 +ecto_ulid +mneme exile openai_ex +jsonrs +benchee_json +benchee_html +encrypted_secrets +erlang_psq plug_rails_cookie_session_store -mimetype_parser +rebar3_appup_plugin +jsonpatch +base62 +tentacat +google_api_sheets aws_credentials -snap -mneme -rambo -avalanche -httpoison_retry -skogsra +exception +ecto_mysql_extras +ch +mimetype_parser +icalendar +re2 +lens +ex_meck +lcov_ex +oidcc_plug +pipes file_info -tentacat -jsonrs -base62 -ecto_morph -fast_tls -hound +ayesql +ex_aws_rds +muontrap ex_aws_route53 -ink -icalendar +httpoison_retry +lustre countriex -rebar3_appup_plugin -struct_access -lcov_ex +apex +telemetry_test +ink +elixir_auth_google +ecto_ch +ex_sha3 +safetensors +hound +fast_tls graceful_stop -ex_ulid -muontrap -ex_meck -paraxial -heap -elixpath +uid +libsalty2 +esq +hkdf +entropy_string +faktory_worker +ex_secp256k1 +surface eflame -let_me -safetensors exponent_server_sdk -bcrypt -ch -lustre +ex_gtin +peri erlang_color -ex_sha3 -apex -re2 -pretty_log -pipes -surface -glisten -phoenix_test +bimap +ecto_ltree +bcrypt +ex_aws_kinesis +logfmt_ex +heap +ring_logger +phx_component_helpers +memento +scholar +fsmx wolff basic_auth +limited_queue +cyanide +fe +mutex +ash_admin +codepagex escape -scholar -brod_gssapi -httpotion -mist -memento +eflambe recode -ecto_ch -benchee_json -benchee_html -logfmt_ex -entropy_string -fsmx -goal -rebar3_dialyzer_html -uid +httpotion +libcluster_postgres pinglix -esq -logstash_logger_formatter -stringprep -ex_secp256k1 remodel -elixir_auth_google +opentelemetry_dataloader +glisten +sbom +manifold +timescale +brod_gssapi +triplex +rebar3_dialyzer_html +gearbox kane -ex_aws_kinesis -eflambe -libcluster_postgres -fe -ecto_ltree -gramps -trailing_slash_plug +mist +cbuf +literature +logstash_logger_formatter drill +goal +trailing_slash_plug changeset_helpers -mutex -libsalty2 -literature -ring_logger -ex_aws_rds -hkdf -machete -wisp +elixpath +ex_rerun +live_dashboard_history +gleam_fetch ex_marshal -ecto_fragment_extras -logging -lens -gearbox -exrun -unicode_transform -syslog -rebar_raw_resource -codepagex -fuzzy_compare -nested_filter -better_params -oban_live_dashboard fast_xml -req_telemetry -tails -ayesql -bimap -ash_admin -the_fuzz -oidcc_plug +stringprep +solverl +alembix +wormwood +oban_live_dashboard gen_rmq -private +typedstruct rebar_erl_vsn -opentelemetry_dataloader +paseto +nested_filter +unicode_transform +rebar_raw_resource +gramps +ecto_fragment_extras +asn1_compiler ffmpex -limited_queue -vapor -platform -marceau -directories +tails ueberauth_facebook -content_security_policy -phx_component_helpers expression +exrun +plug_minify_html +content_security_policy +the_fuzz +wisp +better_params +apq +vapor +syslog +noether ethereumex +youid +logging ex_unit_span -pusher +private +ueberauth_oidcc airports -uuid_utils +protocol_ex +fuzzy_compare +astarte_rpc +ex_twiml +arc_ecto +pusher +http_client exldap -peri -manifold -cache_tab +ports blockbox -noether -arc_ecto -ex_twiml +cache_tab +directories +platform qdate -mix_unused -ports -faktory_worker -gleam_fetch -apq -nimble_publisher -erlydtl -gen_retry -ex_gtin -ex_rerun -wormwood -triplex +marceau +ecto_fields +readability tdiff +reading_time +slogger +tw_merge +machine_gun +egithub +geoip +gen_retry +salad_ui +erl_exercism +ecto_phone_number +version_tasks +ueberauth_cognito +cowboy_swagger elixir_map_to_xml -protocol_ex +iteraptor +pooler +erlydtl +dumper +yuri_template hash_ring -cyanide -alembix +bech32 +contexted +uuid_utils +erl_base58 +mix_unused +ash_graphql sendgrid -ueberauth_cognito -version_tasks -recaptcha +ex_utils +opentelemetry_zipkin +exprotobuf +ezstd +currency_formatter +bankster google_api_search_console +ex_waiter +temple +hammer_backend_mnesia +pipe +ex_docker_engine_api +splay_tree +lz4_erl +ecies burnex -cowboy_swagger -exprotobuf -ex_utils -egithub -asn1_compiler -youid passbook -gleam_httpc delegate -lfe -currency_formatter -pooler +php_serializer google_api_analytics_data -absinthe_constraints -bech32 -http_client -paseto +credo_contrib +req_fuse +google_api_fcm +exredis ex_open_street_map +absinthe_constraints +semver_erl +telemetry_wrappers +astarte_core +vercel calendarific +uxid +eetcd improvmx -vercel -ecto_phone_number -ex_docker_engine_api -encrypted_secrets -cbuf -trailing_format_plug -tw_merge -iteraptor -slogger -ezstd -hush -typedstruct -salad_ui -verbs -php_serializer -live_dashboard_history -opentelemetry_zipkin -json_web_token -doctest_setup -argv -temple -pipe -ethers -navigation_history -exredis -edown -telemetry_wrappers -credo_contrib -stun -erl_base58 -email_guard -jsonapi -ash_graphql -pkcs7 -solverl +anthropix unidecode -google_api_fcm -prima_ex_logger -splay_tree -sync -ecies -geoip -cva -envy -machine_gun -uniq_compat +stun +gleam_httpc +nerves +recaptcha +buffer html5ever +cqerl +ex_cldr_collation +property_table +libsecp256k1_nash_fork +composite absinthe_relay_keyset_connection -sbom +boruta +graphvix +ethers html_builder +envy logger_streaming_backend -readability -ueberauth_oidcc -property_table -ecto_fields -export -req_fuse -mysql -yajwt -sqlite3 -gleam_community_colour -pathex -contexted -bankster -rebar3_codecov -meeseeks -ex_ssl_options -buffer -hammer_backend_mnesia -libsecp256k1_nash_fork -lz4_erl -lz_string -iptools -mc_pbkdf2 -astarte_rpc -nerves -telemetry_test -ash_archival -astarte_core +verbs +pkcs7 +uniq_compat \ No newline at end of file From 8695bbaf9d0de29c748f0d3611f3fb6e886d0c95 Mon Sep 17 00:00:00 2001 From: Adam Wight Date: Thu, 3 Apr 2025 21:21:19 +0200 Subject: [PATCH 2/2] Depend on Jason library The erlang :json dependency isn't available until OTP 27, but this repo depends on elixir 1.17 so must support any OTP 25+ --- lib/mix/tasks/popular_packages.ex | 2 +- mix.exs | 1 + mix.lock | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/mix/tasks/popular_packages.ex b/lib/mix/tasks/popular_packages.ex index fdeb3ac..cdfd29f 100644 --- a/lib/mix/tasks/popular_packages.ex +++ b/lib/mix/tasks/popular_packages.ex @@ -59,6 +59,6 @@ defmodule Mix.Tasks.PopularPackages do [] ) - body |> to_string() |> :json.decode() + Jason.decode!(body) end end diff --git a/mix.exs b/mix.exs index bf2ae2c..db30b2c 100644 --- a/mix.exs +++ b/mix.exs @@ -19,6 +19,7 @@ defmodule LocalHexdocs.MixProject do defp deps do [ + {:jason, "~> 1.0"}, {:recursive_selective_match, only: :test} ] end diff --git a/mix.lock b/mix.lock index 05b6b81..134a57b 100644 --- a/mix.lock +++ b/mix.lock @@ -1,5 +1,6 @@ %{ "atomic_map": {:hex, :atomic_map, "0.9.3", "3c7f1302e0590164732d08ca999708efbb2cd768abf2911cf140280ce2dc499d", [:mix], [], "hexpm", "c237babf301bd2435bd85b96cffc973022b4cbb7721537059ee0dd3bb74938d2"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "recursive_selective_match": {:hex, :recursive_selective_match, "0.2.7", "c211d33ef1909e37540b4640cfbdf43803186c30a36d08e68126dc32196446f2", [:mix], [{:atomic_map, "~> 0.8", [hex: :atomic_map, repo: "hexpm", optional: false]}, {:utc_datetime, "~> 1.0", [hex: :utc_datetime, repo: "hexpm", optional: false]}], "hexpm", "3a38647b0366a0a2a9ed7631b197aae9ee6c9e2293c758cf6484e2bbf20f11d7"}, "utc_datetime": {:hex, :utc_datetime, "1.0.0", "617b7bac9de12d7afd99dfbbbc3cea7534ac044996bc40ab35f5bf78ca35dc6a", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "c6c7db85badc8e6133b08107c09fcee1bd7290ee868ae17924c827b9704d718e"}, }