Skip to content

Commit 009532a

Browse files
authored
Upgrade Elixir versions (#1252)
* Upgrade Ubuntu runner version * Update README * Update PostgreSQL install instructions * Upgrade PostgreSQL version in CI * Reformat codebase post Elixir version upgrade * Upgrade Elixir, Erlang versions in CI * Upgrade credo version to fix failing check * Fix exit status causing failing check * Fix changeset tests * Fix log tests * Fix dialyzer issues * Fix dependencies * Update CD workflow * Revert S3 dependency change * Fix more dialyzer issues * Revert "Fix more dialyzer issues" This reverts commit 374c3ad. * Fix dialyzer warning properly
1 parent 4fb1f4a commit 009532a

File tree

15 files changed

+56
-34
lines changed

15 files changed

+56
-34
lines changed

.credo.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
{Credo.Check.Readability.ModuleNames},
8484
{Credo.Check.Readability.ParenthesesOnZeroArityDefs},
8585
{Credo.Check.Readability.ParenthesesInCondition},
86-
{Credo.Check.Readability.PredicateFunctionNames},
86+
{Credo.Check.Readability.PredicateFunctionNames, exit_status: 0},
8787
{Credo.Check.Readability.PreferImplicitTry},
8888
{Credo.Check.Readability.RedundantBlankLines},
8989
{Credo.Check.Readability.StringSigils},

.github/workflows/ci.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ jobs:
2323
env:
2424
MIX_ENV: test
2525
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
26-
ELIXIR_VERSION: 1.13.4
27-
OTP_VERSION: 25.3.2
26+
ELIXIR_VERSION: 1.18.3
27+
OTP_VERSION: 27.3.3
2828
services:
2929
postgres:
30-
image: postgres:14.2
30+
image: postgres:17.4
3131
env:
3232
POSTGRES_USER: postgres
3333
POSTGRES_PASSWORD: postgres

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ Cadet is the web application powering Source Academy.
1414

1515
### System requirements
1616

17-
1. Elixir 1.13.3+ (current version: 1.13.4)
18-
2. Erlang/OTP 23.2.1+ (current version: 25.3.2)
19-
3. PostgreSQL 12+ (tested to be working up to 14.5)
17+
1. Elixir 1.18+ (current version: 1.18.3)
18+
2. Erlang/OTP 27+ (current version: 27.3.3)
19+
3. PostgreSQL 12+ (tested to be working up to 17)
2020

2121
It is probably okay to use a different version of PostgreSQL or Erlang/OTP, but using a different version of Elixir may result in differences in e.g. `mix format`.
2222

lib/cadet/assessments/assessments.ex

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -941,7 +941,7 @@ defmodule Cadet.Assessments do
941941
raw_answer,
942942
force_submit
943943
) do
944-
with {:ok, team} <- find_team(question.assessment.id, cr_id),
944+
with {:ok, _team} <- find_team(question.assessment.id, cr_id),
945945
{:ok, submission} <- find_or_create_submission(cr, question.assessment),
946946
{:status, true} <- {:status, force_submit or submission.status != :submitted},
947947
{:ok, _answer} <- insert_or_update_answer(submission, question, raw_answer, cr_id) do
@@ -2689,7 +2689,7 @@ defmodule Cadet.Assessments do
26892689

26902690
def has_last_modified_answer?(
26912691
question = %Question{},
2692-
cr = %CourseRegistration{id: cr_id},
2692+
cr = %CourseRegistration{id: _cr_id},
26932693
last_modified_at,
26942694
force_submit
26952695
) do
@@ -2700,15 +2700,6 @@ defmodule Cadet.Assessments do
27002700
else
27012701
{:status, _} ->
27022702
{:error, {:forbidden, "Assessment submission already finalised"}}
2703-
2704-
{:error, :race_condition} ->
2705-
{:error, {:internal_server_error, "Please try again later."}}
2706-
2707-
{:error, :invalid_vote} ->
2708-
{:error, {:bad_request, "Invalid vote! Vote is not saved."}}
2709-
2710-
_ ->
2711-
{:error, {:bad_request, "Missing or invalid parameter(s)"}}
27122703
end
27132704
end
27142705

lib/cadet/devices/devices.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ defmodule Cadet.Devices do
7272
with {:ok, device} <- maybe_insert_device(type, secret),
7373
{:ok, registration} <-
7474
%DeviceRegistration{}
75-
|> DeviceRegistration.changeset(%{user_id: user_id, device_id: device.id, title: title})
75+
|> DeviceRegistration.changeset(%{
76+
user_id: user_id,
77+
device_id: device.id,
78+
title: title
79+
})
7680
|> Repo.insert() do
7781
{:ok, registration |> Repo.preload(:device)}
7882
end

lib/cadet_web/admin_controllers/admin_assets_controller.ex

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,15 @@ defmodule CadetWeb.AdminAssetsController do
2222

2323
case Assets.delete_object(Courses.assets_prefix(course_reg.course), foldername, filename) do
2424
{:error, {status, message}} -> conn |> put_status(status) |> text(message)
25-
_ -> conn |> put_status(204) |> text('')
25+
_ -> conn |> put_status(204) |> text("")
2626
end
2727
end
2828

29+
# Ignore the dialyzer warning, just ctrl click the
30+
# `Assets.upload_to_s3` function to see the type,
31+
# it clearly returns a string URL
32+
@dialyzer {:no_match, upload: 2}
33+
2934
def upload(conn, %{
3035
"upload" => upload_params,
3136
"filename" => filename,
@@ -96,7 +101,9 @@ defmodule CadetWeb.AdminAssetsController do
96101
parameters do
97102
folderName(:path, :string, "Folder name", required: true)
98103

99-
fileName(:path, :string, "File path in folder, which may contain subfolders", required: true)
104+
fileName(:path, :string, "File path in folder, which may contain subfolders",
105+
required: true
106+
)
100107
end
101108

102109
security([%{JWT: []}])
@@ -115,7 +122,9 @@ defmodule CadetWeb.AdminAssetsController do
115122
parameters do
116123
folderName(:path, :string, "Folder name", required: true)
117124

118-
fileName(:path, :string, "File path in folder, which may contain subfolders", required: true)
125+
fileName(:path, :string, "File path in folder, which may contain subfolders",
126+
required: true
127+
)
119128
end
120129

121130
security([%{JWT: []}])

lib/cadet_web/admin_controllers/admin_courses_controller.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,11 @@ defmodule CadetWeb.AdminCoursesController do
143143
title("AdminSublanguage")
144144

145145
properties do
146-
chapter(:integer, "Chapter number from 1 to 4", required: true, minimum: 1, maximum: 4)
146+
chapter(:integer, "Chapter number from 1 to 4",
147+
required: true,
148+
minimum: 1,
149+
maximum: 4
150+
)
147151

148152
variant(Schema.ref(:SourceVariant), "Variant name", required: true)
149153
end

lib/cadet_web/admin_controllers/admin_grading_controller.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,9 @@ defmodule CadetWeb.AdminGradingController do
378378
required: true
379379
)
380380

381-
student(Schema.ref(:StudentInfo), "Student who created the submission", required: true)
381+
student(Schema.ref(:StudentInfo), "Student who created the submission",
382+
required: true
383+
)
382384

383385
unsubmittedBy(Schema.ref(:GraderInfo))
384386
unsubmittedAt(:string, "Last unsubmitted at", format: "date-time", required: false)

lib/cadet_web/admin_views/admin_assessments_view.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ defmodule CadetWeb.AdminAssessmentsView do
6464
end
6565

6666
def render("leaderboard.json", %{leaderboard: leaderboard}) do
67-
render_many(leaderboard, CadetWeb.AdminAssessmentsView, "contestEntry.json", as: :contestEntry)
67+
render_many(leaderboard, CadetWeb.AdminAssessmentsView, "contestEntry.json",
68+
as: :contestEntry
69+
)
6870
end
6971

7072
def render("contestEntry.json", %{contestEntry: contestEntry}) do

lib/cadet_web/views/assessments_view.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ defmodule CadetWeb.AssessmentsView do
6868
end
6969

7070
def render("leaderboard.json", %{leaderboard: leaderboard}) do
71-
render_many(leaderboard, CadetWeb.AdminAssessmentsView, "contestEntry.json", as: :contestEntry)
71+
render_many(leaderboard, CadetWeb.AdminAssessmentsView, "contestEntry.json",
72+
as: :contestEntry
73+
)
7274
end
7375

7476
def render("contestEntry.json", %{contestEntry: contestEntry}) do

mix.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"cowboy": {:hex, :cowboy, "2.13.0", "09d770dd5f6a22cc60c071f432cd7cb87776164527f205c5a6b0f24ff6b38990", [:make, :rebar3], [{:cowlib, ">= 2.14.0 and < 3.0.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, ">= 1.8.0 and < 3.0.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "e724d3a70995025d654c1992c7b11dbfea95205c047d86ff9bf1cda92ddc5614"},
1818
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
1919
"cowlib": {:hex, :cowlib, "2.14.0", "623791c56c1cc9df54a71a9c55147a401549917f00a2e48a6ae12b812c586ced", [:make, :rebar3], [], "hexpm", "0af652d1550c8411c3b58eed7a035a7fb088c0b86aff6bc504b0bc3b7f791aa2"},
20-
"credo": {:hex, :credo, "1.7.1", "6e26bbcc9e22eefbff7e43188e69924e78818e2fe6282487d0703652bc20fd62", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "e9871c6095a4c0381c89b6aa98bc6260a8ba6addccf7f6a53da8849c748a58a2"},
20+
"credo": {:hex, :credo, "1.7.12", "9e3c20463de4b5f3f23721527fcaf16722ec815e70ff6c60b86412c695d426c1", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8493d45c656c5427d9c729235b99d498bd133421f3e0a683e5c1b561471291e5"},
2121
"crontab": {:hex, :crontab, "1.1.13", "3bad04f050b9f7f1c237809e42223999c150656a6b2afbbfef597d56df2144c5", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "d67441bec989640e3afb94e123f45a2bc42d76e02988c9613885dc3d01cf7085"},
2222
"csv": {:hex, :csv, "3.2.2", "452f96414b39a176b7c390af6d8b78f15130dc6167fe3b836729131f515d843e", [:mix], [], "hexpm", "cbf256ff74a3fa01d9ec420d07b19c90d410ed9fe5b6d6e1bc7662edf35bc574"},
2323
"db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"},
@@ -46,7 +46,7 @@
4646
"expo": {:hex, :expo, "0.4.1", "1c61d18a5df197dfda38861673d392e642649a9cef7694d2f97a587b2cfb319b", [:mix], [], "hexpm", "2ff7ba7a798c8c543c12550fa0e2cbc81b95d4974c65855d8d15ba7b37a1ce47"},
4747
"exvcr": {:hex, :exvcr, "0.16.0", "11579f43c88ae81f57c82ce4f09e3ebda4c40117c859ed39e61a653c3a0b4ff4", [:mix], [{:exjsx, "~> 4.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:finch, "~> 0.16", [hex: :finch, repo: "hexpm", optional: true]}, {:httpoison, "~> 1.0 or ~> 2.0", [hex: :httpoison, repo: "hexpm", optional: true]}, {:httpotion, "~> 3.1", [hex: :httpotion, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:meck, "~> 0.9", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "8f576af22369942f7a1482baff1f31e2f45983cf6fac45d49d2bd2e84b4d5be8"},
4848
"faker": {:hex, :faker, "0.18.0", "943e479319a22ea4e8e39e8e076b81c02827d9302f3d32726c5bf82f430e6e14", [:mix], [], "hexpm", "bfbdd83958d78e2788e99ec9317c4816e651ad05e24cfd1196ce5db5b3e81797"},
49-
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
49+
"file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"},
5050
"gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"},
5151
"gen_stage": {:hex, :gen_stage, "1.2.1", "19d8b5e9a5996d813b8245338a28246307fd8b9c99d1237de199d21efc4c76a1", [:mix], [], "hexpm", "83e8be657fa05b992ffa6ac1e3af6d57aa50aace8f691fcf696ff02f8335b001"},
5252
"gettext": {:hex, :gettext, "0.22.2", "6bfca374de34ecc913a28ba391ca184d88d77810a3e427afa8454a71a51341ac", [:mix], [{:expo, "~> 0.4.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "8a2d389673aea82d7eae387e6a2ccc12660610080ae7beb19452cfdc1ec30f60"},

test/cadet/jobs/log_test.exs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ defmodule Cadet.Jobs.LogEntryTest do
2020
test "returns true (job runs) when log entry old enough" do
2121
%LogEntry{
2222
name: @name,
23-
last_run: Timex.subtract(DateTime.truncate(Timex.now(), :second), Duration.from_hours(25))
23+
last_run:
24+
Timex.now()
25+
|> Timex.subtract(Duration.from_hours(25))
26+
|> DateTime.truncate(:second)
2427
}
2528
|> Repo.insert!()
2629

@@ -37,7 +40,10 @@ defmodule Cadet.Jobs.LogEntryTest do
3740
test "returns false (job does not run) when log entry too recent" do
3841
%LogEntry{
3942
name: @name,
40-
last_run: Timex.subtract(DateTime.truncate(Timex.now(), :second), Duration.from_hours(23))
43+
last_run:
44+
Timex.now()
45+
|> Timex.subtract(Duration.from_hours(23))
46+
|> DateTime.truncate(:second)
4147
}
4248
|> Repo.insert!()
4349

test/cadet_web/admin_controllers/admin_sourcecast_controller_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ defmodule CadetWeb.AdminSourcecastControllerTest do
180180
conn = post(conn, build_url(course_id), %{"sourcecast" => %{}})
181181

182182
assert response(conn, 400) =~
183-
"audio can't be blank\nplaybackData can't be blank\ntitle can't be blank"
183+
"title can't be blank\naudio can't be blank\nplaybackData can't be blank"
184184
end
185185
end
186186

test/cadet_web/admin_controllers/admin_stories_controller_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ defmodule CadetWeb.AdminStoriesControllerTest do
122122
conn = post(conn, build_url(course_id), %{"story" => %{}})
123123

124124
assert response(conn, 400) ==
125-
"close_at can't be blank\nfilenames can't be blank\nopen_at can't be blank\ntitle can't be blank"
125+
"title can't be blank\nclose_at can't be blank\nopen_at can't be blank\nfilenames can't be blank"
126126
end
127127
end
128128

test/cadet_web/helpers/controller_helper_test.exs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ defmodule CadetWeb.ControllerHelperTest do
1616
assert_called(Conn.send_resp(:conn, :no_content, ""))
1717
end
1818

19-
test_with_mock "sends 204 with {:ok} and empty string", Conn, send_resp: fn _, _, _ -> nil end do
19+
test_with_mock "sends 204 with {:ok} and empty string", Conn,
20+
send_resp: fn _, _, _ -> nil end do
2021
handle_standard_result({:ok, nil}, :conn, "")
2122
assert_called(Conn.send_resp(:conn, :no_content, ""))
2223
end
2324

24-
test_with_mock "sends 204 with :ok and empty string", Conn, send_resp: fn _, _, _ -> nil end do
25+
test_with_mock "sends 204 with :ok and empty string", Conn,
26+
send_resp: fn _, _, _ -> nil end do
2527
handle_standard_result(:ok, :conn, "")
2628
assert_called(Conn.send_resp(:conn, :no_content, ""))
2729
end

0 commit comments

Comments
 (0)