Packages
tz
0.21.1
0.28.2
0.28.1
0.28.0
0.27.3
0.27.2
0.27.1
0.27.0
0.26.6
0.26.5
0.26.4
0.26.3
0.26.2
0.26.1
0.26.0
0.25.1
0.25.0
0.24.0
0.23.0
0.22.0
0.21.1
0.21.0
0.20.1
0.20.0
0.19.0
0.17.0
0.16.2
0.16.1
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.2
0.8.1
0.8.0
0.7.3
0.7.2
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Time zone support for Elixir
Current section
Files
Jump to
Current section
Files
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