Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reports missing docs when it should not #61

Open
flupke opened this issue Jun 22, 2023 · 0 comments
Open

Reports missing docs when it should not #61

flupke opened this issue Jun 22, 2023 · 0 comments

Comments

@flupke
Copy link

flupke commented Jun 22, 2023

The following module is reported as missing a docstring in one of its functions:

defmodule MultiplayerBackend.Ack do
  @moduledoc """
  Functions responsible for creating actions acknowledgements.
  """

  @type action :: :add_node | :remove_node | :update_properties

  @type invalid_payload(action) ::
          %{
            action: action,
            status: :error,
            error: :invalid_payload
          }

  @type forbidden(action) ::
          %{
            action: action,
            status: :error,
            error: :forbidden,
            action_id: String.t()
          }

  @type add_node ::
          %{
            action: :add_node,
            status: :ok,
            action_id: String.t(),
            node: map(),
            edits_count: integer()
          }

  @type add_node_action_already_applied ::
          %{
            action: :add_node,
            status: :error,
            error: :action_already_applied,
            action_id: String.t(),
            node_id: String.t(),
            node: map() | nil,
            edits_count: integer()
          }

  @type add_node_node_already_exists ::
          %{
            action: :add_node,
            status: :error,
            error: :node_already_exists,
            action_id: String.t(),
            node_id: String.t(),
            node: map() | nil,
            edits_count: integer()
          }

  @type add_node_unknown_parent ::
          %{
            action: :add_node,
            status: :error,
            error: :unknown_parent,
            action_id: String.t(),
            node_id: String.t(),
            edits_count: integer()
          }

  @type add_node_acknowledgement ::
          add_node()
          | add_node_action_already_applied()
          | add_node_node_already_exists()
          | add_node_unknown_parent()
          | invalid_payload(:add_node)
          | forbidden(:add_node)

  @type remove_node :: %{
          action: :remove_node,
          status: :ok,
          action_id: String.t(),
          node_id: String.t(),
          removed_nodes_ids: [String.t()],
          edits_count: integer()
        }

  @type remove_node_action_already_applied ::
          %{
            action: :remove_node,
            status: :error,
            error: :action_already_applied,
            action_id: String.t(),
            node_id: String.t(),
            removed_nodes_ids: [String.t()],
            edits_count: integer()
          }

  @type remove_node_node_not_found ::
          %{
            action: :remove_node,
            status: :error,
            error: :node_not_found,
            action_id: String.t(),
            node_id: String.t(),
            edits_count: integer()
          }

  @type remove_node_acknowledgement ::
          remove_node()
          | remove_node_action_already_applied()
          | remove_node_node_not_found()
          | invalid_payload(:remove_node)
          | forbidden(:remove_node)

  @type update_properties ::
          %{
            action: :update_properties,
            status: :ok,
            action_id: String.t(),
            node_id: String.t(),
            properties: map(),
            edits_count: integer()
          }

  @type update_properties_action_already_applied ::
          %{
            action: :update_properties,
            status: :error,
            error: :action_already_applied,
            action_id: String.t(),
            node_id: String.t(),
            properties: map(),
            edits_count: integer()
          }

  @type update_properties_node_not_found ::
          %{
            action: :update_properties,
            status: :error,
            error: :node_not_found,
            action_id: String.t(),
            node_id: String.t(),
            edits_count: integer()
          }

  @type update_properties_cannot_move_under_itself ::
          %{
            action: :update_properties,
            status: :error,
            error: :cannot_move_under_itself,
            action_id: String.t(),
            node_id: String.t(),
            properties: map(),
            edits_count: integer()
          }

  @type update_properties_acknowledgement ::
          update_properties()
          | update_properties_action_already_applied()
          | update_properties_node_not_found()
          | update_properties_cannot_move_under_itself()
          | invalid_payload(:update_properties)
          | forbidden(:update_properties)

  @type action_acknowledgement ::
          add_node_acknowledgement()
          | remove_node_acknowledgement()
          | update_properties_acknowledgement()

  @doc false
  @spec invalid_payload(action :: action()) :: invalid_payload(action)
  def invalid_payload(action) do
    %{
      action: action,
      status: :error,
      error: :invalid_payload
    }
  end

  @doc false
  @spec forbidden(action :: action(), action_id :: String.t()) :: forbidden(action)
  def forbidden(action, action_id) do
    %{
      action: action,
      status: :error,
      error: :forbidden,
      action_id: action_id
    }
  end

  @doc false
  @spec add_node(action_id :: String.t(), node :: map(), edits_count :: integer()) :: add_node()
  def add_node(action_id, node, edits_count) do
    %{
      status: :ok,
      action: :add_node,
      action_id: action_id,
      node: node,
      edits_count: edits_count
    }
  end

  @doc false
  @spec add_node_error(
          error :: :action_already_applied,
          action_id :: String.t(),
          node_id :: String.t(),
          node :: map() | nil,
          edits_count :: integer()
        ) :: add_node_action_already_applied()
  def add_node_error(:action_already_applied, action_id, node_id, node, edits_count) do
    add_node_error_base(:action_already_applied, action_id, node_id, node, edits_count)
  end

  @doc false
  @spec add_node_error(
          error :: :node_already_exists,
          action_id :: String.t(),
          node_id :: String.t(),
          node :: map() | nil,
          edits_count :: integer()
        ) :: add_node_node_already_exists()
  def add_node_error(:node_already_exists, action_id, node_id, node, edits_count) do
    add_node_error_base(:node_already_exists, action_id, node_id, node, edits_count)
  end

  @doc false
  @spec add_node_error(
          error :: :unknown_parent,
          action_id :: String.t(),
          node_id :: String.t(),
          edits_count :: integer()
        ) :: add_node_unknown_parent()
  def add_node_error(:unknown_parent, action_id, node_id, edits_count) do
    %{
      action: :add_node,
      status: :error,
      error: :unknown_parent,
      action_id: action_id,
      node_id: node_id,
      edits_count: edits_count
    }
  end

  defp add_node_error_base(error, action_id, node_id, node, edits_count) do
    %{
      action: :add_node,
      status: :error,
      error: error,
      action_id: action_id,
      node: node,
      node_id: node_id,
      edits_count: edits_count
    }
  end

  @doc false
  @spec remove_node(
          action_id :: String.t(),
          node_id :: String.t(),
          removed_nodes_ids :: [String.t()],
          edits_count :: integer()
        ) :: remove_node()
  def remove_node(action_id, node_id, removed_nodes_ids, edits_count) do
    %{
      status: :ok,
      action: :remove_node,
      action_id: action_id,
      node_id: node_id,
      removed_nodes_ids: removed_nodes_ids,
      edits_count: edits_count
    }
  end

  @doc false
  @spec remove_node_error(
          error :: :action_already_applied,
          action_id :: String.t(),
          node_id :: String.t(),
          removed_nodes_ids :: [String.t()],
          edits_count :: integer()
        ) :: remove_node_action_already_applied()
  def remove_node_error(
        :action_already_applied,
        action_id,
        node_id,
        removed_nodes_ids,
        edits_count
      ) do
    %{
      action: :remove_node,
      status: :error,
      error: :action_already_applied,
      action_id: action_id,
      node_id: node_id,
      removed_nodes_ids: removed_nodes_ids,
      edits_count: edits_count
    }
  end

  @doc false
  @spec remove_node_error(
          error :: :node_not_found,
          action_id :: String.t(),
          node_id :: String.t(),
          edits_count :: integer()
        ) :: remove_node_node_not_found()
  def remove_node_error(:node_not_found, action_id, node_id, edits_count) do
    %{
      action: :remove_node,
      status: :error,
      error: :node_not_found,
      action_id: action_id,
      node_id: node_id,
      edits_count: edits_count
    }
  end

  @doc false
  @spec update_properties(
          action_id :: String.t(),
          node_id :: String.t(),
          properties :: map(),
          edits_count :: integer()
        ) :: update_properties()
  def update_properties(action_id, node_id, properties, edits_count) do
    %{
      status: :ok,
      action: :update_properties,
      action_id: action_id,
      node_id: node_id,
      properties: properties,
      edits_count: edits_count
    }
  end

  @doc false
  @spec update_properties_error(
          error :: :action_already_applied,
          action_id :: String.t(),
          node_id :: String.t(),
          properties :: map(),
          edits_count :: integer()
        ) :: update_properties_action_already_applied()
  def update_properties_error(
        :action_already_applied,
        action_id,
        node_id,
        properties,
        edits_count
      ) do
    %{
      action: :update_properties,
      status: :error,
      error: :action_already_applied,
      action_id: action_id,
      node_id: node_id,
      properties: properties,
      edits_count: edits_count
    }
  end

  @doc false
  @spec update_properties_error(
          error :: :cannot_move_under_itself,
          action_id :: String.t(),
          node_id :: String.t(),
          properties :: map(),
          edits_count :: integer()
        ) :: update_properties_cannot_move_under_itself()
  def update_properties_error(
        :cannot_move_under_itself,
        action_id,
        node_id,
        properties,
        edits_count
      ) do
    %{
      action: :update_properties,
      status: :error,
      error: :cannot_move_under_itself,
      action_id: action_id,
      node_id: node_id,
      properties: properties,
      edits_count: edits_count
    }
  end

  @doc false
  @spec update_properties_error(
          error :: :node_not_found,
          action_id :: String.t(),
          node_id :: String.t(),
          edits_count :: integer()
        ) :: update_properties_node_not_found()
  def update_properties_error(:node_not_found, action_id, node_id, edits_count) do
    %{
      status: :error,
      action: :update_properties,
      action_id: action_id,
      error: :node_not_found,
      node_id: node_id,
      edits_count: edits_count
    }
  end
end

Here is doctor.explain output:

$ mix doctor.explain MultiplayerBackend.Ack                                                                       (06-22 17:47)
Doctor file found. Loading configuration.

Function                    @doc  @spec
---------------------------------------
update_properties_error/4   ✓     ✓
update_properties_error/5   ✓     ✓
update_properties/4         ✓     ✓
remove_node_error/4         ✓     ✓
remove_node_error/5         ✓     ✓
remove_node/4               ✓     ✓
add_node_error/4            ✓     ✓
add_node_error/5            ✓     ✓
add_node/3                  ✓     ✓
forbidden/2                 ✓     ✓
invalid_payload/1           ✓     ✓

Module Results:
  Doc Coverage:    90.9%  --> Your config has a 'min_module_doc_coverage' value of 100
  Spec Coverage:   100.0%
  Has Module Doc:  ✓
  Has Struct Spec: N/A
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant