defmodule Mix.Tasks.GenerateAgent do
# Get user agent list from
# http://www.user-agents.org/allagents.xml
@moduledoc """
The generate_agent mix task: `mix help generate_agent`
Convert
- `priv/allagents.xml`
- `priv/mostcommonuseragents.txt`
Into Elixir and save to `lib/user_agent/data.ex`
The `priv/allagents.xml` is downloaded from *http://www.user-agents.org/allagents.xml*
The `priv/mostcommonuseragents.txt` is get from *https://techblog.willshouse.com/2012/01/03/most-common-user-agents/*
"""
use Mix.Task
import SweetXml
@shortdoc "generate lib/user_agent/all_agents.ex"
def run(_) do
most_common =
:code.priv_dir(:user_agent_generator)
|> Path.join("mostcommonuseragents.txt")
|> File.read!()
|> String.split("\n")
|> Enum.map(&String.trim/1)
# IO.inspect most_common
all_agents =
:code.priv_dir(:user_agent_generator)
|> Path.join("allagents.xml")
|> File.read!()
|> xpath(
~x"//user-agents/user-agent"l,
id: ~x"./ID/text()"s,
name: ~x"./String/text()"s,
description: ~x"./Description/text()"s,
type: ~x"./Type/text()"s,
comment: ~x"./Comment/text()"s,
link1: ~x"./Link1/text()"s,
link2: ~x"./Link2/text()"s
)
template = """
defmodule UserAgent.Data do
# Auto generated, do not edit
def all_agents() do
#{inspect(all_agents, limit: :infinity, pretty: true)}
end
def most_common() do
#{inspect(most_common, limit: :infinity, pretty: true)}
end
end
"""
# IO.puts template
generate_file = Path.join([__DIR__, "..", "..", "user_agent", "data.ex"])
# IO.puts generate_file
File.write(generate_file, template)
end
end