Scaffold Labels and Milestones contexts.

6231492e74e3 · AtlantisPleb · · parent c103ce44975b

Scaffold Labels and Milestones contexts.

Generate OpenAgents.Labels and OpenAgents.Milestones contexts, schemas,
and migrations. Tests still pass; controllers and issue wiring for these
features are next.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By
Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

Deploy story

What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.

Not deployed through the forge lane

No push, promotion, build, or deploy receipt references this commit (receipts are scanned over a bounded recent window). Changes shipped by full node replacement carry their proof in the release gate receipt instead.

Changed files

  • added lib/openagents/labels.ex
  • added lib/openagents/labels/label.ex
  • added lib/openagents/milestones.ex
  • added lib/openagents/milestones/milestone.ex
  • added priv/repo/migrations/20260819202647_create_labels.exs
  • added priv/repo/migrations/20260819202649_create_milestones.exs
  • added test/openagents/labels_test.exs
  • added test/openagents/milestones_test.exs
  • added test/support/fixtures/labels_fixtures.ex
  • added test/support/fixtures/milestones_fixtures.ex

Diff

10 files changed, +452 -0

lib/openagents/labels.ex added +104

@@ -0,0 +1,104 @@

1
defmodule OpenAgents.Labels do
2
  @moduledoc """
3
  The Labels context.
4
  """
5
6
  import Ecto.Query, warn: false
7
  alias OpenAgents.Repo
8
9
  alias OpenAgents.Labels.Label
10
11
  @doc """
12
  Returns the list of labels.
13
14
  ## Examples
15
16
      iex> list_labels()
17
      [%Label{}, ...]
18
19
  """
20
  def list_labels do
21
    Repo.all(Label)
22
  end
23
24
  @doc """
25
  Gets a single label.
26
27
  Raises `Ecto.NoResultsError` if the Label does not exist.
28
29
  ## Examples
30
31
      iex> get_label!(123)
32
      %Label{}
33
34
      iex> get_label!(456)
35
      ** (Ecto.NoResultsError)
36
37
  """
38
  def get_label!(id), do: Repo.get!(Label, id)
39
40
  @doc """
41
  Creates a label.
42
43
  ## Examples
44
45
      iex> create_label(%{field: value})
46
      {:ok, %Label{}}
47
48
      iex> create_label(%{field: bad_value})
49
      {:error, %Ecto.Changeset{}}
50
51
  """
52
  def create_label(attrs) do
53
    %Label{}
54
    |> Label.changeset(attrs)
55
    |> Repo.insert()
56
  end
57
58
  @doc """
59
  Updates a label.
60
61
  ## Examples
62
63
      iex> update_label(label, %{field: new_value})
64
      {:ok, %Label{}}
65
66
      iex> update_label(label, %{field: bad_value})
67
      {:error, %Ecto.Changeset{}}
68
69
  """
70
  def update_label(%Label{} = label, attrs) do
71
    label
72
    |> Label.changeset(attrs)
73
    |> Repo.update()
74
  end
75
76
  @doc """
77
  Deletes a label.
78
79
  ## Examples
80
81
      iex> delete_label(label)
82
      {:ok, %Label{}}
83
84
      iex> delete_label(label)
85
      {:error, %Ecto.Changeset{}}
86
87
  """
88
  def delete_label(%Label{} = label) do
89
    Repo.delete(label)
90
  end
91
92
  @doc """
93
  Returns an `%Ecto.Changeset{}` for tracking label changes.
94
95
  ## Examples
96
97
      iex> change_label(label)
98
      %Ecto.Changeset{data: %Label{}}
99
100
  """
101
  def change_label(%Label{} = label, attrs \\ %{}) do
102
    Label.changeset(label, attrs)
103
  end
104
end
lib/openagents/labels/label.ex added +19

@@ -0,0 +1,19 @@

1
defmodule OpenAgents.Labels.Label do
2
  use Ecto.Schema
3
  import Ecto.Changeset
4
5
  schema "labels" do
6
    field :name, :string
7
    field :color, :string
8
    field :description, :string
9
10
    timestamps(type: :utc_datetime)
11
  end
12
13
  @doc false
14
  def changeset(label, attrs) do
15
    label
16
    |> cast(attrs, [:name, :color, :description])
17
    |> validate_required([:name, :color, :description])
18
  end
19
end
lib/openagents/milestones.ex added +104

@@ -0,0 +1,104 @@

1
defmodule OpenAgents.Milestones do
2
  @moduledoc """
3
  The Milestones context.
4
  """
5
6
  import Ecto.Query, warn: false
7
  alias OpenAgents.Repo
8
9
  alias OpenAgents.Milestones.Milestone
10
11
  @doc """
12
  Returns the list of milestones.
13
14
  ## Examples
15
16
      iex> list_milestones()
17
      [%Milestone{}, ...]
18
19
  """
20
  def list_milestones do
21
    Repo.all(Milestone)
22
  end
23
24
  @doc """
25
  Gets a single milestone.
26
27
  Raises `Ecto.NoResultsError` if the Milestone does not exist.
28
29
  ## Examples
30
31
      iex> get_milestone!(123)
32
      %Milestone{}
33
34
      iex> get_milestone!(456)
35
      ** (Ecto.NoResultsError)
36
37
  """
38
  def get_milestone!(id), do: Repo.get!(Milestone, id)
39
40
  @doc """
41
  Creates a milestone.
42
43
  ## Examples
44
45
      iex> create_milestone(%{field: value})
46
      {:ok, %Milestone{}}
47
48
      iex> create_milestone(%{field: bad_value})
49
      {:error, %Ecto.Changeset{}}
50
51
  """
52
  def create_milestone(attrs) do
53
    %Milestone{}
54
    |> Milestone.changeset(attrs)
55
    |> Repo.insert()
56
  end
57
58
  @doc """
59
  Updates a milestone.
60
61
  ## Examples
62
63
      iex> update_milestone(milestone, %{field: new_value})
64
      {:ok, %Milestone{}}
65
66
      iex> update_milestone(milestone, %{field: bad_value})
67
      {:error, %Ecto.Changeset{}}
68
69
  """
70
  def update_milestone(%Milestone{} = milestone, attrs) do
71
    milestone
72
    |> Milestone.changeset(attrs)
73
    |> Repo.update()
74
  end
75
76
  @doc """
77
  Deletes a milestone.
78
79
  ## Examples
80
81
      iex> delete_milestone(milestone)
82
      {:ok, %Milestone{}}
83
84
      iex> delete_milestone(milestone)
85
      {:error, %Ecto.Changeset{}}
86
87
  """
88
  def delete_milestone(%Milestone{} = milestone) do
89
    Repo.delete(milestone)
90
  end
91
92
  @doc """
93
  Returns an `%Ecto.Changeset{}` for tracking milestone changes.
94
95
  ## Examples
96
97
      iex> change_milestone(milestone)
98
      %Ecto.Changeset{data: %Milestone{}}
99
100
  """
101
  def change_milestone(%Milestone{} = milestone, attrs \\ %{}) do
102
    Milestone.changeset(milestone, attrs)
103
  end
104
end
lib/openagents/milestones/milestone.ex added +21

@@ -0,0 +1,21 @@

1
defmodule OpenAgents.Milestones.Milestone do
2
  use Ecto.Schema
3
  import Ecto.Changeset
4
5
  schema "milestones" do
6
    field :title, :string
7
    field :state, :string
8
    field :description, :string
9
    field :due_on, :string
10
    field :number, :integer
11
12
    timestamps(type: :utc_datetime)
13
  end
14
15
  @doc false
16
  def changeset(milestone, attrs) do
17
    milestone
18
    |> cast(attrs, [:title, :state, :description, :due_on, :number])
19
    |> validate_required([:title, :state, :description, :due_on, :number])
20
  end
21
end
priv/repo/migrations/20260819202647_create_labels.exs added +13

@@ -0,0 +1,13 @@

1
defmodule OpenAgents.Repo.Migrations.CreateLabels do
2
  use Ecto.Migration
3
4
  def change do
5
    create table(:labels) do
6
      add :name, :string
7
      add :color, :string
8
      add :description, :string
9
10
      timestamps(type: :utc_datetime)
11
    end
12
  end
13
end
priv/repo/migrations/20260819202649_create_milestones.exs added +15

@@ -0,0 +1,15 @@

1
defmodule OpenAgents.Repo.Migrations.CreateMilestones do
2
  use Ecto.Migration
3
4
  def change do
5
    create table(:milestones) do
6
      add :title, :string
7
      add :state, :string
8
      add :description, :string
9
      add :due_on, :string
10
      add :number, :integer
11
12
      timestamps(type: :utc_datetime)
13
    end
14
  end
15
end
test/openagents/labels_test.exs added +63

@@ -0,0 +1,63 @@

1
defmodule OpenAgents.LabelsTest do
2
  use OpenAgents.DataCase
3
4
  alias OpenAgents.Labels
5
6
  describe "labels" do
7
    alias OpenAgents.Labels.Label
8
9
    import OpenAgents.LabelsFixtures
10
11
    @invalid_attrs %{name: nil, description: nil, color: nil}
12
13
    test "list_labels/0 returns all labels" do
14
      label = label_fixture()
15
      assert Labels.list_labels() == [label]
16
    end
17
18
    test "get_label!/1 returns the label with given id" do
19
      label = label_fixture()
20
      assert Labels.get_label!(label.id) == label
21
    end
22
23
    test "create_label/1 with valid data creates a label" do
24
      valid_attrs = %{name: "some name", description: "some description", color: "some color"}
25
26
      assert {:ok, %Label{} = label} = Labels.create_label(valid_attrs)
27
      assert label.name == "some name"
28
      assert label.description == "some description"
29
      assert label.color == "some color"
30
    end
31
32
    test "create_label/1 with invalid data returns error changeset" do
33
      assert {:error, %Ecto.Changeset{}} = Labels.create_label(@invalid_attrs)
34
    end
35
36
    test "update_label/2 with valid data updates the label" do
37
      label = label_fixture()
38
      update_attrs = %{name: "some updated name", description: "some updated description", color: "some updated color"}
39
40
      assert {:ok, %Label{} = label} = Labels.update_label(label, update_attrs)
41
      assert label.name == "some updated name"
42
      assert label.description == "some updated description"
43
      assert label.color == "some updated color"
44
    end
45
46
    test "update_label/2 with invalid data returns error changeset" do
47
      label = label_fixture()
48
      assert {:error, %Ecto.Changeset{}} = Labels.update_label(label, @invalid_attrs)
49
      assert label == Labels.get_label!(label.id)
50
    end
51
52
    test "delete_label/1 deletes the label" do
53
      label = label_fixture()
54
      assert {:ok, %Label{}} = Labels.delete_label(label)
55
      assert_raise Ecto.NoResultsError, fn -> Labels.get_label!(label.id) end
56
    end
57
58
    test "change_label/1 returns a label changeset" do
59
      label = label_fixture()
60
      assert %Ecto.Changeset{} = Labels.change_label(label)
61
    end
62
  end
63
end
test/openagents/milestones_test.exs added +67

@@ -0,0 +1,67 @@

1
defmodule OpenAgents.MilestonesTest do
2
  use OpenAgents.DataCase
3
4
  alias OpenAgents.Milestones
5
6
  describe "milestones" do
7
    alias OpenAgents.Milestones.Milestone
8
9
    import OpenAgents.MilestonesFixtures
10
11
    @invalid_attrs %{state: nil, description: nil, title: nil, number: nil, due_on: nil}
12
13
    test "list_milestones/0 returns all milestones" do
14
      milestone = milestone_fixture()
15
      assert Milestones.list_milestones() == [milestone]
16
    end
17
18
    test "get_milestone!/1 returns the milestone with given id" do
19
      milestone = milestone_fixture()
20
      assert Milestones.get_milestone!(milestone.id) == milestone
21
    end
22
23
    test "create_milestone/1 with valid data creates a milestone" do
24
      valid_attrs = %{state: "some state", description: "some description", title: "some title", number: 42, due_on: "some due_on"}
25
26
      assert {:ok, %Milestone{} = milestone} = Milestones.create_milestone(valid_attrs)
27
      assert milestone.state == "some state"
28
      assert milestone.description == "some description"
29
      assert milestone.title == "some title"
30
      assert milestone.number == 42
31
      assert milestone.due_on == "some due_on"
32
    end
33
34
    test "create_milestone/1 with invalid data returns error changeset" do
35
      assert {:error, %Ecto.Changeset{}} = Milestones.create_milestone(@invalid_attrs)
36
    end
37
38
    test "update_milestone/2 with valid data updates the milestone" do
39
      milestone = milestone_fixture()
40
      update_attrs = %{state: "some updated state", description: "some updated description", title: "some updated title", number: 43, due_on: "some updated due_on"}
41
42
      assert {:ok, %Milestone{} = milestone} = Milestones.update_milestone(milestone, update_attrs)
43
      assert milestone.state == "some updated state"
44
      assert milestone.description == "some updated description"
45
      assert milestone.title == "some updated title"
46
      assert milestone.number == 43
47
      assert milestone.due_on == "some updated due_on"
48
    end
49
50
    test "update_milestone/2 with invalid data returns error changeset" do
51
      milestone = milestone_fixture()
52
      assert {:error, %Ecto.Changeset{}} = Milestones.update_milestone(milestone, @invalid_attrs)
53
      assert milestone == Milestones.get_milestone!(milestone.id)
54
    end
55
56
    test "delete_milestone/1 deletes the milestone" do
57
      milestone = milestone_fixture()
58
      assert {:ok, %Milestone{}} = Milestones.delete_milestone(milestone)
59
      assert_raise Ecto.NoResultsError, fn -> Milestones.get_milestone!(milestone.id) end
60
    end
61
62
    test "change_milestone/1 returns a milestone changeset" do
63
      milestone = milestone_fixture()
64
      assert %Ecto.Changeset{} = Milestones.change_milestone(milestone)
65
    end
66
  end
67
end
test/support/fixtures/labels_fixtures.ex added +22

@@ -0,0 +1,22 @@

1
defmodule OpenAgents.LabelsFixtures do
2
  @moduledoc """
3
  This module defines test helpers for creating
4
  entities via the `OpenAgents.Labels` context.
5
  """
6
7
  @doc """
8
  Generate a label.
9
  """
10
  def label_fixture(attrs \\ %{}) do
11
    {:ok, label} =
12
      attrs
13
      |> Enum.into(%{
14
        color: "some color",
15
        description: "some description",
16
        name: "some name"
17
      })
18
      |> OpenAgents.Labels.create_label()
19
20
    label
21
  end
22
end
test/support/fixtures/milestones_fixtures.ex added +24

@@ -0,0 +1,24 @@

1
defmodule OpenAgents.MilestonesFixtures do
2
  @moduledoc """
3
  This module defines test helpers for creating
4
  entities via the `OpenAgents.Milestones` context.
5
  """
6
7
  @doc """
8
  Generate a milestone.
9
  """
10
  def milestone_fixture(attrs \\ %{}) do
11
    {:ok, milestone} =
12
      attrs
13
      |> Enum.into(%{
14
        description: "some description",
15
        due_on: "some due_on",
16
        number: 42,
17
        state: "some state",
18
        title: "some title"
19
      })
20
      |> OpenAgents.Milestones.create_milestone()
21
22
    milestone
23
  end
24
end

This page updates live while a promote is in flight · changelog