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
- For decaying_average send an integer 1-99; for n_mastery send an integer >= 2, paired with the matching calculation_method.
- Omit calculation_int for methods that do not use it (latest, highest, average).
- Check LearningOutcome.valid_calculation_int?(int, method) client-side.
- 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
- Pair calculation_int with a compatible calculation_method.
- Respect method ranges: decaying_average 1-99, n_mastery >= 2.
- Omit calculation_int for latest/highest/average.
- Validate against LearningOutcome.valid_calculation_int? first.
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
- invalid calculation_method: #
- Cannot change locked status on granular permission
- GUID is invalid: #
- Invalid action.
- invalid description value: #
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)