Packages
phoenix
1.0.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
The generated model can be skipped with `--no-migration`.
## 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
via references:
mix phoenix.gen.model Post posts title user_id:references:users
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: [migration: :boolean])
[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, "/", "_")
Mix.Phoenix.check_module_name_availability!(binding[:module])
{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]
files = [
{:eex, "model.ex", "web/models/#{path}.ex"},
{:eex, "model_test.exs", "test/models/#{path}_test.exs"},
]
if opts[:migration] != false do
files =
[{:eex, "migration.exs", "priv/repo/migrations/#{timestamp()}_create_#{migration}.exs"}|files]
end
Mix.Phoenix.copy_from paths(), "priv/templates/phoenix.gen.model", "", binding, files
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
{_, {:references, _}} ->
true
{key, :references} ->
Mix.raise """
Phoenix generators expect the table to be given to #{key}:references.
For example:
mix phoenix.gen.model Comment comments body:text post_id:references:posts
"""
_ ->
false
end
end
defp assocs(assocs) do
Enum.map assocs, fn {key_id, {:references, source}} ->
key = String.replace(Atom.to_string(key_id), "_id", "")
assoc = Mix.Phoenix.inflect key
{String.to_atom(key), key_id, assoc[:module], source}
end
end
defp indexes(plural, assocs) do
Enum.map assocs, fn {key, _} ->
"create index(:#{plural}, [:#{key}])"
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 paths do
[".", :phoenix]
end
end