From 0074e1ab846a091ba3bbfbfb76660498b3e4b4be Mon Sep 17 00:00:00 2001 From: angelsl Date: Fri, 14 Jan 2022 17:48:48 +0800 Subject: [PATCH] Update dependencies --- .github/workflows/cd.yml | 4 +- .github/workflows/ci.yml | 4 +- lib/cadet/accounts/course_registration.ex | 9 ++++ lib/cadet/accounts/notifications.ex | 10 ++-- lib/cadet/accounts/query.ex | 2 +- lib/cadet/accounts/user.ex | 7 +++ lib/cadet/assessments/answer.ex | 2 + lib/cadet/assessments/assessment.ex | 2 + lib/cadet/assessments/assessments.ex | 20 ++++---- lib/cadet/assessments/question.ex | 2 + lib/cadet/assessments/submission.ex | 2 + lib/cadet/courses/course.ex | 13 +++++ lib/cadet/courses/courses.ex | 8 +-- lib/cadet/courses/group.ex | 6 +++ lib/cadet/devices/device.ex | 2 + lib/cadet/devices/device_registration.ex | 2 + lib/cadet/devices/devices.ex | 26 +++++----- lib/cadet/helpers/display_helper.ex | 8 ++- lib/cadet/helpers/model_helper.ex | 2 +- lib/cadet/incentives/achievement.ex | 2 + lib/cadet/incentives/achievements.ex | 6 +-- lib/cadet/incentives/goal.ex | 2 + lib/cadet/incentives/goals.ex | 6 +-- lib/cadet_web/controllers/auth_controller.ex | 2 +- lib/mix/tasks/token.ex | 2 +- mix.lock | 53 ++++++++++---------- test/support/xml_generator.ex | 2 +- 27 files changed, 128 insertions(+), 78 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 32ed44156..5150d01f6 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -24,8 +24,8 @@ jobs: env: MIX_ENV: prod GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - ELIXIR_VERSION: '1.12.3' - OTP_VERSION: '24.0.6' + ELIXIR_VERSION: '1.13.2' + OTP_VERSION: '24.2' steps: - uses: rlespinasse/github-slug-action@v3.x - uses: actions/checkout@v2 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d58830cc..9963aea69 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,8 +23,8 @@ jobs: env: MIX_ENV: test GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - ELIXIR_VERSION: '1.12.3' - OTP_VERSION: '24.0.6' + ELIXIR_VERSION: '1.13.2' + OTP_VERSION: '24.2' services: postgres: image: postgres:13.1 diff --git a/lib/cadet/accounts/course_registration.ex b/lib/cadet/accounts/course_registration.ex index ca2aa6c47..477526d91 100644 --- a/lib/cadet/accounts/course_registration.ex +++ b/lib/cadet/accounts/course_registration.ex @@ -7,6 +7,15 @@ defmodule Cadet.Accounts.CourseRegistration do alias Cadet.Accounts.{Role, User} alias Cadet.Courses.{Course, Group} + @type t :: %__MODULE__{ + role: Role.t(), + game_states: %{}, + agreed_to_research: boolean(), + group: Group.t() | nil, + user: User.t() | nil, + course: Course.t() | nil + } + schema "course_registrations" do field(:role, Role) field(:game_states, :map) diff --git a/lib/cadet/accounts/notifications.ex b/lib/cadet/accounts/notifications.ex index cec15a064..8ee558eb3 100644 --- a/lib/cadet/accounts/notifications.ex +++ b/lib/cadet/accounts/notifications.ex @@ -15,7 +15,7 @@ defmodule Cadet.Accounts.Notifications do @doc """ Fetches all unread notifications belonging to a course_reg as an array """ - @spec fetch(%CourseRegistration{}) :: {:ok, {:array, Notification}} + @spec fetch(CourseRegistration.t()) :: {:ok, {:array, Notification}} def fetch(course_reg = %CourseRegistration{}) do notifications = Notification @@ -101,7 +101,7 @@ defmodule Cadet.Accounts.Notifications do @doc """ Changes read status of notification(s) from false to true. """ - @spec acknowledge({:array, :integer}, %CourseRegistration{}) :: + @spec acknowledge({:array, :integer}, CourseRegistration.t()) :: {:ok, Ecto.Schema.t()} | {:error, any} | {:error, Ecto.Multi.name(), any, %{Ecto.Multi.name() => any}} @@ -123,7 +123,7 @@ defmodule Cadet.Accounts.Notifications do |> Repo.transaction() end - @spec acknowledge(:integer, %CourseRegistration{}) :: {:ok, Ecto.Schema.t()} | {:error, any()} + @spec acknowledge(:integer, CourseRegistration.t()) :: {:ok, Ecto.Schema.t()} | {:error, any()} def acknowledge(notification_id, course_reg = %CourseRegistration{}) do notification = Repo.get_by(Notification, id: notification_id, course_reg_id: course_reg.id) @@ -141,7 +141,7 @@ defmodule Cadet.Accounts.Notifications do @doc """ Function that handles notifications when a submission is unsubmitted. """ - @spec handle_unsubmit_notifications(integer(), %CourseRegistration{}) :: + @spec handle_unsubmit_notifications(integer(), CourseRegistration.t()) :: {:ok, Ecto.Schema.t()} | {:error, Ecto.Changeset.t()} def handle_unsubmit_notifications(assessment_id, student = %CourseRegistration{}) when is_ecto_id(assessment_id) do @@ -220,7 +220,7 @@ defmodule Cadet.Accounts.Notifications do When a student has finalized a submission, writes a notification to the corresponding grader (Avenger) in charge of the student. """ - @spec write_notification_when_student_submits(%Submission{}) :: + @spec write_notification_when_student_submits(Submission.t()) :: {:ok, Ecto.Schema.t()} | {:error, Ecto.Changeset.t()} def write_notification_when_student_submits(submission = %Submission{}) do avenger_id = get_avenger_id_of(submission.student_id) diff --git a/lib/cadet/accounts/query.ex b/lib/cadet/accounts/query.ex index 3c368d1f1..66f5f0fed 100644 --- a/lib/cadet/accounts/query.ex +++ b/lib/cadet/accounts/query.ex @@ -20,7 +20,7 @@ defmodule Cadet.Accounts.Query do |> preload(:latest_viewed_course) end - @spec students_of(%CourseRegistration{}) :: Ecto.Query.t() + @spec students_of(CourseRegistration.t()) :: Ecto.Query.t() def students_of(course_reg = %CourseRegistration{course_id: course_id}) do # Note that staff role is not check here as we assume that # group leader is assign to a staff validated by group changeset diff --git a/lib/cadet/accounts/user.ex b/lib/cadet/accounts/user.ex index e14708510..db6e0546c 100644 --- a/lib/cadet/accounts/user.ex +++ b/lib/cadet/accounts/user.ex @@ -8,6 +8,13 @@ defmodule Cadet.Accounts.User do alias Cadet.Accounts.CourseRegistration alias Cadet.Courses.Course + @type t :: %__MODULE__{ + name: String.t(), + username: String.t(), + provider: String.t(), + latest_viewed_course: Course.t() + } + schema "users" do field(:name, :string) field(:username, :string) diff --git a/lib/cadet/assessments/answer.ex b/lib/cadet/assessments/answer.ex index 1f8a04f5c..1035591ab 100644 --- a/lib/cadet/assessments/answer.ex +++ b/lib/cadet/assessments/answer.ex @@ -11,6 +11,8 @@ defmodule Cadet.Assessments.Answer do alias Cadet.Assessments.AnswerTypes.{MCQAnswer, ProgrammingAnswer, VotingAnswer} alias Cadet.Assessments.{Question, QuestionType, Submission} + @type t :: %__MODULE__{} + schema "answers" do # used to compare answers with others field(:relative_score, :float, default: 0.0) diff --git a/lib/cadet/assessments/assessment.ex b/lib/cadet/assessments/assessment.ex index 547e3e6e3..77d0ef513 100644 --- a/lib/cadet/assessments/assessment.ex +++ b/lib/cadet/assessments/assessment.ex @@ -10,6 +10,8 @@ defmodule Cadet.Assessments.Assessment do alias Cadet.Assessments.{AssessmentAccess, Question, SubmissionStatus, Upload} alias Cadet.Courses.{Course, AssessmentConfig} + @type t :: %__MODULE__{} + schema "assessments" do field(:access, AssessmentAccess, virtual: true, default: :public) field(:max_xp, :integer, virtual: true) diff --git a/lib/cadet/assessments/assessments.ex b/lib/cadet/assessments/assessments.ex index d37b0c45c..914c87f1a 100644 --- a/lib/cadet/assessments/assessments.ex +++ b/lib/cadet/assessments/assessments.ex @@ -61,7 +61,7 @@ defmodule Cadet.Assessments do Repo.delete_all(submissions) end - @spec user_max_xp(%CourseRegistration{}) :: integer() + @spec user_max_xp(CourseRegistration.t()) :: integer() def user_max_xp(%CourseRegistration{id: cr_id}) do Submission |> where(status: ^:submitted) @@ -127,7 +127,7 @@ defmodule Cadet.Assessments do story end - @spec get_user_story_by_type(%CourseRegistration{}, :unattempted | :attempted) :: + @spec get_user_story_by_type(CourseRegistration.t(), :unattempted | :attempted) :: String.t() | nil def get_user_story_by_type(%CourseRegistration{id: cr_id}, type) when is_atom(type) do @@ -812,8 +812,8 @@ defmodule Cadet.Assessments do end end - @spec update_submission_status_and_xp_bonus(%Submission{}) :: - {:ok, %Submission{}} | {:error, Ecto.Changeset.t()} + @spec update_submission_status_and_xp_bonus(Submission.t()) :: + {:ok, Submission.t()} | {:error, Ecto.Changeset.t()} defp update_submission_status_and_xp_bonus(submission = %Submission{}) do assessment = submission.assessment assessment_conifg = Repo.get_by(AssessmentConfig, id: assessment.config_id) @@ -1118,7 +1118,7 @@ defmodule Cadet.Assessments do The return value is {:ok, submissions} if no errors, else it is {:error, {:unauthorized, "Forbidden."}} """ - @spec all_submissions_by_grader_for_index(%CourseRegistration{}) :: + @spec all_submissions_by_grader_for_index(CourseRegistration.t()) :: {:ok, String.t()} def all_submissions_by_grader_for_index( grader = %CourseRegistration{course_id: course_id}, @@ -1221,7 +1221,7 @@ defmodule Cadet.Assessments do end @spec get_answers_in_submission(integer() | String.t()) :: - {:ok, [%Answer{}]} | {:error, {:bad_request | :unauthorized, String.t()}} + {:ok, [Answer.t()]} | {:error, {:bad_request | :unauthorized, String.t()}} def get_answers_in_submission(id) when is_ecto_id(id) do answer_query = Answer @@ -1286,7 +1286,7 @@ defmodule Cadet.Assessments do @spec update_grading_info( %{submission_id: integer() | String.t(), question_id: integer() | String.t()}, %{}, - %CourseRegistration{} + CourseRegistration.t() ) :: {:ok, nil} | {:error, {:unauthorized | :bad_request | :internal_server_error, String.t()}} @@ -1347,7 +1347,7 @@ defmodule Cadet.Assessments do {:error, {:unauthorized, "User is not permitted to grade."}} end - @spec force_regrade_submission(integer() | String.t(), %CourseRegistration{}) :: + @spec force_regrade_submission(integer() | String.t(), CourseRegistration.t()) :: {:ok, nil} | {:error, {:forbidden | :not_found, String.t()}} def force_regrade_submission( submission_id, @@ -1374,7 +1374,7 @@ defmodule Cadet.Assessments do @spec force_regrade_answer( integer() | String.t(), integer() | String.t(), - %CourseRegistration{} + CourseRegistration.t() ) :: {:ok, nil} | {:error, {:forbidden | :not_found, String.t()}} def force_regrade_answer( @@ -1423,7 +1423,7 @@ defmodule Cadet.Assessments do end # Checks if an assessment is open and published. - @spec is_open?(%Assessment{}) :: boolean() + @spec is_open?(Assessment.t()) :: boolean() def is_open?(%Assessment{open_at: open_at, close_at: close_at, is_published: is_published}) do Timex.between?(Timex.now(), open_at, close_at, inclusive: :start) and is_published end diff --git a/lib/cadet/assessments/question.ex b/lib/cadet/assessments/question.ex index 7ab6e45c5..8ab5dfe16 100644 --- a/lib/cadet/assessments/question.ex +++ b/lib/cadet/assessments/question.ex @@ -8,6 +8,8 @@ defmodule Cadet.Assessments.Question do alias Cadet.Assessments.{Assessment, Library, QuestionType} alias Cadet.Assessments.QuestionTypes.{MCQQuestion, ProgrammingQuestion, VotingQuestion} + @type t :: %__MODULE__{} + schema "questions" do field(:display_order, :integer) field(:question, :map) diff --git a/lib/cadet/assessments/submission.ex b/lib/cadet/assessments/submission.ex index 5d789f334..eb8164065 100644 --- a/lib/cadet/assessments/submission.ex +++ b/lib/cadet/assessments/submission.ex @@ -5,6 +5,8 @@ defmodule Cadet.Assessments.Submission do alias Cadet.Accounts.CourseRegistration alias Cadet.Assessments.{Answer, Assessment, SubmissionStatus} + @type t :: %__MODULE__{} + schema "submissions" do field(:xp, :integer, virtual: true) field(:xp_adjustment, :integer, virtual: true) diff --git a/lib/cadet/courses/course.ex b/lib/cadet/courses/course.ex index c224c875d..9b9ebaeb1 100644 --- a/lib/cadet/courses/course.ex +++ b/lib/cadet/courses/course.ex @@ -6,6 +6,19 @@ defmodule Cadet.Courses.Course do alias Cadet.Courses.AssessmentConfig + @type t :: %__MODULE__{ + course_name: String.t(), + course_short_name: String.t(), + viewable: boolean(), + enable_game: boolean(), + enable_achievements: boolean(), + enable_sourcecast: boolean(), + source_chapter: integer(), + source_variant: String.t(), + module_help_text: String.t(), + assets_prefix: String.t() | nil + } + schema "courses" do field(:course_name, :string) field(:course_short_name, :string) diff --git a/lib/cadet/courses/courses.ex b/lib/cadet/courses/courses.ex index 5fd1b4da2..bd1ba4a70 100644 --- a/lib/cadet/courses/courses.ex +++ b/lib/cadet/courses/courses.ex @@ -43,7 +43,7 @@ defmodule Cadet.Courses do Returns the course configuration for the specified course. """ @spec get_course_config(integer) :: - {:ok, %Course{}} | {:error, {:bad_request, String.t()}} + {:ok, Course.t()} | {:error, {:bad_request, String.t()}} def get_course_config(course_id) when is_ecto_id(course_id) do case retrieve_course(course_id) do nil -> @@ -65,7 +65,7 @@ defmodule Cadet.Courses do Updates the general course configuration for the specified course """ @spec update_course_config(integer, %{}) :: - {:ok, %Course{}} | {:error, Ecto.Changeset.t()} | {:error, {:bad_request, String.t()}} + {:ok, Course.t()} | {:error, Ecto.Changeset.t()} | {:error, {:bad_request, String.t()}} def update_course_config(course_id, params) when is_ecto_id(course_id) do case retrieve_course(course_id) do nil -> @@ -299,7 +299,7 @@ defmodule Cadet.Courses do Get a group based on the group name and course id or create one if it doesn't exist """ @spec get_or_create_group(String.t(), integer()) :: - {:ok, %Group{}} | {:error, Ecto.Changeset.t()} + {:ok, Group.t()} | {:error, Ecto.Changeset.t()} def get_or_create_group(name, course_id) when is_binary(name) and is_ecto_id(course_id) do Group |> where(name: ^name) @@ -406,7 +406,7 @@ defmodule Cadet.Courses do # |> Repo.preload(:uploader) # end - @spec assets_prefix(%Course{}) :: binary() + @spec assets_prefix(Course.t()) :: binary() def assets_prefix(course) do course.assets_prefix || "#{Assets.assets_prefix()}#{course.id}/" end diff --git a/lib/cadet/courses/group.ex b/lib/cadet/courses/group.ex index 838de20cf..d52badae9 100644 --- a/lib/cadet/courses/group.ex +++ b/lib/cadet/courses/group.ex @@ -9,6 +9,12 @@ defmodule Cadet.Courses.Group do alias Cadet.Accounts.CourseRegistration alias Cadet.Courses.Course + @type t :: %__MODULE__{ + name: String.t(), + leader: CourseRegistration.t() | nil, + course: Course.t() | nil + } + schema "groups" do field(:name, :string) belongs_to(:leader, CourseRegistration) diff --git a/lib/cadet/devices/device.ex b/lib/cadet/devices/device.ex index 3320f3799..8c36f5dca 100644 --- a/lib/cadet/devices/device.ex +++ b/lib/cadet/devices/device.ex @@ -5,6 +5,8 @@ defmodule Cadet.Devices.Device do use Cadet, :model + @type t :: %__MODULE__{} + schema "devices" do field(:secret, :string) field(:type, :string) diff --git a/lib/cadet/devices/device_registration.ex b/lib/cadet/devices/device_registration.ex index e33838d74..05d94e76c 100644 --- a/lib/cadet/devices/device_registration.ex +++ b/lib/cadet/devices/device_registration.ex @@ -8,6 +8,8 @@ defmodule Cadet.Devices.DeviceRegistration do alias Cadet.Accounts.User alias Cadet.Devices.Device + @type t :: %__MODULE__{} + schema "device_registrations" do field(:title, :string) diff --git a/lib/cadet/devices/devices.ex b/lib/cadet/devices/devices.ex index 0c12ae1f0..2ae129059 100644 --- a/lib/cadet/devices/devices.ex +++ b/lib/cadet/devices/devices.ex @@ -11,7 +11,7 @@ defmodule Cadet.Devices do alias Cadet.Devices.{Device, DeviceRegistration} alias ExAws.STS - @spec get_user_registrations(integer | String.t() | %User{}) :: [%DeviceRegistration{}] + @spec get_user_registrations(integer | String.t() | User.t()) :: [DeviceRegistration.t()] def get_user_registrations(%User{id: user_id}) do get_user_registrations(user_id) end @@ -23,8 +23,8 @@ defmodule Cadet.Devices do |> Repo.all() end - @spec get_user_registration(integer | String.t() | %User{}, integer | String.t()) :: - %DeviceRegistration{} | nil + @spec get_user_registration(integer | String.t() | User.t(), integer | String.t()) :: + DeviceRegistration.t() | nil def get_user_registration(%User{id: user_id}, id) do get_user_registration(user_id, id) end @@ -37,20 +37,20 @@ defmodule Cadet.Devices do |> Repo.get(id) end - @spec delete_registration(%DeviceRegistration{}) :: {:ok, %DeviceRegistration{}} + @spec delete_registration(DeviceRegistration.t()) :: {:ok, DeviceRegistration.t()} def delete_registration(registration = %DeviceRegistration{}) do Repo.delete(registration) end - @spec rename_registration(%DeviceRegistration{}, String.t()) :: - {:ok, %DeviceRegistration{}} | {:error, Ecto.Changeset.t()} + @spec rename_registration(DeviceRegistration.t(), String.t()) :: + {:ok, DeviceRegistration.t()} | {:error, Ecto.Changeset.t()} def rename_registration(registration = %DeviceRegistration{}, title) do registration |> DeviceRegistration.changeset(%{title: title}) |> Repo.update() end - @spec get_device(binary | integer) :: %Device{} | nil + @spec get_device(binary | integer) :: Device.t() | nil def get_device(device_id) when is_integer(device_id) do Repo.get(Device, device_id) end @@ -61,8 +61,8 @@ defmodule Cadet.Devices do |> Repo.one() end - @spec register(binary, binary, binary, integer | %User{}) :: - {:ok, %DeviceRegistration{}} | {:error, Ecto.Changeset.t() | :conflicting_device} + @spec register(binary, binary, binary, integer | User.t()) :: + {:ok, DeviceRegistration.t()} | {:error, Ecto.Changeset.t() | :conflicting_device} def register(title, type, secret, %User{id: user_id}) do register(title, type, secret, user_id) end @@ -78,7 +78,7 @@ defmodule Cadet.Devices do end end - @spec get_device_key_cert(binary | integer | %Device{}) :: + @spec get_device_key_cert(binary | integer | Device.t()) :: {:ok, {String.t(), String.t()}} | {:error, :no_such_device @@ -108,7 +108,7 @@ defmodule Cadet.Devices do end @spec maybe_insert_device(binary, binary) :: - {:ok, %Device{}} | {:error, Ecto.Changeset.t() | :conflicting_device} + {:ok, Device.t()} | {:error, Ecto.Changeset.t() | :conflicting_device} defp maybe_insert_device(type, secret) do case get_device(secret) do device = %Device{} -> @@ -167,8 +167,8 @@ defmodule Cadet.Devices do end @spec get_device_ws_endpoint( - binary | integer | %Device{}, - %User{}, + binary | integer | Device.t(), + User.t(), [{:datetime, :calendar.datetime()}] ) :: {:ok, %{}} diff --git a/lib/cadet/helpers/display_helper.ex b/lib/cadet/helpers/display_helper.ex index 7bea9c64a..478bb2f8e 100644 --- a/lib/cadet/helpers/display_helper.ex +++ b/lib/cadet/helpers/display_helper.ex @@ -13,7 +13,7 @@ defmodule Cadet.DisplayHelper do end end - @spec full_error_messages(%Ecto.Changeset{}) :: String.t() + @spec full_error_messages(Ecto.Changeset.t()) :: String.t() def full_error_messages(changeset = %Ecto.Changeset{}) do changeset |> traverse_errors(&process_error/1) @@ -34,18 +34,16 @@ defmodule Cadet.DisplayHelper do defp format_message(errors = %{}) do errors - |> Enum.map(fn {k, v} -> + |> Enum.map_join("\n", fn {k, v} -> message = v - |> Enum.map(fn + |> Enum.map_join("; ", fn %{} = sub -> "{#{format_message(sub)}}" str -> str end) - |> Enum.join("; ") "#{k} #{message}" end) - |> Enum.join("\n") end def create_invalid_changeset_with_error(key, message) do diff --git a/lib/cadet/helpers/model_helper.ex b/lib/cadet/helpers/model_helper.ex index b41fc8a35..5dbc72e23 100644 --- a/lib/cadet/helpers/model_helper.ex +++ b/lib/cadet/helpers/model_helper.ex @@ -76,7 +76,7 @@ defmodule Cadet.ModelHelper do when is_atom(field) and is_map(type_to_model_map) do build_changeset = fn params, type -> model = Map.get(type_to_model_map, type) - apply(model, :changeset, [struct(model), params]) + model.changeset(struct(model), params) end with true <- changeset.valid?, diff --git a/lib/cadet/incentives/achievement.ex b/lib/cadet/incentives/achievement.ex index 611c63a1f..5d255a4d2 100644 --- a/lib/cadet/incentives/achievement.ex +++ b/lib/cadet/incentives/achievement.ex @@ -7,6 +7,8 @@ defmodule Cadet.Incentives.Achievement do alias Cadet.Courses.Course alias Cadet.Incentives.{AchievementPrerequisite, AchievementToGoal} + @type t :: %__MODULE__{} + @primary_key {:uuid, :binary_id, autogenerate: false} schema "achievements" do field(:title, :string) diff --git a/lib/cadet/incentives/achievements.ex b/lib/cadet/incentives/achievements.ex index 5fa93c0a4..d83f71a32 100644 --- a/lib/cadet/incentives/achievements.ex +++ b/lib/cadet/incentives/achievements.ex @@ -13,7 +13,7 @@ defmodule Cadet.Incentives.Achievements do This returns Achievement structs with prerequisites and goal association maps pre-loaded. """ - @spec get(integer()) :: [%Achievement{}] + @spec get(integer()) :: [Achievement.t()] def get(course_id) when is_ecto_id(course_id) do Achievement |> where(course_id: ^course_id) @@ -21,7 +21,7 @@ defmodule Cadet.Incentives.Achievements do |> Repo.all() end - @spec upsert(map()) :: {:ok, %Achievement{}} | {:error, {:bad_request, String.t()}} + @spec upsert(map()) :: {:ok, Achievement.t()} | {:error, {:bad_request, String.t()}} @doc """ Inserts a new achievement, or updates it if it already exists. """ @@ -48,7 +48,7 @@ defmodule Cadet.Incentives.Achievements do end end - @spec upsert_many([map()]) :: {:ok, [%Achievement{}]} | {:error, {:bad_request, String.t()}} + @spec upsert_many([map()]) :: {:ok, [Achievement.t()]} | {:error, {:bad_request, String.t()}} def upsert_many(many_attrs) when is_list(many_attrs) do Repo.transaction(fn -> for attrs <- many_attrs do diff --git a/lib/cadet/incentives/goal.ex b/lib/cadet/incentives/goal.ex index 7a30664e9..a88dced9f 100644 --- a/lib/cadet/incentives/goal.ex +++ b/lib/cadet/incentives/goal.ex @@ -7,6 +7,8 @@ defmodule Cadet.Incentives.Goal do alias Cadet.Courses.Course alias Cadet.Incentives.{AchievementToGoal, GoalProgress} + @type t :: %__MODULE__{} + @primary_key {:uuid, :binary_id, autogenerate: false} schema "goals" do field(:text, :string) diff --git a/lib/cadet/incentives/goals.ex b/lib/cadet/incentives/goals.ex index eb5f50cb0..5b53227e5 100644 --- a/lib/cadet/incentives/goals.ex +++ b/lib/cadet/incentives/goals.ex @@ -13,7 +13,7 @@ defmodule Cadet.Incentives.Goals do @doc """ Returns all goals. """ - @spec get(integer()) :: [%Goal{}] + @spec get(integer()) :: [Goal.t()] def get(course_id) when is_ecto_id(course_id) do Goal |> where(course_id: ^course_id) @@ -31,7 +31,7 @@ defmodule Cadet.Incentives.Goals do |> Repo.all() end - @spec upsert(map()) :: {:ok, %Goal{}} | {:error, {:bad_request, String.t()}} + @spec upsert(map()) :: {:ok, Goal.t()} | {:error, {:bad_request, String.t()}} @doc """ Inserts a new goal, or updates it if it already exists. """ @@ -70,7 +70,7 @@ defmodule Cadet.Incentives.Goals do end end - @spec upsert_many([map()]) :: {:ok, [%Goal{}]} | {:error, {:bad_request, String.t()}} + @spec upsert_many([map()]) :: {:ok, [Goal.t()]} | {:error, {:bad_request, String.t()}} def upsert_many(many_attrs) do Repo.transaction(fn -> for attrs <- many_attrs do diff --git a/lib/cadet_web/controllers/auth_controller.ex b/lib/cadet_web/controllers/auth_controller.ex index 3b589274c..99db02c7d 100644 --- a/lib/cadet_web/controllers/auth_controller.ex +++ b/lib/cadet_web/controllers/auth_controller.ex @@ -96,7 +96,7 @@ defmodule CadetWeb.AuthController do send_resp(conn, :bad_request, "Missing parameter") end - @spec generate_tokens(%User{}) :: %{access_token: String.t(), refresh_token: String.t()} + @spec generate_tokens(User.t()) :: %{access_token: String.t(), refresh_token: String.t()} defp generate_tokens(user) do {:ok, access_token, _} = Guardian.encode_and_sign(user, %{}, token_type: "access", ttl: {1, :hour}) diff --git a/lib/mix/tasks/token.ex b/lib/mix/tasks/token.ex index 8b1344167..808ded384 100644 --- a/lib/mix/tasks/token.ex +++ b/lib/mix/tasks/token.ex @@ -57,7 +57,7 @@ defmodule Mix.Tasks.Cadet.Token do end end - @spec test_user(atom() | String.t()) :: %User{} + @spec test_user(atom() | String.t()) :: User.t() defp test_user(role) when is_atom(role) or is_binary(role) do if Cadet.Env.env() in @env_allow_mock do user = diff --git a/mix.lock b/mix.lock index 5ad6f0746..24b719472 100644 --- a/mix.lock +++ b/mix.lock @@ -5,78 +5,79 @@ "blankable": {:hex, :blankable, "1.0.0", "89ab564a63c55af117e115144e3b3b57eb53ad43ba0f15553357eb283e0ed425", [:mix], [], "hexpm", "7cf11aac0e44f4eedbee0c15c1d37d94c090cb72a8d9fddf9f7aec30f9278899"}, "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"}, "bypass": {:hex, :bypass, "2.1.0", "909782781bf8e20ee86a9cabde36b259d44af8b9f38756173e8f5e2e1fabb9b1", [:mix], [{:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:ranch, "~> 1.3", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "d9b5df8fa5b7a6efa08384e9bbecfe4ce61c77d28a4282f79e02f1ef78d96b80"}, - "certifi": {:hex, :certifi, "2.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, + "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, "configparser_ex": {:hex, :configparser_ex, "4.0.0", "17e2b831cfa33a08c56effc610339b2986f0d82a9caa0ed18880a07658292ab6", [:mix], [], "hexpm", "02e6d1a559361a063cba7b75bc3eb2d6ad7e62730c551cc4703541fd11e65e5b"}, "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, "corsica": {:hex, :corsica, "1.1.3", "5f1de40bc9285753aa03afbdd10c364dac79b2ddbf2ba9c5c9c47b397ec06f40", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "8156b3a14a114a346262871333a931a1766b2597b56bf994fcfcb65443a348ad"}, "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"}, - "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.3.1", "ebd1a1d7aff97f27c66654e78ece187abdc646992714164380d8a041eda16754", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a6efd3366130eab84ca372cbd4a7d3c3a97bdfcfb4911233b035d117063f0af"}, + "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"}, "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"}, - "credo": {:hex, :credo, "1.5.6", "e04cc0fdc236fefbb578e0c04bd01a471081616e741d386909e527ac146016c6", [:mix], [{:bunt, "~> 0.2.0", [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", "4b52a3e558bd64e30de62a648518a5ea2b6e3e5d2b164ef5296244753fc7eb17"}, + "credo": {:hex, :credo, "1.6.1", "7dc76dcdb764a4316c1596804c48eada9fff44bd4b733a91ccbf0c0f368be61e", [:mix], [{:bunt, "~> 0.2.0", [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", "698607fb5993720c7e93d2d8e76f2175bba024de964e160e2f7151ef3ab82ac5"}, "crontab": {:hex, :crontab, "1.1.10", "dc9bb1f4299138d47bce38341f5dcbee0aa6c205e864fba7bc847f3b5cb48241", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "1347d889d1a0eda997990876b4894359e34bfbbd688acbb0ba28a2795ca40685"}, "csv": {:hex, :csv, "2.4.1", "50e32749953b6bf9818dbfed81cf1190e38cdf24f95891303108087486c5925e", [:mix], [{:parallel_stream, "~> 1.0.4", [hex: :parallel_stream, repo: "hexpm", optional: false]}], "hexpm", "54508938ac67e27966b10ef49606e3ad5995d665d7fc2688efb3eab1307c9079"}, - "db_connection": {:hex, :db_connection, "2.4.0", "d04b1b73795dae60cead94189f1b8a51cc9e1f911c234cc23074017c43c031e5", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ad416c21ad9f61b3103d254a71b63696ecadb6a917b36f563921e0de00d7d7c8"}, + "db_connection": {:hex, :db_connection, "2.4.1", "6411f6e23f1a8b68a82fa3a36366d4881f21f47fc79a9efb8c615e62050219da", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ea36d226ec5999781a9a8ad64e5d8c4454ecedc7a4d643e4832bf08efca01f00"}, "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, "dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"}, "distillery": {:hex, :distillery, "2.1.1", "f9332afc2eec8a1a2b86f22429e068ef35f84a93ea1718265e740d90dd367814", [:mix], [{:artificery, "~> 0.2", [hex: :artificery, repo: "hexpm", optional: false]}], "hexpm", "bbc7008b0161a6f130d8d903b5b3232351fccc9c31a991f8fcbf2a12ace22995"}, - "ecto": {:hex, :ecto, "3.6.2", "efdf52acfc4ce29249bab5417415bd50abd62db7b0603b8bab0d7b996548c2bc", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "efad6dfb04e6f986b8a3047822b0f826d9affe8e4ebdd2aeedbfcb14fd48884e"}, + "ecto": {:hex, :ecto, "3.7.1", "a20598862351b29f80f285b21ec5297da1181c0442687f9b8329f0445d228892", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d36e5b39fc479e654cffd4dbe1865d9716e4a9b6311faff799b6f90ab81b8638"}, "ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"}, - "ecto_sql": {:hex, :ecto_sql, "3.6.2", "9526b5f691701a5181427634c30655ac33d11e17e4069eff3ae1176c764e0ba3", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.6.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.4.0 or ~> 0.5.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5ec9d7e6f742ea39b63aceaea9ac1d1773d574ea40df5a53ef8afbd9242fdb6b"}, + "ecto_sql": {:hex, :ecto_sql, "3.7.1", "8de624ef50b2a8540252d8c60506379fbbc2707be1606853df371cf53df5d053", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.7.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.4.0 or ~> 0.5.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2b42a32e2ce92f64aba5c88617891ab3b0ba34f3f3a503fa20009eae1a401c81"}, "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, - "ex_aws": {:hex, :ex_aws, "2.2.3", "f9bb1b04aaed3270f08c99d0268ff2c6596edb3a4a8792d18ffd37a74dd4810d", [:mix], [{:configparser_ex, "~> 4.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.6", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8ddf1da94624e5f92afe36d4146086f72d85bb15998cec137c1fd854a3f04bc4"}, + "ex_aws": {:hex, :ex_aws, "2.2.9", "295d2a9939315b2e27c92bde9615e2904d85442e5b59e259c4ee673e8a222c84", [:mix], [{:configparser_ex, "~> 4.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8 or ~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:mime, "~> 1.2 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f86e62f8c2a35c4536332b678a0edc18a9cd810d839cf1a9086f745ccf1fcc94"}, "ex_aws_lambda": {:hex, :ex_aws_lambda, "2.0.2", "77c749e4c4c36fb607639519a2e6b2037ec5986be52add632c1f5f5b9932089b", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}], "hexpm", "4e47a9b0bdd3ec993f812e6ef87ad8d1a652e4ffadb8d7c2632e90bd4a4d1fe2"}, - "ex_aws_s3": {:hex, :ex_aws_s3, "2.3.0", "5dfe50116bad048240bae7cd9418bfe23296542ff72a01b9138113a1cd31451c", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "0b13b11478825d62d2f6e57ae763695331be06f2216468f31bb304316758b096"}, + "ex_aws_s3": {:hex, :ex_aws_s3, "2.3.2", "92a63b72d763b488510626d528775b26831f5c82b066a63a3128054b7a09de28", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "b235b27131409bcc293c343bf39f1fbdd32892aa237b3f13752e914dc2979960"}, "ex_aws_secretsmanager": {:hex, :ex_aws_secretsmanager, "2.0.0", "deff8c12335f0160882afeb9687e55a97fddcd7d9a82fc3a6fbb270797374773", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}], "hexpm", "8b2838af536c32263ff797012b29e87bad73ef34f43cfa60ebca8e84576f6d45"}, "ex_aws_sts": {:hex, :ex_aws_sts, "2.3.0", "ce48c4cba7f1595a7d544458d0202ca313124026dba7b1a0021bbb1baa3d66d0", [:mix], [{:ex_aws, "~> 2.2", [hex: :ex_aws, repo: "hexpm", optional: false]}], "hexpm", "f14e4c7da3454514bf253b331e9422d25825485c211896ab3b81d2a4bdbf62f5"}, "ex_json_schema": {:hex, :ex_json_schema, "0.7.4", "09eb5b0c8184e5702bc89625a9d0c05c7a0a845d382e9f6f406a0fc1c9a8cc3f", [:mix], [], "hexpm", "45c67fa840f0d719a2b5578126dc29bcdc1f92499c0f61bcb8a3bcb5935f9684"}, "ex_machina": {:hex, :ex_machina, "2.7.0", "b792cc3127fd0680fecdb6299235b4727a4944a09ff0fa904cc639272cd92dc7", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "419aa7a39bde11894c87a615c4ecaa52d8f107bbdd81d810465186f783245bf8"}, "ex_utils": {:hex, :ex_utils, "0.1.7", "2c133e0bcdc49a858cf8dacf893308ebc05bc5fba501dc3d2935e65365ec0bf3", [:mix], [], "hexpm", "66d4fe75285948f2d1e69c2a5ddd651c398c813574f8d36a9eef11dc20356ef6"}, "exactor": {:hex, :exactor, "2.2.4", "5efb4ddeb2c48d9a1d7c9b465a6fffdd82300eb9618ece5d34c3334d5d7245b1", [:mix], [], "hexpm", "1222419f706e01bfa1095aec9acf6421367dcfab798a6f67c54cf784733cd6b5"}, - "excoveralls": {:hex, :excoveralls, "0.14.2", "f9f5fd0004d7bbeaa28ea9606251bb643c313c3d60710bad1f5809c845b748f0", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "ca6fd358621cb4d29311b29d4732c4d47dac70e622850979bc54ed9a3e50f3e1"}, + "excoveralls": {:hex, :excoveralls, "0.14.4", "295498f1ae47bdc6dce59af9a585c381e1aefc63298d48172efaaa90c3d251db", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "e3ab02f2df4c1c7a519728a6f0a747e71d7d6e846020aae338173619217931c1"}, "exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, repo: "hexpm", optional: false]}], "hexpm", "32e95820a97cffea67830e91514a2ad53b888850442d6d395f53a1ac60c82e07"}, "exvcr": {:hex, :exvcr, "0.13.2", "e17fd3ee3a341f41a3aa65a3ce73a339759a9d0658f83782492c6e9b6cf9daa4", [:mix], [{:exactor, "~> 2.2", [hex: :exactor, repo: "hexpm", optional: false]}, {:exjsx, "~> 4.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:finch, "~> 0.8.0", [hex: :finch, repo: "hexpm", optional: true]}, {:httpoison, "~> 1.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.8", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "17f41a533d14f582fe6b5f83214f058cf5ba77c6a7bc15bc53a9ea1827d92d96"}, - "faker": {:hex, :faker, "0.16.0", "1e2cf3e8d60d44a30741fb98118fcac18b2020379c7e00d18f1a005841b2f647", [:mix], [], "hexpm", "fbcb9bf1299dff3c9dd7e50f41802bbc472ffbb84e7656394c8aa913ec315141"}, + "faker": {:hex, :faker, "0.17.0", "671019d0652f63aefd8723b72167ecdb284baf7d47ad3a82a15e9b8a6df5d1fa", [:mix], [], "hexpm", "a7d4ad84a93fd25c5f5303510753789fc2433ff241bf3b4144d3f6f291658a6a"}, "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, - "gen_stage": {:hex, :gen_stage, "1.1.0", "dd0c0f8d2f3b993fdbd3d58e94abbe65380f4e78bdee3fa93d5618d7d14abe60", [:mix], [], "hexpm", "7f2b36a6d02f7ef2ba410733b540ec423af65ec9c99f3d1083da508aca3b9305"}, - "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, - "git_hooks": {:hex, :git_hooks, "0.6.3", "320aa54e9eeae6f04ceef79f33e426af5ab9618ac160d87b6467afba9ab07eee", [:mix], [{:blankable, "~> 1.0.0", [hex: :blankable, repo: "hexpm", optional: false]}, {:recase, "~> 0.7.0", [hex: :recase, repo: "hexpm", optional: false]}], "hexpm", "573a3e31579853cb898ca7e60524b7b8c0f2aeb7b7af4a906641fd60b1491051"}, - "guardian": {:hex, :guardian, "2.2.0", "0b730e957923ec79547fb8311f1092d2464cb187aebbf1d51f7a3f4dad545583", [:mix], [{:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}, {:plug, "~> 1.3.3 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "6e3fad1520ece1210372ed9e51bde246cf299b1caf1654663a436ede13d0d822"}, + "gen_stage": {:hex, :gen_stage, "1.1.2", "b1656cd4ba431ed02c5656fe10cb5423820847113a07218da68eae5d6a260c23", [:mix], [], "hexpm", "9e39af23140f704e2b07a3e29d8f05fd21c2aaf4088ff43cb82be4b9e3148d02"}, + "gettext": {:hex, :gettext, "0.19.0", "6909d61b38bb33339558f128f8af5913d5d5fe304a770217bf352b1620fb7ec4", [:mix], [], "hexpm", "3f7a274f52ebda9bb6655dfeda3d6b0dc4537ae51ce41dcccc7f73ca7379ad5e"}, + "git_hooks": {:hex, :git_hooks, "0.6.4", "a20757c39b2b9ab75d894fc3eaed8fbb1c45e207fd19f12f45fe9b5327910817", [:mix], [{:blankable, "~> 1.0.0", [hex: :blankable, repo: "hexpm", optional: false]}, {:recase, "~> 0.7.0", [hex: :recase, repo: "hexpm", optional: false]}], "hexpm", "a44c76f3d7bdaf885d6f0bf5b3f3e86922b5edf28ee2e6235aa6e561bf172b1c"}, + "guardian": {:hex, :guardian, "2.2.1", "5a4a949fd46eac79ef37f074ada7d1ef82e274bc99e335c286e042f5383f4f80", [:mix], [{:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}, {:plug, "~> 1.3.3 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "09b5c4d08f18524bd33ffe49617003cbca9f617237e23b5f42223cda61c5f052"}, "guardian_db": {:hex, :guardian_db, "2.1.0", "ec95a9d99cdd1e550555d09a7bb4a340d8887aad0697f594590c2fd74be02426", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.1", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:guardian, "~> 1.0 or ~> 2.0", [hex: :guardian, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "f8e7d543ac92c395f3a7fd5acbe6829faeade57d688f7562e2f0fca8f94a0d70"}, - "hackney": {:hex, :hackney, "1.17.4", "99da4674592504d3fb0cfef0db84c3ba02b4508bae2dff8c0108baa0d6e0977c", [:rebar3], [{:certifi, "~>2.6.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "de16ff4996556c8548d512f4dbe22dd58a587bf3332e7fd362430a7ef3986b16"}, + "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, "httpoison": {:hex, :httpoison, "1.8.0", "6b85dea15820b7804ef607ff78406ab449dd78bed923a49c7160e1886e987a3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "28089eaa98cf90c66265b6b5ad87c59a3729bea2e74e9d08f9b51eb9729b3c3a"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "inch_ex": {:hex, :inch_ex, "2.1.0-rc.1", "7642a8902c0d2ed5d9b5754b2fc88fedf630500d630fc03db7caca2e92dedb36", [:mix], [{:bunt, "~> 0.2", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "4ceee988760f9382d1c1d0b93ea5875727f6071693e89a0a3c49c456ef1be75d"}, - "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, + "jason": {:hex, :jason, "1.3.0", "fa6b82a934feb176263ad2df0dbd91bf633d4a46ebfdffea0c8ae82953714946", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "53fc1f51255390e0ec7e50f9cb41e751c260d065dcba2bf0d08dc51a4002c2ac"}, "jose": {:hex, :jose, "1.11.2", "f4c018ccf4fdce22c71e44d471f15f723cb3efab5d909ab2ba202b5bf35557b3", [:mix, :rebar3], [], "hexpm", "98143fbc48d55f3a18daba82d34fe48959d44538e9697c08f34200fa5f0947d2"}, "jsx": {:hex, :jsx, "3.1.0", "d12516baa0bb23a59bb35dccaf02a1bd08243fcbb9efe24f2d9d056ccff71268", [:rebar3], [], "hexpm", "0c5cc8fdc11b53cc25cf65ac6705ad39e54ecc56d1c22e4adb8f5a53fb9427f3"}, "meck": {:hex, :meck, "0.9.2", "85ccbab053f1db86c7ca240e9fc718170ee5bda03810a6292b5306bf31bae5f5", [:rebar3], [], "hexpm", "81344f561357dc40a8344afa53767c32669153355b626ea9fcbc8da6b3045826"}, "memento": {:hex, :memento, "0.3.2", "38cfc8ff9bcb1adff7cbd0f3b78a762636b86dff764729d1c82d0464c539bdd0", [:mix], [], "hexpm", "25cf691a98a0cb70262f4a7543c04bab24648cb2041d937eb64154a8d6f8012b"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, + "mime": {:hex, :mime, "2.0.2", "0b9e1a4c840eafb68d820b0e2158ef5c49385d17fb36855ac6e7e087d4b1dcc5", [:mix], [], "hexpm", "e6a3f76b4c277739e36c2e21a2c640778ba4c3846189d5ab19f97f126df5f9b7"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, "mock": {:hex, :mock, "0.3.7", "75b3bbf1466d7e486ea2052a73c6e062c6256fb429d6797999ab02fa32f29e03", [:mix], [{:meck, "~> 0.9.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "4da49a4609e41fd99b7836945c26f373623ea968cfb6282742bcb94440cf7e5c"}, "openid_connect": {:hex, :openid_connect, "0.2.2", "c05055363330deab39ffd89e609db6b37752f255a93802006d83b45596189c0b", [:mix], [{:httpoison, "~> 1.2", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: false]}, {:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "735769b6d592124b58edd0582554ce638524c0214cd783d8903d33357d74cc13"}, "parallel_stream": {:hex, :parallel_stream, "1.0.6", "b967be2b23f0f6787fab7ed681b4c45a215a81481fb62b01a5b750fa8f30f76c", [:mix], [], "hexpm", "639b2e8749e11b87b9eb42f2ad325d161c170b39b288ac8d04c4f31f8f0823eb"}, "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, - "phoenix": {:hex, :phoenix, "1.5.10", "3ee7d5c17ff9626d72d374d8fc8909bf00f4323fd15549fbe3abbbd38b5299c8", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f9c2eaa5a8fe5a412610c6aa84ccdb6f3e92f333d4df7fbaeb0d5a157dbfb48d"}, - "phoenix_ecto": {:hex, :phoenix_ecto, "4.3.0", "2c69a452c2e0ee8c93345ae1cdc1696ef4877ff9cbb15c305def41960c3c4ebf", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "0ac491924217550c8f42c81c1f390b5d81517d12ceaf9abf3e701156760a848e"}, + "phoenix": {:hex, :phoenix, "1.6.6", "281c8ce8dccc9f60607346b72cdfc597c3dde134dd9df28dff08282f0b751754", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "807bd646e64cd9dc83db016199715faba72758e6db1de0707eef0a2da4924364"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"}, "phoenix_swagger": {:hex, :phoenix_swagger, "0.8.3", "298d6204802409d3b0b4fc1013873839478707cf3a62532a9e10fec0e26d0e37", [:mix], [{:ex_json_schema, "~> 0.7.1", [hex: :ex_json_schema, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.11", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "3bc0fa9f5b679b8a61b90a52b2c67dd932320e9a84a6f91a4af872a0ab367337"}, + "phoenix_view": {:hex, :phoenix_view, "1.1.0", "149f053830ec3c19a2a8a67c208885a26e4c2b92cc4a9d54e03b633d68ef9add", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "dd219f768b3d97a224ed11e8a83f4fd0f3bd490434d3950d7c51a2e597a762f1"}, "plug": {:hex, :plug, "1.12.1", "645678c800601d8d9f27ad1aebba1fdb9ce5b2623ddb961a074da0b96c35187d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d57e799a777bc20494b784966dc5fbda91eb4a09f571f76545b72a634ce0d30b"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.5.1", "7cc96ff645158a94cf3ec9744464414f02287f832d6847079adfe0b58761cbd0", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "107d0a5865fa92bcb48e631cc0729ae9ccfa0a9f9a1bd8f01acb513abf1c2d64"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.5.2", "62894ccd601cf9597e2c23911ff12798a8a18d237e9739f58a6b04e4988899fe", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ea6e87f774c8608d60c8d34022a7d073bd7680a0a013f049fc62bf35efea1044"}, "plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"}, - "postgrex": {:hex, :postgrex, "0.15.10", "2809dee1b1d76f7cbabe570b2a9285c2e7b41be60cf792f5f2804a54b838a067", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "1560ca427542f6b213f8e281633ae1a3b31cdbcd84ebd7f50628765b8f6132be"}, - "quantum": {:hex, :quantum, "3.3.0", "e8f6b9479728774288c5f426b11a6e3e8f619f3c226163a7e18bccfe543b714d", [:mix], [{:crontab, "~> 1.1", [hex: :crontab, repo: "hexpm", optional: false]}, {:gen_stage, "~> 0.14 or ~> 1.0", [hex: :gen_stage, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3b83ef137ab3887e783b013418b5ce3e847d66b71c4ef0f233b0321c84b72f67"}, + "postgrex": {:hex, :postgrex, "0.15.13", "7794e697481799aee8982688c261901de493eb64451feee6ea58207d7266d54a", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "3ffb76e1a97cfefe5c6a95632a27ffb67f28871c9741fb585f9d1c3cd2af70f1"}, + "quantum": {:hex, :quantum, "3.4.0", "5a53c3c52b0d55f2323940232ba6ab4c98e7e14c73dfacbba3a1ed799b037ce5", [:mix], [{:crontab, "~> 1.1", [hex: :crontab, repo: "hexpm", optional: false]}, {:gen_stage, "~> 0.14 or ~> 1.0", [hex: :gen_stage, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d0eb64957d3dc49c8ed730cc2203108334226496535965b8dfa3f3dbcf430f87"}, "que": {:hex, :que, "0.10.1", "788ed0ec92ed69bdf9cfb29bf41a94ca6355b8d44959bd0669cf706e557ac891", [:mix], [{:ex_utils, "~> 0.1.6", [hex: :ex_utils, repo: "hexpm", optional: false]}, {:memento, "~> 0.3.0", [hex: :memento, repo: "hexpm", optional: false]}], "hexpm", "a737b365253e75dbd24b2d51acc1d851049e87baae08cd0c94e2bc5cd65088d5"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, "recase": {:hex, :recase, "0.7.0", "3f2f719f0886c7a3b7fe469058ec539cb7bbe0023604ae3bce920e186305e5ae", [:mix], [], "hexpm", "36f5756a9f552f4a94b54a695870e32f4e72d5fad9c25e61bc4a3151c08a4e0c"}, - "sentry": {:hex, :sentry, "8.0.5", "5ca922b9238a50c7258b52f47364b2d545beda5e436c7a43965b34577f1ef61f", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, "~> 2.3", [hex: :plug_cowboy, repo: "hexpm", optional: true]}], "hexpm", "4972839fdbf52e886d7b3e694c8adf421f764f2fa79036b88fb4742049bd4b7c"}, + "sentry": {:hex, :sentry, "8.0.6", "c8de1bf0523bc120ec37d596c55260901029ecb0994e7075b0973328779ceef7", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, "~> 2.3", [hex: :plug_cowboy, repo: "hexpm", optional: true]}], "hexpm", "051a2d0472162f3137787c7c9d6e6e4ef239de9329c8c45b1f1bf1e9379e1883"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, - "sweet_xml": {:hex, :sweet_xml, "0.7.0", "39ca6a53c526a1759672690656d5a787bee1016bfff467310170f9b428a238cb", [:mix], [], "hexpm", "2f18cb07f22b5a0d3e99d8b7e4176020f0051f90e449968821e4fde930edd945"}, - "telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"}, + "sweet_xml": {:hex, :sweet_xml, "0.7.2", "4729f997286811fabdd8288f8474e0840a76573051062f066c4b597e76f14f9f", [:mix], [], "hexpm", "6894e68a120f454534d99045ea3325f7740ea71260bc315f82e29731d570a6e8"}, + "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, "timex": {:hex, :timex, "3.7.6", "502d2347ec550e77fdf419bc12d15bdccd31266bb7d925b30bf478268098282f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a296327f79cb1ec795b896698c56e662ed7210cc9eb31f0ab365eb3a62e2c589"}, - "tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"}, + "tzdata": {:hex, :tzdata, "1.1.1", "20c8043476dfda8504952d00adac41c6eda23912278add38edc140ae0c5bcc46", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a69cec8352eafcd2e198dea28a34113b60fdc6cb57eb5ad65c10292a6ba89787"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, "xml_builder": {:hex, :xml_builder, "2.2.0", "cc5f1eeefcfcde6e90a9b77fb6c490a20bc1b856a7010ce6396f6da9719cbbab", [:mix], [], "hexpm", "9d66d52fb917565d358166a4314078d39ef04d552904de96f8e73f68f64a62c9"}, } diff --git a/test/support/xml_generator.ex b/test/support/xml_generator.ex index e3d5e1a13..e028b31b7 100644 --- a/test/support/xml_generator.ex +++ b/test/support/xml_generator.ex @@ -11,7 +11,7 @@ defmodule Cadet.Test.XMLGenerator do import XmlBuilder # TODO: refactor in smaller functions - @spec generate_xml_for(%Assessment{}, [%Question{}], [{atom(), any()}]) :: String.t() + @spec generate_xml_for(Assessment.t(), [Question.t()], [{atom(), any()}]) :: String.t() def generate_xml_for( assessment = %Assessment{}, questions,