Current section

Files

Jump to
tz lib updater.ex
Raw

lib/updater.ex

defmodule Tz.Updater do
@moduledoc false
require Logger
alias Tz.Compiler
alias Tz.HTTP
alias Tz.HTTP.HTTPResponse
alias Tz.IanaDataDir
alias Tz.PeriodsProvider
def maybe_recompile() do
IanaDataDir.maybe_copy_iana_files_to_custom_dir()
saved_tz_version = get_latest_tz_database()
if saved_tz_version != PeriodsProvider.iana_version() do
Logger.info("Tz is recompiling time zone periods...")
Code.compiler_options(ignore_module_conflict: true)
Compiler.compile()
Code.compiler_options(ignore_module_conflict: false)
Logger.info("Tz compilation done")
end
end
def fetch_iana_tz_version() do
case HTTP.get_http_client!().request("data.iana.org", "/time-zones/tzdb/version") do
%HTTPResponse{body: body, status_code: 200} ->
{:ok, body |> String.trim()}
_ ->
:error
end
end
defp get_latest_tz_database() do
latest_version_saved = IanaDataDir.tzdata_version()
case fetch_iana_tz_version() do
{:ok, latest_version} ->
if latest_version != latest_version_saved do
case update_tz_database(latest_version) do
:ok ->
IanaDataDir.delete_tzdata_dir(latest_version_saved)
latest_version
:error ->
latest_version_saved
end
else
latest_version
end
:error ->
Logger.error("Tz failed to read the latest version of the IANA time zone database")
latest_version_saved
end
end
defp update_tz_database(version) do
case download_tz_database(version) do
{:ok, content} ->
IanaDataDir.extract_tzdata_into_dir(version, content)
:ok
:error ->
Logger.error("Tz failed to download the latest archived IANA time zone database (version #{version})")
:error
end
end
defp download_tz_database(version) do
Logger.info("Tz is downloading the latest IANA time zone database (version #{version})...")
case HTTP.get_http_client!().request("data.iana.org", "/time-zones/releases/tzdata#{version}.tar.gz") do
%HTTPResponse{body: body, status_code: 200} ->
Logger.info("Tz download done")
{:ok, body}
_ ->
:error
end
end
end