initial commit.

This commit is contained in:
user 2024-12-18 08:42:34 -05:00
parent 89e6ba1ccf
commit 2cad1281c0
8 changed files with 126 additions and 0 deletions

4
.formatter.exs Normal file
View File

@ -0,0 +1,4 @@
# Used by "mix format"
[
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
]

26
.gitignore vendored Normal file
View File

@ -0,0 +1,26 @@
# The directory Mix will write compiled artifacts to.
/_build/
# If you run "mix test --cover", coverage assets end up here.
/cover/
# The directory Mix downloads your dependencies sources to.
/deps/
# Where third-party dependencies like ExDoc output generated docs.
/doc/
# Ignore .fetch files in case you like to edit your project deps locally.
/.fetch
# If the VM crashes, it generates a dump, let's ignore it too.
erl_crash.dump
# Also ignore archive artifacts (built via "mix archive.build").
*.ez
# Ignore package tarball (built via "mix hex.build").
yt_ext-*.tar
# Temporary files, for example, from tests.
/tmp/

18
lib/yt_ext.ex Normal file
View File

@ -0,0 +1,18 @@
defmodule YtExt do
@moduledoc """
Documentation for `YtExt`.
"""
@doc """
Hello world.
## Examples
iex> YtExt.hello()
:world
"""
def hello do
:world
end
end

20
lib/yt_ext/application.ex Normal file
View File

@ -0,0 +1,20 @@
defmodule YtExt.Application do
# See https://hexdocs.pm/elixir/Application.html
# for more information on OTP Applications
@moduledoc false
use Application
@impl true
def start(_type, _args) do
children = [
# Starts a worker by calling: YtExt.Worker.start_link(arg)
# {YtExt.Worker, arg}
]
# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: YtExt.Supervisor]
Supervisor.start_link(children, opts)
end
end

20
lib/yt_ext/youtube_id.ex Normal file
View File

@ -0,0 +1,20 @@
defmodule YouTubeID do
@youtube_chars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
@base length(String.graphemes(@youtube_chars))
def to_integer(<<video_id::binary-size(11)>>) do
video_id
|> String.graphemes()
|> Enum.reverse()
|> Enum.with_index()
|> Enum.reduce(0, fn {char, index}, acc ->
char_value = contains_at(@youtube_chars, char)
acc + char_value * trunc(:math.pow(@base, index))
end)
end
defp contains_at(string, char) do
String.split(string, "", trim: true)
|> Enum.find_index(&(&1 == char))
end
end

29
mix.exs Normal file
View File

@ -0,0 +1,29 @@
defmodule YtExt.MixProject do
use Mix.Project
def project do
[
app: :yt_ext,
version: "0.1.0",
elixir: "~> 1.17",
start_permanent: Mix.env() == :prod,
deps: deps()
]
end
# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger],
mod: {YtExt.Application, []}
]
end
# Run "mix help deps" to learn about dependencies.
defp deps do
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
]
end
end

1
test/test_helper.exs Normal file
View File

@ -0,0 +1 @@
ExUnit.start()

8
test/yt_ext_test.exs Normal file
View File

@ -0,0 +1,8 @@
defmodule YtExtTest do
use ExUnit.Case
doctest YtExt
test "greets the world" do
assert YtExt.hello() == :world
end
end