Packages
phoenix
0.13.1
1.8.9
1.8.8
1.8.7
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.1
1.8.0
1.8.0-rc.4
1.8.0-rc.3
1.8.0-rc.2
1.8.0-rc.1
1.8.0-rc.0
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.7.0-rc.3
1.7.0-rc.2
1.7.0-rc.1
1.7.0-rc.0
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.15
1.5.14
1.5.13
1.5.12
1.5.11
1.5.10
1.5.9
1.5.8
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.0
1.4.18
1.4.17
1.4.16
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.3
1.4.0-rc.2
1.4.0-rc.1
1.4.0-rc.0
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.3.0-rc.3
1.3.0-rc.2
1.3.0-rc.1
1.3.0-rc.0
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.1
1.2.0-rc.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.17.1
0.17.0
0.16.1
0.16.0
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.2
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.0
0.4.1
0.4.0
0.3.1
0.3.0
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
Productive. Reliable. Fast. A productive web framework that does not compromise speed or maintainability.
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/phoenix.gen.model.ex
defmodule Mix.Tasks.Phoenix.Gen.Model do
use Mix.Task
@shortdoc "Generates an Ecto model"
@moduledoc """
Generates an Ecto model in your Phoenix application.
mix phoenix.gen.model User users name:string age:integer
The first argument is the module name followed by its plural
name (used for the schema).
The generated model will contain:
* a model in web/models
* a migration file for the repository
## Attributes
The resource fields are given using `name:type` syntax
where type are the types supported by Ecto. Ommitting
the type makes it default to `:string`:
mix phoenix.gen.model User users name age:integer
The generator also supports `belongs_to` associations:
mix phoenix.gen.model Post posts title user:belongs_to
This will result in a migration with an `:integer` column
of `:user_id` and create an index. It will also generate
the appropriate `belongs_to` entry in the model's schema.
Furthermore an array type can also be given if it is
supported by your database, although it requires the
type of the underlying array element to be given too:
mix phoenix.gen.model User users nicknames:array:string
## Namespaced resources
Resources can be namespaced, for such, it is just necessary
to namespace the first argument of the generator:
mix phoenix.gen.model Admin.User users name:string age:integer
"""
def run(args) do
{_opts, parsed, _} = OptionParser.parse(args, switches: [])
[singular, plural | attrs] = validate_args!(parsed)
attrs = Mix.Phoenix.attrs(attrs)
binding = Mix.Phoenix.inflect(singular)
params = Mix.Phoenix.params(attrs)
path = binding[:path]
migration = String.replace(path, "/", "_")
{assocs, attrs} = partition_attrs_and_assocs(attrs)
binding = binding ++
[attrs: attrs, plural: plural, types: types(attrs),
assocs: assocs(assocs), indexes: indexes(plural, assocs),
defaults: defaults(attrs), params: params]
Mix.Phoenix.copy_from source_dir, "", binding, [
{:eex, "migration.exs", "priv/repo/migrations/#{timestamp()}_create_#{migration}.exs"},
{:eex, "model.ex", "web/models/#{path}.ex"},
{:eex, "model_test.exs", "test/models/#{path}_test.exs"},
]
end
defp validate_args!([_, plural | _] = args) do
if String.contains?(plural, ":") do
raise_with_help
else
args
end
end
defp validate_args!(_) do
raise_with_help
end
defp raise_with_help do
Mix.raise """
mix phoenix.gen.model expects both singular and plural names
of the generated resource followed by any number of attributes:
mix phoenix.gen.model User users name:string
"""
end
defp partition_attrs_and_assocs(attrs) do
Enum.partition attrs, fn {_, kind} ->
kind == :belongs_to
end
end
defp assocs(assocs) do
Enum.reduce assocs, [], fn {key, _}, acc ->
assoc = Mix.Phoenix.inflect Atom.to_string(key)
[{key, :"#{key}_id", assoc[:module]} | acc]
end
end
defp indexes(plural, assocs) do
Enum.reduce assocs, [], fn {key, _}, acc ->
["create index(:#{plural}, [:#{key}_id])" | acc]
end
end
defp timestamp do
{{y, m, d}, {hh, mm, ss}} = :calendar.universal_time()
"#{y}#{pad(m)}#{pad(d)}#{pad(hh)}#{pad(mm)}#{pad(ss)}"
end
defp pad(i) when i < 10, do: << ?0, ?0 + i >>
defp pad(i), do: to_string(i)
defp types(attrs) do
Enum.into attrs, %{}, fn
{k, {c, v}} -> {k, {c, value_to_type(v)}}
{k, v} -> {k, value_to_type(v)}
end
end
defp defaults(attrs) do
Enum.into attrs, %{}, fn
{k, :boolean} -> {k, ", default: false"}
{k, _} -> {k, ""}
end
end
defp value_to_type(:text), do: :string
defp value_to_type(:uuid), do: Ecto.UUID
defp value_to_type(:date), do: Ecto.Date
defp value_to_type(:time), do: Ecto.Time
defp value_to_type(:datetime), do: Ecto.DateTime
defp value_to_type(v) do
if Code.ensure_loaded?(Ecto.Type) and not Ecto.Type.primitive?(v) do
Mix.raise "Unknown type `#{v}` given to generator"
else
v
end
end
defp source_dir do
Application.app_dir(:phoenix, "priv/templates/model")
end
end