instructure/canvas-lms · error

invalid calculation_int: #

Error message

invalid calculation_int: #{value}

What it means

OutcomesAcademicBenchmarkImportApiController#parse_calculation_int validates the calculation_int against LearningOutcome.valid_calculation_int? for the chosen calculation method and raises if invalid. calculation_int is only meaningful for methods like decaying_average and n_mastery, with method-specific ranges.

Solutions

  1. For decaying_average send an integer 1-99; for n_mastery send an integer >= 2, paired with the matching calculation_method.
  2. Omit calculation_int for methods that do not use it (latest, highest, average).
  3. Check LearningOutcome.valid_calculation_int?(int, method) client-side.
  4. Parse as integer first (no decimals or strings with units).

Example fix

// before
{ calculation_method: "decaying_average", calculation_int: 100 }
// after
{ calculation_method: "decaying_average", calculation_int: 75 }
Defensive patterns

Strategy: validation

Validate before calling

raise ArgumentError unless (1..99).cover?(calculation_int) if method == 'decaying_average'
raise ArgumentError unless calculation_int.is_a?(Integer) && calculation_int >= 2 if method == 'n_mastery'

Type guard

def valid_calc_int?(int, method) = LearningOutcome.valid_calculation_int?(int, method)

Try / catch

begin
  import_outcomes(options)
rescue RuntimeError => e
  raise InvalidCalculationInt, e.message if e.message.start_with?('invalid calculation_int:')
  raise
end

Prevention

When it happens

Trigger: Sending calculation_int without (or with an incompatible) calculation_method, or a value outside the allowed range — e.g. decaying_average requires 1-99, n_mastery requires >= 2 — or a non-integer caught earlier by parse_int.

Common situations: Sending calculation_int: 100 with decaying_average (max 99); omitting calculation_method so validation fails; sending calculation_int for 'latest'/'highest' where it is not allowed.

Understand the failure class

Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.

Related errors


AI-assisted analysis of instructure/canvas-lms@1c9f0bb801 (2026-09-15). Data as JSON: /api/errors/ce1f4eb0545e12db. Report an issue: GitHub.

Appendix: source

Thrown at app/controllers/outcomes_academic_benchmark_import_api_controller.rb:129

      raise "ratings expected to be an array" unless hash[:ratings].is_a?(Array)

      options[:ratings] = hash[:ratings].map { |r| parse_rating(r) }
    end
    options
  end

  def parse_calculation_method(value)
    unless LearningOutcome.valid_calculation_method?(value)
      raise "invalid calculation_method: #{value}"
    end

    value
  end

  def parse_calculation_int(calc_method, value)
    int = value.nil? ? nil : parse_int(value)
    unless LearningOutcome.valid_calculation_int?(int, calc_method)
      raise "invalid calculation_int: #{value}"
    end

    int
  end

  def parse_rating(rating)
    if rating.nil? || !rating.is_a?(ActionController::Parameters)
      raise "invalid ratings value: #{rating}"
    end
    if rating[:description].nil? || !rating[:description].is_a?(String)
      raise "invalid description value: #{rating[:description]}"
    end

    { description: rating[:description], points: parse_int(rating[:points]) }
  end
end

View on GitHub (pinned to 1c9f0bb801)