RuboCop: Lint
[skip-stages=Flakey] auto corrections applied: * Lint/AmbiguousOperator * Lint/AmbiguousOperatorPrecedence * Lint/AmbiguousRegexpLiteral * Lint/DeprecatedClassMethods * Lint/DeprecatedOpenSSLConstant * Lint/NonDeterministicRequireOrder * Lint/ParenthesesAsGroupedExpression * Lint/RedundantRequireStatement * Lint/RedundantSafeNavigation * Lint/RedundantSplatExpansion * Lint/RedundantStringCoercion * Lint/RedundantWithIndex * Lint/SendWithMixinArgument * Lint/SymbolConversion Change-Id: I222ec19978033544513bb99755994d109435abad Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/274551 Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com> Reviewed-by: Simon Williams <simon@instructure.com> QA-Review: Cody Cutrer <cody@instructure.com> Product-Review: Cody Cutrer <cody@instructure.com>
This commit is contained in:
parent
117d484c1c
commit
dbd8c46655
|
@ -31,8 +31,38 @@ Layout:
|
||||||
Layout/LineLength:
|
Layout/LineLength:
|
||||||
Enabled: false # TODO. Maybe.
|
Enabled: false # TODO. Maybe.
|
||||||
|
|
||||||
|
Lint/AmbiguousOperator:
|
||||||
|
Severity: error
|
||||||
|
Lint/AmbiguousOperatorPrecedence:
|
||||||
|
Severity: error
|
||||||
|
Lint/AmbiguousRegexpLiteral:
|
||||||
|
Severity: error
|
||||||
Lint/Debugger:
|
Lint/Debugger:
|
||||||
Severity: error
|
Severity: error
|
||||||
|
Lint/DeprecatedClassMethods:
|
||||||
|
Severity: error
|
||||||
|
Lint/DeprecatedOpenSSLConstant:
|
||||||
|
Severity: error
|
||||||
|
Lint/NonDeterministicRequireOrder:
|
||||||
|
Severity: error
|
||||||
|
Lint/ParenthesesAsGroupedExpression:
|
||||||
|
Severity: error
|
||||||
|
Lint/RedundantRequireStatement:
|
||||||
|
Severity: error
|
||||||
|
Lint/RedundantSafeNavigation:
|
||||||
|
Severity: error
|
||||||
|
Lint/RedundantSplatExpansion:
|
||||||
|
Severity: error
|
||||||
|
Lint/RedundantStringCoercion:
|
||||||
|
Severity: error
|
||||||
|
Lint/RedundantWithIndex:
|
||||||
|
Severity: error
|
||||||
|
Lint/SendWithMixinArgument:
|
||||||
|
Severity: error
|
||||||
|
Lint/SymbolConversion:
|
||||||
|
Severity: error
|
||||||
|
Lint/UnifiedInteger:
|
||||||
|
Severity: error
|
||||||
|
|
||||||
Metrics:
|
Metrics:
|
||||||
Enabled: false # SnR is just too low to have this enabled
|
Enabled: false # SnR is just too low to have this enabled
|
||||||
|
@ -102,6 +132,14 @@ Style/SpecialGlobalVars:
|
||||||
Lint/AmbiguousBlockAssociation: # TODO
|
Lint/AmbiguousBlockAssociation: # TODO
|
||||||
Exclude:
|
Exclude:
|
||||||
- spec/**/*
|
- spec/**/*
|
||||||
|
Lint/UnusedBlockArgument: # TODO maually fix these by removing the argument if possible
|
||||||
|
Severity: warning
|
||||||
|
AutoCorrect: false
|
||||||
|
Lint/UnusedMethodArgument: # TODO maually fix these by removing the argument if possible
|
||||||
|
Severity: warning
|
||||||
|
AutoCorrect: false
|
||||||
|
Lint/UselessAssignment: # TODO
|
||||||
|
Severity: warning
|
||||||
|
|
||||||
Naming/VariableNumber: # TODO
|
Naming/VariableNumber: # TODO
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
|
@ -841,7 +841,7 @@ class AccountsController < ApplicationController
|
||||||
@account.errors.add(quota_type, t(:quota_integer_required, 'An integer value is required'))
|
@account.errors.add(quota_type, t(:quota_integer_required, 'An integer value is required'))
|
||||||
else
|
else
|
||||||
@account.errors.add(quota_type, t(:quota_must_be_positive, 'Value must be positive')) if quota_value.to_i < 0
|
@account.errors.add(quota_type, t(:quota_must_be_positive, 'Value must be positive')) if quota_value.to_i < 0
|
||||||
@account.errors.add(quota_type, t(:quota_too_large, 'Value too large')) if quota_value.to_i >= 2**62 / 1.megabytes
|
@account.errors.add(quota_type, t(:quota_too_large, 'Value too large')) if quota_value.to_i >= (2**62) / 1.megabytes
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
|
|
@ -707,7 +707,7 @@ class ApplicationController < ActionController::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def tab_enabled?(id, opts = {})
|
def tab_enabled?(id, opts = {})
|
||||||
return true unless @context&.respond_to?(:tabs_available)
|
return true unless @context.respond_to?(:tabs_available)
|
||||||
|
|
||||||
valid = Rails.cache.fetch(['tab_enabled4', id, @context, @current_user, @domain_root_account, session[:enrollment_uuid]].cache_key) do
|
valid = Rails.cache.fetch(['tab_enabled4', id, @context, @current_user, @domain_root_account, session[:enrollment_uuid]].cache_key) do
|
||||||
@context.tabs_available(@current_user,
|
@context.tabs_available(@current_user,
|
||||||
|
@ -1504,7 +1504,7 @@ class ApplicationController < ActionController::Base
|
||||||
|
|
||||||
def log_gets
|
def log_gets
|
||||||
if @page_view && !request.xhr? && request.get? && (((response.media_type || "").to_s.match(/html/)) ||
|
if @page_view && !request.xhr? && request.get? && (((response.media_type || "").to_s.match(/html/)) ||
|
||||||
(Setting.get('create_get_api_page_views', 'true') == 'true') && api_request?)
|
((Setting.get('create_get_api_page_views', 'true') == 'true') && api_request?))
|
||||||
@page_view.render_time ||= (Time.now.utc - @page_before_render) rescue nil
|
@page_view.render_time ||= (Time.now.utc - @page_before_render) rescue nil
|
||||||
@page_view_update = true
|
@page_view_update = true
|
||||||
end
|
end
|
||||||
|
@ -2845,7 +2845,7 @@ class ApplicationController < ActionController::Base
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
def show_student_view_button?
|
def show_student_view_button?
|
||||||
return false unless @context&.is_a?(Course) && can_do(@context, @current_user, :use_student_view)
|
return false unless @context.is_a?(Course) && can_do(@context, @current_user, :use_student_view)
|
||||||
|
|
||||||
controller_action = "#{params[:controller]}##{params[:action]}"
|
controller_action = "#{params[:controller]}##{params[:action]}"
|
||||||
STUDENT_VIEW_PAGES.key?(controller_action) && (STUDENT_VIEW_PAGES[controller_action].nil? || !@context.tab_hidden?(STUDENT_VIEW_PAGES[controller_action]))
|
STUDENT_VIEW_PAGES.key?(controller_action) && (STUDENT_VIEW_PAGES[controller_action].nil? || !@context.tab_hidden?(STUDENT_VIEW_PAGES[controller_action]))
|
||||||
|
|
|
@ -1697,7 +1697,7 @@ class CoursesController < ApplicationController
|
||||||
row = []
|
row = []
|
||||||
row << opc.user.last_name
|
row << opc.user.last_name
|
||||||
row << opc.user.first_name
|
row << opc.user.first_name
|
||||||
row << '="' + opc.code + '"'
|
row << ('="' + opc.code + '"')
|
||||||
row << opc.expires_at
|
row << opc.expires_at
|
||||||
csv << row
|
csv << row
|
||||||
end
|
end
|
||||||
|
@ -1772,7 +1772,7 @@ class CoursesController < ApplicationController
|
||||||
enrollment = nil
|
enrollment = nil
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
elsif !@current_user && enrollment.user.registered? || !enrollment.user.email_channel
|
elsif (!@current_user && enrollment.user.registered?) || !enrollment.user.email_channel
|
||||||
session[:return_to] = course_url(@context.id)
|
session[:return_to] = course_url(@context.id)
|
||||||
flash[:notice] = t('notices.login_to_accept', "You'll need to log in before you can accept the enrollment.")
|
flash[:notice] = t('notices.login_to_accept', "You'll need to log in before you can accept the enrollment.")
|
||||||
return redirect_to login_url(:force_login => 1) if @current_user
|
return redirect_to login_url(:force_login => 1) if @current_user
|
||||||
|
@ -2869,8 +2869,8 @@ class CoursesController < ApplicationController
|
||||||
end
|
end
|
||||||
if params_for_update.key?(:template)
|
if params_for_update.key?(:template)
|
||||||
template = value_to_boolean(params_for_update.delete(:template))
|
template = value_to_boolean(params_for_update.delete(:template))
|
||||||
if template && @course.grants_right?(@current_user, session, :add_course_template) ||
|
if (template && @course.grants_right?(@current_user, session, :add_course_template)) ||
|
||||||
!template && @course.grants_right?(@current_user, session, :delete_course_template)
|
(!template && @course.grants_right?(@current_user, session, :delete_course_template))
|
||||||
@course.template = template
|
@course.template = template
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1533,7 +1533,7 @@ class DiscussionTopicsController < ApplicationController
|
||||||
|
|
||||||
def handle_assignment_edit_params(hash)
|
def handle_assignment_edit_params(hash)
|
||||||
hash[:title] = params[:title] if params[:title]
|
hash[:title] = params[:title] if params[:title]
|
||||||
if params.slice(*[:due_at, :points_possible, :assignment_group_id]).present?
|
if params.slice(:due_at, :points_possible, :assignment_group_id).present?
|
||||||
if hash[:assignment].nil? && @context.respond_to?(:assignments) && @context.assignments.temp_record.grants_right?(@current_user, session, :create)
|
if hash[:assignment].nil? && @context.respond_to?(:assignments) && @context.assignments.temp_record.grants_right?(@current_user, session, :create)
|
||||||
hash[:assignment] ||= {}
|
hash[:assignment] ||= {}
|
||||||
end
|
end
|
||||||
|
|
|
@ -634,7 +634,7 @@ class FilesController < ApplicationController
|
||||||
|
|
||||||
[json[:attachment],
|
[json[:attachment],
|
||||||
doc_preview_json(attachment, @current_user),
|
doc_preview_json(attachment, @current_user),
|
||||||
attachment_json(attachment, @current_user, {}, json_include)].reduce &:merge!
|
attachment_json(attachment, @current_user, {}, json_include)].reduce(&:merge!)
|
||||||
|
|
||||||
log_asset_access(attachment, "files", "files")
|
log_asset_access(attachment, "files", "files")
|
||||||
end
|
end
|
||||||
|
@ -843,7 +843,7 @@ class FilesController < ApplicationController
|
||||||
|
|
||||||
@context = @attachment.context
|
@context = @attachment.context
|
||||||
@attachment.workflow_state = nil
|
@attachment.workflow_state = nil
|
||||||
@attachment.uploaded_data = params[:file] || params[:attachment] && params[:attachment][:uploaded_data]
|
@attachment.uploaded_data = params[:file] || (params[:attachment] && params[:attachment][:uploaded_data])
|
||||||
if @attachment.save
|
if @attachment.save
|
||||||
# for consistency with the s3 upload client flow, we redirect to the success url here to finish up
|
# for consistency with the s3 upload client flow, we redirect to the success url here to finish up
|
||||||
includes = Array(params[:success_include])
|
includes = Array(params[:success_include])
|
||||||
|
|
|
@ -96,7 +96,7 @@ module LiveAssessments
|
||||||
assessment.save!
|
assessment.save!
|
||||||
if @outcome
|
if @outcome
|
||||||
criterion = @outcome.rubric_criterion
|
criterion = @outcome.rubric_criterion
|
||||||
mastery_score = criterion && criterion[:mastery_points] / criterion[:points_possible]
|
mastery_score = criterion && (criterion[:mastery_points] / criterion[:points_possible])
|
||||||
@outcome.align(assessment, @context, mastery_type: "none", mastery_score: mastery_score)
|
@outcome.align(assessment, @context, mastery_type: "none", mastery_score: mastery_score)
|
||||||
end
|
end
|
||||||
@assessments << assessment
|
@assessments << assessment
|
||||||
|
|
|
@ -34,8 +34,8 @@ class Login::OtpController < ApplicationController
|
||||||
def new
|
def new
|
||||||
# if we waiting on OTP for login, but we're not yet configured, start configuring
|
# if we waiting on OTP for login, but we're not yet configured, start configuring
|
||||||
# OR if we're not waiting on OTP, we're configuring
|
# OR if we're not waiting on OTP, we're configuring
|
||||||
if session[:pending_otp] && !secret_key ||
|
if (session[:pending_otp] && !secret_key) ||
|
||||||
!session[:pending_otp] && !configuring?
|
(!session[:pending_otp] && !configuring?)
|
||||||
session[:pending_otp_secret_key] = ROTP::Base32.random
|
session[:pending_otp_secret_key] = ROTP::Base32.random
|
||||||
@first_reconfiguration = true
|
@first_reconfiguration = true
|
||||||
end
|
end
|
||||||
|
@ -93,7 +93,7 @@ class Login::OtpController < ApplicationController
|
||||||
drift = 300 if session[:pending_otp_communication_channel_id] ||
|
drift = 300 if session[:pending_otp_communication_channel_id] ||
|
||||||
(!session[:pending_otp_secret_key] && @current_user.otp_communication_channel_id)
|
(!session[:pending_otp_secret_key] && @current_user.otp_communication_channel_id)
|
||||||
|
|
||||||
if !force_fail && ROTP::TOTP.new(secret_key).verify(verification_code, drift_behind: drift, drift_ahead: drift) ||
|
if (!force_fail && ROTP::TOTP.new(secret_key).verify(verification_code, drift_behind: drift, drift_ahead: drift)) ||
|
||||||
@current_user.authenticate_one_time_password(verification_code)
|
@current_user.authenticate_one_time_password(verification_code)
|
||||||
if configuring?
|
if configuring?
|
||||||
@current_user.one_time_passwords.scope.delete_all
|
@current_user.one_time_passwords.scope.delete_all
|
||||||
|
|
|
@ -173,7 +173,7 @@ module Lti
|
||||||
def update
|
def update
|
||||||
sub = params.require(:subscription)
|
sub = params.require(:subscription)
|
||||||
SubscriptionsValidator.validate_subscription_context!(sub) if sub[:ContextType]
|
SubscriptionsValidator.validate_subscription_context!(sub) if sub[:ContextType]
|
||||||
updates = add_updater({ 'Id': params[:id] }.merge(sub.to_unsafe_h))
|
updates = add_updater({ Id: params[:id] }.merge(sub.to_unsafe_h))
|
||||||
response = Services::LiveEventsSubscriptionService.update(jwt_body, updates)
|
response = Services::LiveEventsSubscriptionService.update(jwt_body, updates)
|
||||||
forward_service_response(response)
|
forward_service_response(response)
|
||||||
end
|
end
|
||||||
|
|
|
@ -131,7 +131,7 @@ module Lti
|
||||||
|
|
||||||
def public_course?
|
def public_course?
|
||||||
# Is the context published and public?
|
# Is the context published and public?
|
||||||
context&.is_a?(Course) && context&.available? && context&.is_public?
|
context.is_a?(Course) && context&.available? && context&.is_public?
|
||||||
end
|
end
|
||||||
|
|
||||||
def verifier
|
def verifier
|
||||||
|
|
|
@ -26,7 +26,7 @@ module Lti::Ims::Providers
|
||||||
attr_reader :context, :controller, :tool
|
attr_reader :context, :controller, :tool
|
||||||
|
|
||||||
def self.unwrap(wrapped)
|
def self.unwrap(wrapped)
|
||||||
wrapped&.respond_to?(:unwrap) ? wrapped.unwrap : wrapped
|
wrapped.respond_to?(:unwrap) ? wrapped.unwrap : wrapped
|
||||||
end
|
end
|
||||||
|
|
||||||
def initialize(context, controller, tool)
|
def initialize(context, controller, tool)
|
||||||
|
|
|
@ -347,7 +347,7 @@ class ProfileController < ApplicationController
|
||||||
user_params.delete(:short_name)
|
user_params.delete(:short_name)
|
||||||
user_params.delete(:sortable_name)
|
user_params.delete(:sortable_name)
|
||||||
end
|
end
|
||||||
if !@domain_root_account.can_change_pronouns? || user_params[:pronouns].present? && @domain_root_account.pronouns.exclude?(user_params[:pronouns].strip)
|
if !@domain_root_account.can_change_pronouns? || (user_params[:pronouns].present? && @domain_root_account.pronouns.exclude?(user_params[:pronouns].strip))
|
||||||
user_params.delete(:pronouns)
|
user_params.delete(:pronouns)
|
||||||
end
|
end
|
||||||
if @user.update(user_params)
|
if @user.update(user_params)
|
||||||
|
|
|
@ -656,8 +656,8 @@ class Quizzes::QuizzesController < ApplicationController
|
||||||
@submissions_from_users[student.id].id
|
@submissions_from_users[student.id].id
|
||||||
end
|
end
|
||||||
|
|
||||||
submitted_students_json = @submitted_students.map &:id
|
submitted_students_json = @submitted_students.map(&:id)
|
||||||
unsubmitted_students_json = @unsubmitted_students.map &:id
|
unsubmitted_students_json = @unsubmitted_students.map(&:id)
|
||||||
else
|
else
|
||||||
submitted_students_json = @submitted_students.map { |u| user_json(u, @current_user, session) }
|
submitted_students_json = @submitted_students.map { |u| user_json(u, @current_user, session) }
|
||||||
unsubmitted_students_json = @unsubmitted_students.map { |u| user_json(u, @current_user, session) }
|
unsubmitted_students_json = @unsubmitted_students.map { |u| user_json(u, @current_user, session) }
|
||||||
|
|
|
@ -146,7 +146,7 @@ class RubricAssociationsController < ApplicationController
|
||||||
def can_manage_rubrics_or_association_object?(association, association_object)
|
def can_manage_rubrics_or_association_object?(association, association_object)
|
||||||
return true if association ||
|
return true if association ||
|
||||||
@context.grants_right?(@current_user, session, :manage_rubrics) ||
|
@context.grants_right?(@current_user, session, :manage_rubrics) ||
|
||||||
association_object && association_object.grants_right?(@current_user, session, :update)
|
(association_object && association_object.grants_right?(@current_user, session, :update))
|
||||||
|
|
||||||
render_unauthorized_action
|
render_unauthorized_action
|
||||||
false
|
false
|
||||||
|
|
|
@ -222,8 +222,8 @@ class RubricsController < ApplicationController
|
||||||
private
|
private
|
||||||
|
|
||||||
def can_manage_rubrics_or_association_object?(object)
|
def can_manage_rubrics_or_association_object?(object)
|
||||||
return true if object && (can_update?(object) || can_read?(object) && can_manage_rubrics_context?) ||
|
return true if (object && (can_update?(object) || (can_read?(object) && can_manage_rubrics_context?))) ||
|
||||||
!object && can_manage_rubrics_context?
|
(!object && can_manage_rubrics_context?)
|
||||||
|
|
||||||
render_unauthorized_action
|
render_unauthorized_action
|
||||||
false
|
false
|
||||||
|
|
|
@ -54,7 +54,7 @@ class SubAccountsController < ApplicationController
|
||||||
permissions: [:manage_account_settings, :manage_courses, :manage_courses_admin]
|
permissions: [:manage_account_settings, :manage_courses, :manage_courses_admin]
|
||||||
)
|
)
|
||||||
|
|
||||||
@query = params[:account] && params[:account][:name] || params[:term]
|
@query = (params[:account] && params[:account][:name]) || params[:term]
|
||||||
if @query
|
if @query
|
||||||
@accounts = []
|
@accounts = []
|
||||||
if @context && @context.is_a?(Account)
|
if @context && @context.is_a?(Account)
|
||||||
|
|
|
@ -1224,7 +1224,7 @@ class SubmissionsApiController < ApplicationController
|
||||||
|
|
||||||
def bulk_load_attachments_and_previews(submissions)
|
def bulk_load_attachments_and_previews(submissions)
|
||||||
Submission.bulk_load_versioned_attachments(submissions)
|
Submission.bulk_load_versioned_attachments(submissions)
|
||||||
attachments = submissions.flat_map &:versioned_attachments
|
attachments = submissions.flat_map(&:versioned_attachments)
|
||||||
ActiveRecord::Associations::Preloader.new.preload(attachments,
|
ActiveRecord::Associations::Preloader.new.preload(attachments,
|
||||||
[:canvadoc, :crocodoc_document])
|
[:canvadoc, :crocodoc_document])
|
||||||
Version.preload_version_number(submissions)
|
Version.preload_version_number(submissions)
|
||||||
|
|
|
@ -322,12 +322,12 @@ class UsersController < ApplicationController
|
||||||
Canvas::Errors.capture_exception(:oauth, e, :warn)
|
Canvas::Errors.capture_exception(:oauth, e, :warn)
|
||||||
flash[:error] = e.to_s
|
flash[:error] = e.to_s
|
||||||
end
|
end
|
||||||
return redirect_to (@current_user ? user_profile_url(@current_user) : root_url)
|
return redirect_to(@current_user ? user_profile_url(@current_user) : root_url)
|
||||||
end
|
end
|
||||||
|
|
||||||
if !oauth_request || (request.host_with_port == oauth_request.original_host_with_port && oauth_request.user != @current_user)
|
if !oauth_request || (request.host_with_port == oauth_request.original_host_with_port && oauth_request.user != @current_user)
|
||||||
flash[:error] = t('oauth_fail', "OAuth Request failed. Couldn't find valid request")
|
flash[:error] = t('oauth_fail', "OAuth Request failed. Couldn't find valid request")
|
||||||
redirect_to (@current_user ? user_profile_url(@current_user) : root_url)
|
redirect_to(@current_user ? user_profile_url(@current_user) : root_url)
|
||||||
elsif request.host_with_port != oauth_request.original_host_with_port
|
elsif request.host_with_port != oauth_request.original_host_with_port
|
||||||
url = url_for request.parameters.merge(:host => oauth_request.original_host_with_port, :only_path => false)
|
url = url_for request.parameters.merge(:host => oauth_request.original_host_with_port, :only_path => false)
|
||||||
redirect_to url
|
redirect_to url
|
||||||
|
@ -2883,7 +2883,7 @@ class UsersController < ApplicationController
|
||||||
force_validations = value_to_boolean(params[:force_validations])
|
force_validations = value_to_boolean(params[:force_validations])
|
||||||
manage_user_logins = @context.grants_right?(@current_user, session, :manage_user_logins)
|
manage_user_logins = @context.grants_right?(@current_user, session, :manage_user_logins)
|
||||||
self_enrollment = params[:self_enrollment].present?
|
self_enrollment = params[:self_enrollment].present?
|
||||||
allow_non_email_pseudonyms = !force_validations && manage_user_logins || self_enrollment && params[:pseudonym_type] == 'username'
|
allow_non_email_pseudonyms = (!force_validations && manage_user_logins) || (self_enrollment && params[:pseudonym_type] == 'username')
|
||||||
require_password = self_enrollment && allow_non_email_pseudonyms
|
require_password = self_enrollment && allow_non_email_pseudonyms
|
||||||
allow_password = require_password || manage_user_logins || use_pairing_code
|
allow_password = require_password || manage_user_logins || use_pairing_code
|
||||||
|
|
||||||
|
@ -3016,7 +3016,7 @@ class UsersController < ApplicationController
|
||||||
@cc.confirmation_redirect = cc_confirmation_redirect
|
@cc.confirmation_redirect = cc_confirmation_redirect
|
||||||
end
|
end
|
||||||
|
|
||||||
if @recaptcha_errors.nil? && @user.valid? && @pseudonym.valid? && @invalid_observee_creds.nil? & @invalid_observee_code.nil?
|
if @recaptcha_errors.nil? && @user.valid? && @pseudonym.valid? && (@invalid_observee_creds.nil? & @invalid_observee_code.nil?)
|
||||||
# saving the user takes care of the @pseudonym and @cc, so we can't call
|
# saving the user takes care of the @pseudonym and @cc, so we can't call
|
||||||
# save_without_session_maintenance directly. we don't want to auto-log-in
|
# save_without_session_maintenance directly. we don't want to auto-log-in
|
||||||
# unless the user is registered/pre_registered (if the latter, he still
|
# unless the user is registered/pre_registered (if the latter, he still
|
||||||
|
|
|
@ -124,7 +124,7 @@ module Types
|
||||||
if !apply_overrides && course.grants_any_right?(current_user, *RoleOverride::GRANULAR_MANAGE_ASSIGNMENT_PERMISSIONS)
|
if !apply_overrides && course.grants_any_right?(current_user, *RoleOverride::GRANULAR_MANAGE_ASSIGNMENT_PERMISSIONS)
|
||||||
assignment.send(field_name)
|
assignment.send(field_name)
|
||||||
else
|
else
|
||||||
OverrideAssignmentLoader.for(current_user).load(assignment).then &field_name
|
OverrideAssignmentLoader.for(current_user).load(assignment).then(&field_name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -293,7 +293,7 @@ module ApplicationHelper
|
||||||
|
|
||||||
def css_variant(opts = {})
|
def css_variant(opts = {})
|
||||||
variant = use_responsive_layout? ? 'responsive_layout' : 'new_styles'
|
variant = use_responsive_layout? ? 'responsive_layout' : 'new_styles'
|
||||||
use_high_contrast = @current_user && @current_user.prefers_high_contrast? || opts[:force_high_contrast]
|
use_high_contrast = (@current_user && @current_user.prefers_high_contrast?) || opts[:force_high_contrast]
|
||||||
variant + (use_high_contrast ? '_high_contrast' : '_normal_contrast') + (I18n.rtl? ? '_rtl' : '')
|
variant + (use_high_contrast ? '_high_contrast' : '_normal_contrast') + (I18n.rtl? ? '_rtl' : '')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -126,7 +126,7 @@ module AttachmentHelper
|
||||||
cancel_cache_buster
|
cancel_cache_buster
|
||||||
# set cache to expire whenever the s3 url does (or one day if local or inline proxy), max-age take seconds, and Expires takes a date
|
# set cache to expire whenever the s3 url does (or one day if local or inline proxy), max-age take seconds, and Expires takes a date
|
||||||
ttl = direct ? 1.day : attachment.url_ttl
|
ttl = direct ? 1.day : attachment.url_ttl
|
||||||
response.headers["Cache-Control"] = "private, max-age=#{ttl.seconds.to_s}"
|
response.headers["Cache-Control"] = "private, max-age=#{ttl.seconds}"
|
||||||
response.headers["Expires"] = ttl.from_now.httpdate
|
response.headers["Expires"] = ttl.from_now.httpdate
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -28,7 +28,7 @@ module AvatarHelper
|
||||||
if session["reported_#{user_id}"] && !is_admin && !(user && user.avatar_state == :approved)
|
if session["reported_#{user_id}"] && !is_admin && !(user && user.avatar_state == :approved)
|
||||||
["/images/messages/avatar-50.png", '']
|
["/images/messages/avatar-50.png", '']
|
||||||
else
|
else
|
||||||
avatar_settings = @domain_root_account && @domain_root_account.settings[:avatars] || 'enabled'
|
avatar_settings = (@domain_root_account && @domain_root_account.settings[:avatars]) || 'enabled'
|
||||||
user_id = Shard.global_id_for(user_id)
|
user_id = Shard.global_id_for(user_id)
|
||||||
user_shard = Shard.shard_for(user_id)
|
user_shard = Shard.shard_for(user_id)
|
||||||
image_url, alt_tag = user_shard.activate do
|
image_url, alt_tag = user_shard.activate do
|
||||||
|
@ -103,7 +103,7 @@ module AvatarHelper
|
||||||
default_avatar = use_fallback ? User.avatar_fallback_url(User.default_avatar_fallback, request) : nil
|
default_avatar = use_fallback ? User.avatar_fallback_url(User.default_avatar_fallback, request) : nil
|
||||||
url = if avatars_enabled_for_user?(user, root_account: root_account)
|
url = if avatars_enabled_for_user?(user, root_account: root_account)
|
||||||
user.avatar_url(nil,
|
user.avatar_url(nil,
|
||||||
(root_account && root_account.settings[:avatars] || 'enabled'),
|
((root_account && root_account.settings[:avatars]) || 'enabled'),
|
||||||
default_avatar,
|
default_avatar,
|
||||||
request,
|
request,
|
||||||
use_fallback)
|
use_fallback)
|
||||||
|
|
|
@ -23,16 +23,16 @@ module ContextModulesHelper
|
||||||
include CyoeHelper
|
include CyoeHelper
|
||||||
|
|
||||||
TRANSLATED_COMMENT_TYPE = {
|
TRANSLATED_COMMENT_TYPE = {
|
||||||
'Announcement': I18n.t('Announcement'),
|
Announcement: I18n.t('Announcement'),
|
||||||
'Assignment': I18n.t('Assignment'),
|
Assignment: I18n.t('Assignment'),
|
||||||
'Attachment': I18n.t('Attachment'),
|
Attachment: I18n.t('Attachment'),
|
||||||
'ContextExternalTool': I18n.t('External Tool'),
|
ContextExternalTool: I18n.t('External Tool'),
|
||||||
'ContextModuleSubHeader': I18n.t('Context Module Sub Header'),
|
ContextModuleSubHeader: I18n.t('Context Module Sub Header'),
|
||||||
'DiscussionTopic': I18n.t('Discussion Topic'),
|
DiscussionTopic: I18n.t('Discussion Topic'),
|
||||||
'ExternalUrl': I18n.t('External Url'),
|
ExternalUrl: I18n.t('External Url'),
|
||||||
'Quiz': I18n.t('Quiz'),
|
Quiz: I18n.t('Quiz'),
|
||||||
'Quizzes::Quiz': I18n.t('Quiz'),
|
'Quizzes::Quiz': I18n.t('Quiz'),
|
||||||
'WikiPage': I18n.t('Page')
|
WikiPage: I18n.t('Page')
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
def cache_if_module(context_module, editable, is_student, can_view_unpublished, user, context, &block)
|
def cache_if_module(context_module, editable, is_student, can_view_unpublished, user, context, &block)
|
||||||
|
|
|
@ -154,7 +154,7 @@ module GradebooksHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def pass_fail_icon(score, grade)
|
def pass_fail_icon(score, grade)
|
||||||
if score && score > 0 || grade == 'complete'
|
if (score && score > 0) || grade == 'complete'
|
||||||
icon_attrs = pass_icon_attributes
|
icon_attrs = pass_icon_attributes
|
||||||
else
|
else
|
||||||
icon_attrs = fail_icon_attributes
|
icon_attrs = fail_icon_attributes
|
||||||
|
|
|
@ -462,9 +462,9 @@ module QuizzesHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
if answer_list.empty?
|
if answer_list.empty?
|
||||||
answers.delete_if { |k, v| !k.match /^question_#{hash_get(question, :id)}/ }
|
answers.delete_if { |k, v| !k.match(/^question_#{hash_get(question, :id)}/) }
|
||||||
answers.each { |k, v| res.sub! /\{\{#{k}\}\}/, h(v) }
|
answers.each { |k, v| res.sub!(/\{\{#{k}\}\}/, h(v)) }
|
||||||
res.gsub! /\{\{question_[^}]+\}\}/, ""
|
res.gsub!(/\{\{question_[^}]+\}\}/, "")
|
||||||
end
|
end
|
||||||
|
|
||||||
# all of our manipulation lost this flag - reset it
|
# all of our manipulation lost this flag - reset it
|
||||||
|
|
|
@ -142,7 +142,7 @@ module SearchHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def search_contexts_and_users(options = {})
|
def search_contexts_and_users(options = {})
|
||||||
types = (options[:types] || [] + [options[:type]]).compact
|
types = (options[:types] || ([] + [options[:type]])).compact
|
||||||
types |= [:course, :section, :group] if types.delete('context')
|
types |= [:course, :section, :group] if types.delete('context')
|
||||||
types = if types.present?
|
types = if types.present?
|
||||||
{ user: types.delete('user').present?, context: types.present? && types.map(&:to_sym) }
|
{ user: types.delete('user').present?, context: types.present? && types.map(&:to_sym) }
|
||||||
|
|
|
@ -258,7 +258,7 @@ class AccountNotification < ActiveRecord::Base
|
||||||
# we just need a stable reference point, doesn't matter what it is, so
|
# we just need a stable reference point, doesn't matter what it is, so
|
||||||
# let's use unix epoch
|
# let's use unix epoch
|
||||||
start_time = Time.at(0).utc
|
start_time = Time.at(0).utc
|
||||||
months_since_start_time = (current_time.year - start_time.year) * 12 + (current_time.month - start_time.month)
|
months_since_start_time = ((current_time.year - start_time.year) * 12) + (current_time.month - start_time.month)
|
||||||
periods_since_start_time = months_since_start_time / months_in_period
|
periods_since_start_time = months_since_start_time / months_in_period
|
||||||
months_into_current_period = months_since_start_time % months_in_period
|
months_into_current_period = months_since_start_time % months_in_period
|
||||||
mod_value = (Random.new(periods_since_start_time).rand(months_in_period) + months_into_current_period) % months_in_period
|
mod_value = (Random.new(periods_since_start_time).rand(months_in_period) + months_into_current_period) % months_in_period
|
||||||
|
|
|
@ -36,7 +36,7 @@ class AppointmentGroup < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def contexts
|
def contexts
|
||||||
appointment_group_contexts.map &:context
|
appointment_group_contexts.map(&:context)
|
||||||
end
|
end
|
||||||
|
|
||||||
def active_contexts
|
def active_contexts
|
||||||
|
@ -45,7 +45,7 @@ class AppointmentGroup < ActiveRecord::Base
|
||||||
|
|
||||||
def sub_contexts
|
def sub_contexts
|
||||||
# I wonder how rails is adding multiples of the same sub_contexts
|
# I wonder how rails is adding multiples of the same sub_contexts
|
||||||
appointment_group_sub_contexts.map &:sub_context
|
appointment_group_sub_contexts.map(&:sub_context)
|
||||||
end
|
end
|
||||||
|
|
||||||
validates_presence_of :workflow_state
|
validates_presence_of :workflow_state
|
||||||
|
@ -184,7 +184,7 @@ class AppointmentGroup < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def sub_context_codes
|
def sub_context_codes
|
||||||
appointment_group_sub_contexts.map &:sub_context_code
|
appointment_group_sub_contexts.map(&:sub_context_code)
|
||||||
end
|
end
|
||||||
|
|
||||||
# complements :reserve permission
|
# complements :reserve permission
|
||||||
|
|
|
@ -24,7 +24,7 @@ class AppointmentGroupSubContext < ActiveRecord::Base
|
||||||
|
|
||||||
validates_each :sub_context do |record, attr, value|
|
validates_each :sub_context do |record, attr, value|
|
||||||
if record.participant_type == 'User'
|
if record.participant_type == 'User'
|
||||||
record.errors.add(attr, t('errors.invalid_course_section', 'Invalid course section')) unless value.blank? || value.is_a?(CourseSection) && record.appointment_group.contexts.any? { |c| c == value.course }
|
record.errors.add(attr, t('errors.invalid_course_section', 'Invalid course section')) unless value.blank? || (value.is_a?(CourseSection) && record.appointment_group.contexts.any? { |c| c == value.course })
|
||||||
else
|
else
|
||||||
record.errors.add(attr, t('errors.missing_group_category', 'Group appointments must have a group category')) unless value.present? && value.is_a?(GroupCategory)
|
record.errors.add(attr, t('errors.missing_group_category', 'Group appointments must have a group category')) unless value.present? && value.is_a?(GroupCategory)
|
||||||
record.errors.add(attr, t('errors.invalid_group_category', 'Invalid group category')) unless value && record.appointment_group.contexts.any? { |c| c == value.context }
|
record.errors.add(attr, t('errors.invalid_group_category', 'Invalid group category')) unless value && record.appointment_group.contexts.any? { |c| c == value.context }
|
||||||
|
|
|
@ -2160,7 +2160,7 @@ class Assignment < ActiveRecord::Base
|
||||||
raise "Student Required" unless original_student
|
raise "Student Required" unless original_student
|
||||||
|
|
||||||
group, students = group_students(original_student)
|
group, students = group_students(original_student)
|
||||||
opts[:author] ||= opts[:commenter] || opts[:user_id].present? && User.find_by(id: opts[:user_id])
|
opts[:author] ||= opts[:commenter] || (opts[:user_id].present? && User.find_by(id: opts[:user_id]))
|
||||||
res = {
|
res = {
|
||||||
comments: [],
|
comments: [],
|
||||||
submissions: []
|
submissions: []
|
||||||
|
|
|
@ -370,7 +370,7 @@ class AssignmentOverride < ActiveRecord::Base
|
||||||
self.assignment.created_at < 3.hours.ago &&
|
self.assignment.created_at < 3.hours.ago &&
|
||||||
(saved_change_to_workflow_state? ||
|
(saved_change_to_workflow_state? ||
|
||||||
saved_change_to_due_at_overridden? ||
|
saved_change_to_due_at_overridden? ||
|
||||||
due_at_overridden && !Assignment.due_dates_equal?(due_at, due_at_before_last_save))
|
(due_at_overridden && !Assignment.due_dates_equal?(due_at, due_at_before_last_save)))
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_title_if_needed
|
def set_title_if_needed
|
||||||
|
|
|
@ -903,9 +903,9 @@ class Attachment < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_be_proxied?
|
def can_be_proxied?
|
||||||
mime_class == 'html' && size < Setting.get('max_inline_html_proxy_size', 128 * 1024).to_i ||
|
(mime_class == 'html' && size < Setting.get('max_inline_html_proxy_size', 128 * 1024).to_i) ||
|
||||||
mime_class == 'flash' && size < Setting.get('max_swf_proxy_size', 1024 * 1024).to_i ||
|
(mime_class == 'flash' && size < Setting.get('max_swf_proxy_size', 1024 * 1024).to_i) ||
|
||||||
content_type == 'text/css' && size < Setting.get('max_css_proxy_size', 64 * 1024).to_i
|
(content_type == 'text/css' && size < Setting.get('max_css_proxy_size', 64 * 1024).to_i)
|
||||||
end
|
end
|
||||||
|
|
||||||
def local_storage_path
|
def local_storage_path
|
||||||
|
@ -1028,7 +1028,7 @@ class Attachment < ActiveRecord::Base
|
||||||
block ||= lambda { |str, len| str[0...len] }
|
block ||= lambda { |str, len| str[0...len] }
|
||||||
ext_index = filename.rindex('.')
|
ext_index = filename.rindex('.')
|
||||||
if ext_index
|
if ext_index
|
||||||
ext = block.call(filename[ext_index..-1], len / 2 + 1)
|
ext = block.call(filename[ext_index..-1], (len / 2) + 1)
|
||||||
base = block.call(filename[0...ext_index], len - ext.length)
|
base = block.call(filename[0...ext_index], len - ext.length)
|
||||||
base + ext
|
base + ext
|
||||||
else
|
else
|
||||||
|
|
|
@ -29,7 +29,7 @@ class Attachments::LocalStorage
|
||||||
end
|
end
|
||||||
|
|
||||||
def exists?
|
def exists?
|
||||||
File.exists?(attachment.full_filename)
|
File.exist?(attachment.full_filename)
|
||||||
end
|
end
|
||||||
|
|
||||||
def change_namespace(old_full_filename)
|
def change_namespace(old_full_filename)
|
||||||
|
|
|
@ -86,7 +86,7 @@ class Attachments::S3Storage
|
||||||
|
|
||||||
def shared_secret(datetime)
|
def shared_secret(datetime)
|
||||||
config = bucket.client.config
|
config = bucket.client.config
|
||||||
sha256 = OpenSSL::Digest::SHA256.new
|
sha256 = OpenSSL::Digest.new('SHA256')
|
||||||
date_key = OpenSSL::HMAC.digest(sha256, "AWS4#{config.secret_access_key}", datetime[0, 8])
|
date_key = OpenSSL::HMAC.digest(sha256, "AWS4#{config.secret_access_key}", datetime[0, 8])
|
||||||
date_region_key = OpenSSL::HMAC.digest(sha256, date_key, config.region)
|
date_region_key = OpenSSL::HMAC.digest(sha256, date_key, config.region)
|
||||||
date_region_service_key = OpenSSL::HMAC.digest(sha256, date_region_key, "s3")
|
date_region_service_key = OpenSSL::HMAC.digest(sha256, date_region_key, "s3")
|
||||||
|
|
|
@ -130,7 +130,7 @@ class CalendarEvent < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def effective_context
|
def effective_context
|
||||||
effective_context_code && ActiveRecord::Base.find_all_by_asset_string(effective_context_code).first || context
|
(effective_context_code && ActiveRecord::Base.find_all_by_asset_string(effective_context_code).first) || context
|
||||||
end
|
end
|
||||||
|
|
||||||
scope :active, -> { where("calendar_events.workflow_state<>'deleted'") }
|
scope :active, -> { where("calendar_events.workflow_state<>'deleted'") }
|
||||||
|
@ -661,7 +661,7 @@ class CalendarEvent < ActiveRecord::Base
|
||||||
given { |user, session|
|
given { |user, session|
|
||||||
appointment_group? && (
|
appointment_group? && (
|
||||||
grants_right?(user, session, :manage) ||
|
grants_right?(user, session, :manage) ||
|
||||||
context.grants_right?(user, :reserve) && context.participant_for(user).present?
|
(context.grants_right?(user, :reserve) && context.participant_for(user).present?)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
can :reserve
|
can :reserve
|
||||||
|
|
|
@ -54,7 +54,7 @@ class Canvadoc < ActiveRecord::Base
|
||||||
def submissions
|
def submissions
|
||||||
self.canvadocs_submissions
|
self.canvadocs_submissions
|
||||||
.preload(submission: :assignment)
|
.preload(submission: :assignment)
|
||||||
.map &:submission
|
.map(&:submission)
|
||||||
end
|
end
|
||||||
|
|
||||||
def available?
|
def available?
|
||||||
|
|
|
@ -615,7 +615,7 @@ class ContentMigration < ActiveRecord::Base
|
||||||
self.update_master_migration('failed') if self.for_master_course_import?
|
self.update_master_migration('failed') if self.for_master_course_import?
|
||||||
raise e
|
raise e
|
||||||
ensure
|
ensure
|
||||||
File.delete(all_files_path) if all_files_path && File.exists?(all_files_path)
|
File.delete(all_files_path) if all_files_path && File.exist?(all_files_path)
|
||||||
clear_migration_data
|
clear_migration_data
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -96,7 +96,7 @@ module Context
|
||||||
context_codes = sharded_course_ids.map { |id| "course_#{id}" }
|
context_codes = sharded_course_ids.map { |id| "course_#{id}" }
|
||||||
if Shard.current == self.shard
|
if Shard.current == self.shard
|
||||||
context = self
|
context = self
|
||||||
while context && context.respond_to?(:account) || context.respond_to?(:parent_account)
|
while (context && context.respond_to?(:account)) || context.respond_to?(:parent_account)
|
||||||
context = context.respond_to?(:account) ? context.account : context.parent_account
|
context = context.respond_to?(:account) ? context.account : context.parent_account
|
||||||
context_codes << context.asset_string if context
|
context_codes << context.asset_string if context
|
||||||
end
|
end
|
||||||
|
|
|
@ -241,7 +241,7 @@ class ContextModule < ActiveRecord::Base
|
||||||
# kept in the same module.
|
# kept in the same module.
|
||||||
def duplicate_content_tag(original_content_tag)
|
def duplicate_content_tag(original_content_tag)
|
||||||
new_tag = duplicate_content_tag_base_model(original_content_tag)
|
new_tag = duplicate_content_tag_base_model(original_content_tag)
|
||||||
if original_content_tag.content&.respond_to?(:duplicate)
|
if original_content_tag.content.respond_to?(:duplicate)
|
||||||
new_tag.content = original_content_tag.content.duplicate
|
new_tag.content = original_content_tag.content.duplicate
|
||||||
# If we have multiple assignments (e.g.) make sure they each get unused titles.
|
# If we have multiple assignments (e.g.) make sure they each get unused titles.
|
||||||
# A title isn't marked used if the assignment hasn't been saved yet.
|
# A title isn't marked used if the assignment hasn't been saved yet.
|
||||||
|
@ -634,7 +634,7 @@ class ContextModule < ActiveRecord::Base
|
||||||
|
|
||||||
def add_item(params, added_item = nil, opts = {})
|
def add_item(params, added_item = nil, opts = {})
|
||||||
params[:type] = params[:type].underscore if params[:type]
|
params[:type] = params[:type].underscore if params[:type]
|
||||||
position = opts[:position] || (self.content_tags.not_deleted.maximum(:position) || 0) + 1
|
position = opts[:position] || ((self.content_tags.not_deleted.maximum(:position) || 0) + 1)
|
||||||
position = [position, params[:position].to_i].max if params[:position]
|
position = [position, params[:position].to_i].max if params[:position]
|
||||||
if params[:type] == "wiki_page" || params[:type] == "page"
|
if params[:type] == "wiki_page" || params[:type] == "page"
|
||||||
item = opts[:wiki_page] || self.context.wiki_pages.where(id: params[:id]).first
|
item = opts[:wiki_page] || self.context.wiki_pages.where(id: params[:id]).first
|
||||||
|
|
|
@ -91,7 +91,7 @@ class ConversationBatch < ActiveRecord::Base
|
||||||
# headway. every minute we will advance half of the remainder of
|
# headway. every minute we will advance half of the remainder of
|
||||||
# job_start_factor.
|
# job_start_factor.
|
||||||
minutes = (Time.zone.now - created_at).to_i / 60.0
|
minutes = (Time.zone.now - created_at).to_i / 60.0
|
||||||
job_start_factor * (1 - (1 / 2**minutes))
|
job_start_factor * (1 - (1 / (2**minutes)))
|
||||||
else
|
else
|
||||||
# the rest of the progress bar is nice and linear
|
# the rest of the progress bar is nice and linear
|
||||||
job_start_factor + ((1 - job_start_factor) * conversation_message_ids.size / recipient_ids.size)
|
job_start_factor + ((1 - job_start_factor) * conversation_message_ids.size / recipient_ids.size)
|
||||||
|
|
|
@ -302,7 +302,7 @@ class ConversationMessage < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def forwarded_messages
|
def forwarded_messages
|
||||||
@forwarded_messages ||= forwarded_message_ids && self.class.unscoped { self.class.where(id: forwarded_message_ids.split(',')).order('created_at DESC').to_a } || []
|
@forwarded_messages ||= (forwarded_message_ids && self.class.unscoped { self.class.where(id: forwarded_message_ids.split(',')).order('created_at DESC').to_a }) || []
|
||||||
end
|
end
|
||||||
|
|
||||||
def all_forwarded_messages
|
def all_forwarded_messages
|
||||||
|
|
|
@ -1162,7 +1162,7 @@ class Course < ActiveRecord::Base
|
||||||
|
|
||||||
def update_enrolled_users(sis_batch: nil)
|
def update_enrolled_users(sis_batch: nil)
|
||||||
self.shard.activate do
|
self.shard.activate do
|
||||||
if self.workflow_state_changed? || sis_batch && self.saved_change_to_workflow_state?
|
if self.workflow_state_changed? || (sis_batch && self.saved_change_to_workflow_state?)
|
||||||
if self.completed?
|
if self.completed?
|
||||||
enrollment_info = Enrollment.where(:course_id => self, :workflow_state => ['active', 'invited']).select(:id, :workflow_state).to_a
|
enrollment_info = Enrollment.where(:course_id => self, :workflow_state => ['active', 'invited']).select(:id, :workflow_state).to_a
|
||||||
if enrollment_info.any?
|
if enrollment_info.any?
|
||||||
|
@ -1625,7 +1625,7 @@ class Course < ActiveRecord::Base
|
||||||
can permission
|
can permission
|
||||||
end
|
end
|
||||||
|
|
||||||
given { |user, session| session && session[:enrollment_uuid] && (hash = Enrollment.course_user_state(self, session[:enrollment_uuid]) || {}) && (hash[:enrollment_state] == "invited" || hash[:enrollment_state] == "active" && hash[:user_state].to_s == "pre_registered") && (self.available? || self.completed? || self.claimed? && hash[:is_admin]) }
|
given { |user, session| session && session[:enrollment_uuid] && (hash = Enrollment.course_user_state(self, session[:enrollment_uuid]) || {}) && (hash[:enrollment_state] == "invited" || (hash[:enrollment_state] == "active" && hash[:user_state].to_s == "pre_registered")) && (self.available? || self.completed? || (self.claimed? && hash[:is_admin])) }
|
||||||
can :read and can :read_outcomes
|
can :read and can :read_outcomes
|
||||||
|
|
||||||
given { |user| (self.available? || self.completed?) && user && fetch_on_enrollments("has_not_inactive_enrollment", user) { enrollments.for_user(user).not_inactive_by_date.exists? } }
|
given { |user| (self.available? || self.completed?) && user && fetch_on_enrollments("has_not_inactive_enrollment", user) { enrollments.for_user(user).not_inactive_by_date.exists? } }
|
||||||
|
|
|
@ -992,8 +992,8 @@ class DiscussionTopic < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def should_clear_all_stream_items?
|
def should_clear_all_stream_items?
|
||||||
!self.published? && self.saved_change_to_attribute?(:workflow_state) ||
|
(!self.published? && self.saved_change_to_attribute?(:workflow_state)) ||
|
||||||
self.is_announcement && self.not_available_yet? && self.saved_change_to_attribute?(:delayed_post_at)
|
(self.is_announcement && self.not_available_yet? && self.saved_change_to_attribute?(:delayed_post_at))
|
||||||
end
|
end
|
||||||
|
|
||||||
def clear_non_applicable_stream_items
|
def clear_non_applicable_stream_items
|
||||||
|
@ -1341,7 +1341,7 @@ class DiscussionTopic < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def visible_to_admins_only?
|
def visible_to_admins_only?
|
||||||
self.context.respond_to?(:available?) && !self.context.available? ||
|
(self.context.respond_to?(:available?) && !self.context.available?) ||
|
||||||
unpublished? || not_available_yet? || not_available_anymore?
|
unpublished? || not_available_yet? || not_available_anymore?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1414,10 +1414,10 @@ class Enrollment < ActiveRecord::Base
|
||||||
# find it, fall back to the section or course creation date.
|
# find it, fall back to the section or course creation date.
|
||||||
enrollment_dates.map(&:first).compact.min ||
|
enrollment_dates.map(&:first).compact.min ||
|
||||||
start_at ||
|
start_at ||
|
||||||
course_section && course_section.start_at ||
|
(course_section && course_section.start_at) ||
|
||||||
course.start_at ||
|
course.start_at ||
|
||||||
course.enrollment_term && course.enrollment_term.start_at ||
|
(course.enrollment_term && course.enrollment_term.start_at) ||
|
||||||
course_section && course_section.created_at ||
|
(course_section && course_section.created_at) ||
|
||||||
course.created_at
|
course.created_at
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1427,9 +1427,9 @@ class Enrollment < ActiveRecord::Base
|
||||||
# looking at the enrollment, section, course, then term.
|
# looking at the enrollment, section, course, then term.
|
||||||
enrollment_dates.map(&:last).compact.max ||
|
enrollment_dates.map(&:last).compact.max ||
|
||||||
end_at ||
|
end_at ||
|
||||||
course_section && course_section.end_at ||
|
(course_section && course_section.end_at) ||
|
||||||
course.conclude_at ||
|
course.conclude_at ||
|
||||||
course.enrollment_term && course.enrollment_term.end_at
|
(course.enrollment_term && course.enrollment_term.end_at)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.cross_shard_invitations?
|
def self.cross_shard_invitations?
|
||||||
|
@ -1540,10 +1540,10 @@ class Enrollment < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_delete_via_granular(user, session, context)
|
def can_delete_via_granular(user, session, context)
|
||||||
self.teacher? && context.grants_right?(user, session, :remove_teacher_from_course) ||
|
(self.teacher? && context.grants_right?(user, session, :remove_teacher_from_course)) ||
|
||||||
self.ta? && context.grants_right?(user, session, :remove_ta_from_course) ||
|
(self.ta? && context.grants_right?(user, session, :remove_ta_from_course)) ||
|
||||||
self.designer? && context.grants_right?(user, session, :remove_designer_from_course) ||
|
(self.designer? && context.grants_right?(user, session, :remove_designer_from_course)) ||
|
||||||
self.observer? && context.grants_right?(user, session, :remove_observer_from_course)
|
(self.observer? && context.grants_right?(user, session, :remove_observer_from_course))
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove_user_as_final_grader?
|
def remove_user_as_final_grader?
|
||||||
|
|
|
@ -52,7 +52,7 @@ class EnrollmentState < ActiveRecord::Base
|
||||||
|
|
||||||
# check if we've manually marked the enrollment state as potentially out of date (or if the stored date trigger has past)
|
# check if we've manually marked the enrollment state as potentially out of date (or if the stored date trigger has past)
|
||||||
def state_needs_recalculation?
|
def state_needs_recalculation?
|
||||||
!self.state_is_current? || self.state_valid_until && self.state_valid_until < Time.now
|
!self.state_is_current? || (self.state_valid_until && self.state_valid_until < Time.now)
|
||||||
end
|
end
|
||||||
|
|
||||||
def ensure_current_state
|
def ensure_current_state
|
||||||
|
|
|
@ -57,7 +57,7 @@ class EportfolioEntry < ActiveRecord::Base
|
||||||
protected :update_portfolio
|
protected :update_portfolio
|
||||||
|
|
||||||
def content_sections
|
def content_sections
|
||||||
(self.content.is_a?(String) && Array(self.content) || self.content || []).map do |section|
|
((self.content.is_a?(String) && Array(self.content)) || self.content || []).map do |section|
|
||||||
if section.is_a?(Hash)
|
if section.is_a?(Hash)
|
||||||
section.with_indifferent_access
|
section.with_indifferent_access
|
||||||
else
|
else
|
||||||
|
|
|
@ -127,7 +127,7 @@ class FeatureFlag < ActiveRecord::Base
|
||||||
private
|
private
|
||||||
|
|
||||||
def valid_state
|
def valid_state
|
||||||
unless [Feature::STATE_OFF, Feature::STATE_ON].include?(state) || context.is_a?(Account) && [Feature::STATE_DEFAULT_OFF, Feature::STATE_DEFAULT_ON].include?(state)
|
unless [Feature::STATE_OFF, Feature::STATE_ON].include?(state) || (context.is_a?(Account) && [Feature::STATE_DEFAULT_OFF, Feature::STATE_DEFAULT_ON].include?(state))
|
||||||
errors.add(:state, "is not valid in context")
|
errors.add(:state, "is not valid in context")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -113,9 +113,9 @@ class GradingStandard < ActiveRecord::Base
|
||||||
# otherwise, we step down just 1/10th of a point, which is the
|
# otherwise, we step down just 1/10th of a point, which is the
|
||||||
# granularity we support right now
|
# granularity we support right now
|
||||||
elsif idx && (ordered_scheme[idx].last - ordered_scheme[idx - 1].last).abs >= 0.01.to_d
|
elsif idx && (ordered_scheme[idx].last - ordered_scheme[idx - 1].last).abs >= 0.01.to_d
|
||||||
ordered_scheme[idx - 1].last * 100.0.to_d - 1.0.to_d
|
(ordered_scheme[idx - 1].last * 100.0.to_d) - 1.0.to_d
|
||||||
elsif idx
|
elsif idx
|
||||||
ordered_scheme[idx - 1].last * 100.0.to_d - 0.1.to_d
|
(ordered_scheme[idx - 1].last * 100.0.to_d) - 0.1.to_d
|
||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
|
@ -158,7 +158,7 @@ module Importers
|
||||||
end
|
end
|
||||||
|
|
||||||
if asset
|
if asset
|
||||||
options = alignment.slice(*[:mastery_type, :mastery_score])
|
options = alignment.slice(:mastery_type, :mastery_score)
|
||||||
item.align(asset, context, options)
|
item.align(asset, context, options)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -64,7 +64,7 @@ module Importers
|
||||||
return unless node[attr].present?
|
return unless node[attr].present?
|
||||||
|
|
||||||
if attr == 'value'
|
if attr == 'value'
|
||||||
return unless node[attr] && node[attr] =~ %r{IMS(?:-|_)CC(?:-|_)FILEBASE} || node[attr] =~ %r{CANVAS_COURSE_REFERENCE}
|
return unless (node[attr] && node[attr] =~ %r{IMS(?:-|_)CC(?:-|_)FILEBASE}) || node[attr] =~ %r{CANVAS_COURSE_REFERENCE}
|
||||||
end
|
end
|
||||||
|
|
||||||
url = node[attr].dup
|
url = node[attr].dup
|
||||||
|
@ -143,14 +143,14 @@ module Importers
|
||||||
|
|
||||||
elsif url =~ %r{\$IMS(?:-|_)CC(?:-|_)FILEBASE\$/(.*)}
|
elsif url =~ %r{\$IMS(?:-|_)CC(?:-|_)FILEBASE\$/(.*)}
|
||||||
rel_path = URI.unescape($1)
|
rel_path = URI.unescape($1)
|
||||||
if attr == 'href' && node['class'] && node['class'] =~ /instructure_inline_media_comment/ ||
|
if (attr == 'href' && node['class'] && node['class'] =~ /instructure_inline_media_comment/) ||
|
||||||
attr == 'src' && node.name == 'iframe' && node['data-media-id']
|
(attr == 'src' && node.name == 'iframe' && node['data-media-id'])
|
||||||
unresolved(:media_object, :rel_path => rel_path)
|
unresolved(:media_object, :rel_path => rel_path)
|
||||||
else
|
else
|
||||||
unresolved(:file, :rel_path => rel_path)
|
unresolved(:file, :rel_path => rel_path)
|
||||||
end
|
end
|
||||||
elsif attr == 'href' && node['class'] && node['class'] =~ /instructure_inline_media_comment/ ||
|
elsif (attr == 'href' && node['class'] && node['class'] =~ /instructure_inline_media_comment/) ||
|
||||||
attr == 'src' && node.name == 'iframe' && node['data-media-id']
|
(attr == 'src' && node.name == 'iframe' && node['data-media-id'])
|
||||||
# Course copy media reference, leave it alone
|
# Course copy media reference, leave it alone
|
||||||
resolved
|
resolved
|
||||||
elsif attr == 'src' && (info_match = url.match(/\Adata:(?<mime_type>[-\w]+\/[-\w\+\.]+)?;base64,(?<image>.*)/m))
|
elsif attr == 'src' && (info_match = url.match(/\Adata:(?<mime_type>[-\w]+\/[-\w\+\.]+)?;base64,(?<image>.*)/m))
|
||||||
|
|
|
@ -160,7 +160,7 @@ module IncomingMail
|
||||||
end
|
end
|
||||||
|
|
||||||
def parse_tag(tag)
|
def parse_tag(tag)
|
||||||
match = tag.match /^(\h+)-([0-9~]+)(?:-([0-9]+))?$/
|
match = tag.match(/^(\h+)-([0-9~]+)(?:-([0-9]+))?$/)
|
||||||
return match[1], match[2], match[3] if match
|
return match[1], match[2], match[3] if match
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ class NotificationEndpoint < ActiveRecord::Base
|
||||||
# is happening.
|
# is happening.
|
||||||
endpoint_updated = false
|
endpoint_updated = false
|
||||||
if retried
|
if retried
|
||||||
raise FailedSnsInteraction, "Unable to create or reassign SNS endpoint for access_token #{access_token.global_id.to_s}"
|
raise FailedSnsInteraction, "Unable to create or reassign SNS endpoint for access_token #{access_token.global_id}"
|
||||||
end
|
end
|
||||||
|
|
||||||
retried = true
|
retried = true
|
||||||
|
|
|
@ -45,14 +45,14 @@ module OutcomesService
|
||||||
|
|
||||||
def outcome_attributes(learning_outcome)
|
def outcome_attributes(learning_outcome)
|
||||||
attrs = learning_outcome.attributes.transform_keys(&:to_sym)
|
attrs = learning_outcome.attributes.transform_keys(&:to_sym)
|
||||||
attrs[:'$canvas_learning_outcome_id'] = attrs.delete(:id)
|
attrs[:$canvas_learning_outcome_id] = attrs.delete(:id)
|
||||||
attrs[:rubric_criterion] = attrs.delete(:data)[:rubric_criterion]
|
attrs[:rubric_criterion] = attrs.delete(:data)[:rubric_criterion]
|
||||||
attrs.except(:migration_id_2, :vendor_guid_2, :root_account_id, :context_type, :context_id)
|
attrs.except(:migration_id_2, :vendor_guid_2, :root_account_id, :context_type, :context_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def group_attributes(learning_outcome_group)
|
def group_attributes(learning_outcome_group)
|
||||||
attrs = learning_outcome_group.attributes.transform_keys(&:to_sym)
|
attrs = learning_outcome_group.attributes.transform_keys(&:to_sym)
|
||||||
attrs[:'$canvas_learning_outcome_group_id'] = attrs.delete(:id)
|
attrs[:$canvas_learning_outcome_group_id] = attrs.delete(:id)
|
||||||
attrs[:parent_outcome_group_id] = attrs.delete(:learning_outcome_group_id)
|
attrs[:parent_outcome_group_id] = attrs.delete(:learning_outcome_group_id)
|
||||||
attrs.except(:root_learning_outcome_group_id, :root_account_id, :migration_id_2, :vendor_guid_2)
|
attrs.except(:root_learning_outcome_group_id, :root_account_id, :migration_id_2, :vendor_guid_2)
|
||||||
end
|
end
|
||||||
|
|
|
@ -116,7 +116,7 @@ class Quizzes::QuizStatistics::ItemAnalysis::Summary
|
||||||
|
|
||||||
if size > 1 && variance != 0
|
if size > 1 && variance != 0
|
||||||
variance_sum = items.map(&:variance).sum
|
variance_sum = items.map(&:variance).sum
|
||||||
size / (size - 1.0) * (1 - variance_sum / variance)
|
size / (size - 1.0) * (1 - (variance_sum / variance))
|
||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
|
@ -31,12 +31,9 @@ class Quizzes::QuizStatisticsService
|
||||||
# An object ready for API serialization containing (persisted) versions of
|
# An object ready for API serialization containing (persisted) versions of
|
||||||
# the *latest* Student and Item analysis for the quiz.
|
# the *latest* Student and Item analysis for the quiz.
|
||||||
def generate_aggregate_statistics(all_versions, includes_sis_ids = true, options = {})
|
def generate_aggregate_statistics(all_versions, includes_sis_ids = true, options = {})
|
||||||
Quizzes::QuizStatisticsSerializer::Input.new(quiz, options, *[
|
Quizzes::QuizStatisticsSerializer::Input.new(quiz, options, quiz.current_statistics_for('student_analysis', {
|
||||||
quiz.current_statistics_for('student_analysis', {
|
includes_all_versions: all_versions,
|
||||||
includes_all_versions: all_versions,
|
includes_sis_ids: includes_sis_ids
|
||||||
includes_sis_ids: includes_sis_ids
|
}), quiz.current_statistics_for('item_analysis'))
|
||||||
}),
|
|
||||||
quiz.current_statistics_for('item_analysis')
|
|
||||||
])
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -33,11 +33,11 @@ module QuizzesNext
|
||||||
return if assignments.empty?
|
return if assignments.empty?
|
||||||
|
|
||||||
{
|
{
|
||||||
"original_course_uuid": course.uuid,
|
original_course_uuid: course.uuid,
|
||||||
"assignments": assignments.map do |assignment|
|
assignments: assignments.map do |assignment|
|
||||||
{
|
{
|
||||||
"original_resource_link_id": assignment.lti_resource_link_id,
|
original_resource_link_id: assignment.lti_resource_link_id,
|
||||||
"original_assignment_id": assignment.id,
|
original_assignment_id: assignment.id,
|
||||||
"$canvas_assignment_id": assignment.id # transformed to new id
|
"$canvas_assignment_id": assignment.id # transformed to new id
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -186,7 +186,7 @@ class Role < ActiveRecord::Base
|
||||||
# Should order course roles so we get "StudentEnrollment", custom student roles, "Teacher Enrollment", custom teacher roles, etc
|
# Should order course roles so we get "StudentEnrollment", custom student roles, "Teacher Enrollment", custom teacher roles, etc
|
||||||
def display_sort_index
|
def display_sort_index
|
||||||
if self.course_role?
|
if self.course_role?
|
||||||
ENROLLMENT_TYPES.index(self.base_role_type) * 2 + (self.built_in? ? 0 : 1)
|
(ENROLLMENT_TYPES.index(self.base_role_type) * 2) + (self.built_in? ? 0 : 1)
|
||||||
else
|
else
|
||||||
self.built_in? ? 0 : 1
|
self.built_in? ? 0 : 1
|
||||||
end
|
end
|
||||||
|
|
|
@ -368,7 +368,7 @@ class SisBatch < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def file_diff_percent(current_file_size, previous_zip_size)
|
def file_diff_percent(current_file_size, previous_zip_size)
|
||||||
(1 - current_file_size.to_f / previous_zip_size.to_f).abs * 100
|
(1 - (current_file_size.to_f / previous_zip_size.to_f)).abs * 100
|
||||||
end
|
end
|
||||||
|
|
||||||
def download_zip
|
def download_zip
|
||||||
|
|
|
@ -158,7 +158,7 @@ class SisPseudonym
|
||||||
end
|
end
|
||||||
|
|
||||||
def use_loaded_collection?(shard)
|
def use_loaded_collection?(shard)
|
||||||
user.pseudonyms.loaded? && user.shard == shard ||
|
(user.pseudonyms.loaded? && user.shard == shard) ||
|
||||||
(include_deleted ? user.all_pseudonyms_loaded? : user.all_active_pseudonyms_loaded?)
|
(include_deleted ? user.all_pseudonyms_loaded? : user.all_active_pseudonyms_loaded?)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1582,7 +1582,7 @@ class Submission < ActiveRecord::Base
|
||||||
def score_late_or_none(late_policy, points_possible, grading_type)
|
def score_late_or_none(late_policy, points_possible, grading_type)
|
||||||
raw_score = score_changed? || @regraded ? score : entered_score
|
raw_score = score_changed? || @regraded ? score : entered_score
|
||||||
deducted = late_points_deducted(raw_score, late_policy, points_possible, grading_type)
|
deducted = late_points_deducted(raw_score, late_policy, points_possible, grading_type)
|
||||||
new_score = raw_score && raw_score - deducted
|
new_score = raw_score && (raw_score - deducted)
|
||||||
self.points_deducted = late? ? deducted : nil
|
self.points_deducted = late? ? deducted : nil
|
||||||
self.score = new_score
|
self.score = new_score
|
||||||
end
|
end
|
||||||
|
@ -1945,7 +1945,7 @@ class Submission < ActiveRecord::Base
|
||||||
# since they're all being held on the assignment for now.
|
# since they're all being held on the assignment for now.
|
||||||
attachments ||= []
|
attachments ||= []
|
||||||
old_ids = (Array(self.attachment_ids || "").join(",")).split(",").map { |id| id.to_i }
|
old_ids = (Array(self.attachment_ids || "").join(",")).split(",").map { |id| id.to_i }
|
||||||
write_attribute(:attachment_ids, attachments.select { |a| a && a.id && old_ids.include?(a.id) || (a.recently_created? && a.context == self.assignment) || a.context != self.assignment }.map { |a| a.id }.join(","))
|
write_attribute(:attachment_ids, attachments.select { |a| (a && a.id && old_ids.include?(a.id)) || (a.recently_created? && a.context == self.assignment) || a.context != self.assignment }.map { |a| a.id }.join(","))
|
||||||
end
|
end
|
||||||
|
|
||||||
# someday code-archaeologists will wonder how this method came to be named
|
# someday code-archaeologists will wonder how this method came to be named
|
||||||
|
|
|
@ -1297,13 +1297,13 @@ class User < ActiveRecord::Base
|
||||||
(Account.site_admin.grants_right?(user, :reset_any_mfa)) ||
|
(Account.site_admin.grants_right?(user, :reset_any_mfa)) ||
|
||||||
# an admin can reset another user's MFA only if they can manage *all*
|
# an admin can reset another user's MFA only if they can manage *all*
|
||||||
# of the user's pseudonyms
|
# of the user's pseudonyms
|
||||||
self != user && self.pseudonyms.shard(self).all? do |p|
|
(self != user && self.pseudonyms.shard(self).all? do |p|
|
||||||
p.grants_right?(user, :update) ||
|
p.grants_right?(user, :update) ||
|
||||||
# the account does not have mfa enabled
|
# the account does not have mfa enabled
|
||||||
p.account.mfa_settings == :disabled ||
|
p.account.mfa_settings == :disabled ||
|
||||||
# they are an admin user and have reset MFA permission
|
# they are an admin user and have reset MFA permission
|
||||||
p.account.grants_right?(user, :reset_any_mfa)
|
p.account.grants_right?(user, :reset_any_mfa)
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
can :reset_mfa
|
can :reset_mfa
|
||||||
|
|
||||||
|
@ -2909,7 +2909,7 @@ class User < ActiveRecord::Base
|
||||||
if pseudonym_hint
|
if pseudonym_hint
|
||||||
mfa_settings = pseudonym_hint.account.mfa_settings
|
mfa_settings = pseudonym_hint.account.mfa_settings
|
||||||
return :required if mfa_settings == :required ||
|
return :required if mfa_settings == :required ||
|
||||||
mfa_settings == :required_for_admins && !pseudonym_hint.account.cached_all_account_users_for(self).empty?
|
(mfa_settings == :required_for_admins && !pseudonym_hint.account.cached_all_account_users_for(self).empty?)
|
||||||
end
|
end
|
||||||
return :required if pseudonym_hint&.authentication_provider&.mfa_required?
|
return :required if pseudonym_hint&.authentication_provider&.mfa_required?
|
||||||
|
|
||||||
|
@ -2952,7 +2952,7 @@ class User < ActiveRecord::Base
|
||||||
# midnight sunday morning the rest of the time.
|
# midnight sunday morning the rest of the time.
|
||||||
account_bucket = (shard.id.to_i + pseudonym.try(:account_id).to_i) % DelayedMessage::WEEKLY_ACCOUNT_BUCKETS
|
account_bucket = (shard.id.to_i + pseudonym.try(:account_id).to_i) % DelayedMessage::WEEKLY_ACCOUNT_BUCKETS
|
||||||
user_bucket = self.id % DelayedMessage::MINUTES_PER_WEEKLY_ACCOUNT_BUCKET
|
user_bucket = self.id % DelayedMessage::MINUTES_PER_WEEKLY_ACCOUNT_BUCKET
|
||||||
account_bucket * DelayedMessage::MINUTES_PER_WEEKLY_ACCOUNT_BUCKET + user_bucket
|
(account_bucket * DelayedMessage::MINUTES_PER_WEEKLY_ACCOUNT_BUCKET) + user_bucket
|
||||||
end
|
end
|
||||||
|
|
||||||
def weekly_notification_time
|
def weekly_notification_time
|
||||||
|
|
|
@ -177,9 +177,9 @@ class WebConference < ActiveRecord::Base
|
||||||
# redirecting through here again in case the url has a short-lived token and needs to be
|
# redirecting through here again in case the url has a short-lived token and needs to be
|
||||||
# regenerated)
|
# regenerated)
|
||||||
def external_url_for(key, user, url_id = nil)
|
def external_url_for(key, user, url_id = nil)
|
||||||
external_urls[key.to_sym] &&
|
(external_urls[key.to_sym] &&
|
||||||
respond_to?("#{key}_external_url") &&
|
respond_to?("#{key}_external_url") &&
|
||||||
send("#{key}_external_url", user, url_id) || []
|
send("#{key}_external_url", user, url_id)) || []
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.external_urls
|
def self.external_urls
|
||||||
|
@ -355,7 +355,7 @@ class WebConference < ActiveRecord::Base
|
||||||
|
|
||||||
def restart
|
def restart
|
||||||
self.start_at ||= Time.now
|
self.start_at ||= Time.now
|
||||||
self.end_at = self.duration && self.start_at + self.duration_in_seconds
|
self.end_at = self.duration && (self.start_at + self.duration_in_seconds)
|
||||||
self.started_at ||= self.start_at
|
self.started_at ||= self.start_at
|
||||||
self.ended_at = nil
|
self.ended_at = nil
|
||||||
self.save
|
self.save
|
||||||
|
@ -374,7 +374,7 @@ class WebConference < ActiveRecord::Base
|
||||||
def active?(force_check = false, allow_check = true)
|
def active?(force_check = false, allow_check = true)
|
||||||
if !force_check
|
if !force_check
|
||||||
return false if self.ended_at && Time.now > self.ended_at
|
return false if self.ended_at && Time.now > self.ended_at
|
||||||
return true if self.start_at && (self.end_at.nil? || self.end_at && Time.now > self.start_at && Time.now < self.end_at)
|
return true if self.start_at && (self.end_at.nil? || (self.end_at && Time.now > self.start_at && Time.now < self.end_at))
|
||||||
return true if self.ended_at && Time.now < self.ended_at
|
return true if self.ended_at && Time.now < self.ended_at
|
||||||
return @conference_active unless @conference_active.nil?
|
return @conference_active unless @conference_active.nil?
|
||||||
end
|
end
|
||||||
|
@ -438,7 +438,7 @@ class WebConference < ActiveRecord::Base
|
||||||
|
|
||||||
def craft_url(user = nil, session = nil, return_to = "http://www.instructure.com")
|
def craft_url(user = nil, session = nil, return_to = "http://www.instructure.com")
|
||||||
user ||= self.user
|
user ||= self.user
|
||||||
initiate_conference and touch or return nil
|
(initiate_conference and touch) or return nil
|
||||||
if user == self.user || self.grants_right?(user, session, :initiate)
|
if user == self.user || self.grants_right?(user, session, :initiate)
|
||||||
admin_join_url(user, return_to)
|
admin_join_url(user, return_to)
|
||||||
else
|
else
|
||||||
|
|
|
@ -183,7 +183,7 @@ class WimbaConference < WebConference
|
||||||
end
|
end
|
||||||
|
|
||||||
def admin_settings_url(user, return_to = "http://www.instructure.com")
|
def admin_settings_url(user, return_to = "http://www.instructure.com")
|
||||||
initiate_conference and touch or return nil
|
(initiate_conference and touch) or return nil
|
||||||
add_user_to_conference(user, :admin) &&
|
add_user_to_conference(user, :admin) &&
|
||||||
settings_url(user)
|
settings_url(user)
|
||||||
end
|
end
|
||||||
|
|
|
@ -30,7 +30,7 @@ module Quizzes
|
||||||
|
|
||||||
def_delegators :object, :quiz
|
def_delegators :object, :quiz
|
||||||
|
|
||||||
attributes *%w[
|
attributes(*%w[
|
||||||
id
|
id
|
||||||
report_type
|
report_type
|
||||||
readable_type
|
readable_type
|
||||||
|
@ -42,7 +42,7 @@ module Quizzes
|
||||||
progress_url
|
progress_url
|
||||||
created_at
|
created_at
|
||||||
updated_at
|
updated_at
|
||||||
].map(&:to_sym)
|
].map(&:to_sym))
|
||||||
|
|
||||||
has_one :quiz, embed: :ids, root: :quiz
|
has_one :quiz, embed: :ids, root: :quiz
|
||||||
has_one :progress, {
|
has_one :progress, {
|
||||||
|
|
|
@ -31,50 +31,40 @@ module Quizzes
|
||||||
|
|
||||||
root :quiz_statistics
|
root :quiz_statistics
|
||||||
|
|
||||||
attributes *[
|
# the id is really only included in JSON-API and only because the spec
|
||||||
# the id is really only included in JSON-API and only because the spec
|
# requires it, this is because the output of this serializer is a mix of
|
||||||
# requires it, this is because the output of this serializer is a mix of
|
# two entities, an id doesn't make much sense, but we'll use the id of the
|
||||||
# two entities, an id doesn't make much sense, but we'll use the id of the
|
# StudentAnalysis when needed
|
||||||
# StudentAnalysis when needed
|
attributes :id,
|
||||||
:id,
|
:url,
|
||||||
:url,
|
:html_url,
|
||||||
:html_url,
|
# whether any of the participants has taken the quiz more than one time
|
||||||
|
:multiple_attempts_exist,
|
||||||
# whether any of the participants has taken the quiz more than one time
|
# the time of the generation of the analysis (the earliest one)
|
||||||
:multiple_attempts_exist,
|
:generated_at,
|
||||||
|
# whether the statistics were based on earlier and current quiz submissions
|
||||||
# the time of the generation of the analysis (the earliest one)
|
#
|
||||||
:generated_at,
|
# PS: this is always true for item analysis
|
||||||
|
:includes_all_versions,
|
||||||
# whether the statistics were based on earlier and current quiz submissions
|
# whether statistics report includes sis ids
|
||||||
#
|
# always false for item analysis
|
||||||
# PS: this is always true for item analysis
|
:includes_sis_ids,
|
||||||
:includes_all_versions,
|
:points_possible,
|
||||||
|
:anonymous_survey,
|
||||||
# whether statistics report includes sis ids
|
:speed_grader_url,
|
||||||
# always false for item analysis
|
:quiz_submissions_zip_url,
|
||||||
:includes_sis_ids,
|
# an aggregate of question stats from both student and item analysis
|
||||||
|
:question_statistics,
|
||||||
:points_possible,
|
# submission-related statistics (extracted from student analysis):
|
||||||
:anonymous_survey,
|
#
|
||||||
|
# - correct_count_average
|
||||||
:speed_grader_url,
|
# - incorrect_count_average
|
||||||
:quiz_submissions_zip_url,
|
# - duration_average
|
||||||
|
# - score_average
|
||||||
# an aggregate of question stats from both student and item analysis
|
# - score_high
|
||||||
:question_statistics,
|
# - score_low
|
||||||
|
# - score_stdev
|
||||||
# submission-related statistics (extracted from student analysis):
|
:submission_statistics
|
||||||
#
|
|
||||||
# - correct_count_average
|
|
||||||
# - incorrect_count_average
|
|
||||||
# - duration_average
|
|
||||||
# - score_average
|
|
||||||
# - score_high
|
|
||||||
# - score_low
|
|
||||||
# - score_stdev
|
|
||||||
:submission_statistics,
|
|
||||||
]
|
|
||||||
|
|
||||||
def_delegators :@controller,
|
def_delegators :@controller,
|
||||||
:course_quiz_statistics_url,
|
:course_quiz_statistics_url,
|
||||||
|
|
|
@ -254,7 +254,7 @@ module CanvasRails
|
||||||
Autoextend.hook(:"Thor::Option", PatchThorWarning, method: :prepend)
|
Autoextend.hook(:"Thor::Option", PatchThorWarning, method: :prepend)
|
||||||
|
|
||||||
# Extend any base classes, even gem classes
|
# Extend any base classes, even gem classes
|
||||||
Dir.glob("#{Rails.root}/lib/ext/**/*.rb").each { |file| require file }
|
Dir.glob("#{Rails.root}/lib/ext/**/*.rb").sort.each { |file| require file }
|
||||||
|
|
||||||
# tell Rails to use the native XML parser instead of REXML
|
# tell Rails to use the native XML parser instead of REXML
|
||||||
ActiveSupport::XmlMini.backend = 'Nokogiri'
|
ActiveSupport::XmlMini.backend = 'Nokogiri'
|
||||||
|
|
|
@ -1313,7 +1313,7 @@ ActiveRecord::Relation.class_eval do
|
||||||
|
|
||||||
while ids.first.present?
|
while ids.first.present?
|
||||||
ids.map!(&:to_i) if is_integer
|
ids.map!(&:to_i) if is_integer
|
||||||
ids << ids.first + batch_size if loose_mode
|
ids << (ids.first + batch_size) if loose_mode
|
||||||
|
|
||||||
yield(*ids)
|
yield(*ids)
|
||||||
last_value = ids.last
|
last_value = ids.last
|
||||||
|
@ -1747,7 +1747,7 @@ if CANVAS_RAILS6_0
|
||||||
scope.scoping { super }
|
scope.scoping { super }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
ActiveRecord::Base.send(:include, UnscopeCallbacks)
|
ActiveRecord::Base.include UnscopeCallbacks
|
||||||
end
|
end
|
||||||
|
|
||||||
module MatchWithDiscard
|
module MatchWithDiscard
|
||||||
|
|
|
@ -22,4 +22,4 @@ Rails.configuration.to_prepare do
|
||||||
BroadcastPolicy.notifier = lambda { Notifier.new }
|
BroadcastPolicy.notifier = lambda { Notifier.new }
|
||||||
BroadcastPolicy.notification_finder = lambda { NotificationFinder.new(Notification.all_cached) }
|
BroadcastPolicy.notification_finder = lambda { NotificationFinder.new(Notification.all_cached) }
|
||||||
end
|
end
|
||||||
ActiveRecord::Base.send(:extend, BroadcastPolicy::ClassMethods)
|
ActiveRecord::Base.extend BroadcastPolicy::ClassMethods
|
||||||
|
|
|
@ -19,5 +19,5 @@
|
||||||
|
|
||||||
require 'canvas_crummy'
|
require 'canvas_crummy'
|
||||||
|
|
||||||
ActionController::Base.send :include, CanvasCrummy::ControllerMethods
|
ActionController::Base.include CanvasCrummy::ControllerMethods
|
||||||
ActionView::Base.send :include, CanvasCrummy::ViewMethods
|
ActionView::Base.include CanvasCrummy::ViewMethods
|
||||||
|
|
|
@ -19,4 +19,4 @@
|
||||||
|
|
||||||
require 'canvas_sanitize'
|
require 'canvas_sanitize'
|
||||||
|
|
||||||
ActiveRecord::Base.send :include, CanvasSanitize
|
ActiveRecord::Base.include CanvasSanitize
|
||||||
|
|
|
@ -227,4 +227,4 @@ module CanvasDelayedMessageSending
|
||||||
delay(sender: sender, **kwargs.merge(synchronous: !Rails.env.production?))
|
delay(sender: sender, **kwargs.merge(synchronous: !Rails.env.production?))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
Object.send(:include, CanvasDelayedMessageSending)
|
Object.include CanvasDelayedMessageSending
|
||||||
|
|
|
@ -142,7 +142,7 @@ end
|
||||||
|
|
||||||
if ENV['LOLCALIZE']
|
if ENV['LOLCALIZE']
|
||||||
require 'i18n_tasks'
|
require 'i18n_tasks'
|
||||||
I18n.send :extend, I18nTasks::Lolcalize
|
I18n.extend I18nTasks::Lolcalize
|
||||||
end
|
end
|
||||||
|
|
||||||
module I18nUtilities
|
module I18nUtilities
|
||||||
|
@ -173,9 +173,9 @@ module I18nUtilities
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
ActionView::Base.send(:include, I18nUtilities)
|
ActionView::Base.include I18nUtilities
|
||||||
ActionView::Helpers::FormHelper.send(:include, I18nUtilities)
|
ActionView::Helpers::FormHelper.include I18nUtilities
|
||||||
ActionView::Helpers::FormTagHelper.send(:include, I18nUtilities)
|
ActionView::Helpers::FormTagHelper.include I18nUtilities
|
||||||
|
|
||||||
module I18nFormHelper
|
module I18nFormHelper
|
||||||
# a convenience method to put the ":" after the label text (or do whatever
|
# a convenience method to put the ":" after the label text (or do whatever
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
# Be sure to restart your server when you modify this file.
|
# Be sure to restart your server when you modify this file.
|
||||||
|
|
||||||
ActiveSupport::Inflector.inflections do |inflect|
|
ActiveSupport::Inflector.inflections do |inflect|
|
||||||
inflect.singular /(criteri)a$/i, '\1on'
|
inflect.singular(/(criteri)a$/i, '\1on')
|
||||||
inflect.plural /(criteri)on$/i, '\1a'
|
inflect.plural(/(criteri)on$/i, '\1a')
|
||||||
inflect.acronym "GraphQL"
|
inflect.acronym "GraphQL"
|
||||||
end
|
end
|
||||||
|
|
|
@ -39,8 +39,8 @@ if Rails.env.test?
|
||||||
def raise(*args)
|
def raise(*args)
|
||||||
if defined?(SpecTimeLimit) && args.first == SpecTimeLimit::Error
|
if defined?(SpecTimeLimit) && args.first == SpecTimeLimit::Error
|
||||||
have_ever_run_a_debugger = (
|
have_ever_run_a_debugger = (
|
||||||
defined?(Byebug) && Byebug.respond_to?(:started?) ||
|
(defined?(Byebug) && Byebug.respond_to?(:started?)) ||
|
||||||
defined?(Pry) && Pry::InputLock.input_locks.any?
|
(defined?(Pry) && Pry::InputLock.input_locks.any?)
|
||||||
)
|
)
|
||||||
if have_ever_run_a_debugger
|
if have_ever_run_a_debugger
|
||||||
Rails.logger.warn "Ignoring timeout because we're debugging"
|
Rails.logger.warn "Ignoring timeout because we're debugging"
|
||||||
|
|
|
@ -23,7 +23,7 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'api_scopes'))
|
||||||
require 'controller_list_view'
|
require 'controller_list_view'
|
||||||
require 'api_scope_mapping_writer'
|
require 'api_scope_mapping_writer'
|
||||||
|
|
||||||
Dir.glob("#{Rails.root}/doc/api/data_services/*.rb").each { |file| require file }
|
Dir.glob("#{Rails.root}/doc/api/data_services/*.rb").sort.each { |file| require file }
|
||||||
|
|
||||||
include Helpers::ModuleHelper
|
include Helpers::ModuleHelper
|
||||||
include Helpers::FilterHelper
|
include Helpers::FilterHelper
|
||||||
|
@ -49,7 +49,7 @@ module YARD::Templates::Helpers::BaseHelper
|
||||||
html_file = "#{topicize topic.first}.html"
|
html_file = "#{topicize topic.first}.html"
|
||||||
action = $2
|
action = $2
|
||||||
name = controller.name.to_s
|
name = controller.name.to_s
|
||||||
name = "#{controller.namespace.name.to_s}/#{name}" if controller.namespace.name != :root
|
name = "#{controller.namespace.name}/#{name}" if controller.namespace.name != :root
|
||||||
link_url("#{html_file}#method.#{topicize(name).sub("_controller", "")}.#{action}", args[1])
|
link_url("#{html_file}#method.#{topicize(name).sub("_controller", "")}.#{action}", args[1])
|
||||||
else
|
else
|
||||||
raise "couldn't find API link for #{args.first}"
|
raise "couldn't find API link for #{args.first}"
|
||||||
|
|
|
@ -100,12 +100,12 @@ def render_properties(json)
|
||||||
if json['description'].present?
|
if json['description'].present?
|
||||||
result << render_comment(json)
|
result << render_comment(json)
|
||||||
end
|
end
|
||||||
result << "{\n" + indent(
|
result << ("{\n" + indent(
|
||||||
properties.map do |name, prop|
|
properties.map do |name, prop|
|
||||||
render_comment(prop) +
|
render_comment(prop) +
|
||||||
%{"#{name}": } + render_value(prop)
|
%{"#{name}": } + render_value(prop)
|
||||||
end.join(",\n")
|
end.join(",\n")
|
||||||
) + "\n}"
|
) + "\n}")
|
||||||
end
|
end
|
||||||
rescue
|
rescue
|
||||||
puts "error rendering properties for model:\n#{json}"
|
puts "error rendering properties for model:\n#{json}"
|
||||||
|
|
|
@ -29,8 +29,8 @@ RSpec.describe Audits do
|
||||||
|
|
||||||
def inject_auditors_settings(yaml_string)
|
def inject_auditors_settings(yaml_string)
|
||||||
DynamicSettings.fallback_data = {
|
DynamicSettings.fallback_data = {
|
||||||
"private": {
|
private: {
|
||||||
"canvas": {
|
canvas: {
|
||||||
"auditors.yml": yaml_string
|
"auditors.yml": yaml_string
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,8 +82,8 @@ module ActiveSupport::Callbacks
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
def suspended_callback?(callback, kind, type = nil)
|
def suspended_callback?(callback, kind, type = nil)
|
||||||
val = suspended_callbacks_defined? &&
|
val = (suspended_callbacks_defined? &&
|
||||||
suspended_callbacks.include?(callback, kind, type) ||
|
suspended_callbacks.include?(callback, kind, type)) ||
|
||||||
suspended_callback_ancestor&.suspended_callback?(callback, kind, type)
|
suspended_callback_ancestor&.suspended_callback?(callback, kind, type)
|
||||||
|
|
||||||
val
|
val
|
||||||
|
|
|
@ -251,7 +251,7 @@ module AttachmentFu # :nodoc:
|
||||||
return filename if thumbnail.blank?
|
return filename if thumbnail.blank?
|
||||||
|
|
||||||
ext = nil
|
ext = nil
|
||||||
basename = filename.gsub /\.\w+$/ do |s|
|
basename = filename.gsub(/\.\w+$/) do |s|
|
||||||
ext = s; ''
|
ext = s; ''
|
||||||
end
|
end
|
||||||
# ImageScience doesn't create gif thumbnails, only pngs
|
# ImageScience doesn't create gif thumbnails, only pngs
|
||||||
|
@ -495,17 +495,17 @@ module AttachmentFu # :nodoc:
|
||||||
|
|
||||||
# Generates a unique filename for a Tempfile.
|
# Generates a unique filename for a Tempfile.
|
||||||
def random_tempfile_filename
|
def random_tempfile_filename
|
||||||
"#{rand Time.now.to_i}#{filename && filename.last(50) || 'attachment'}"
|
"#{rand Time.now.to_i}#{(filename && filename.last(50)) || 'attachment'}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def sanitize_filename(filename)
|
def sanitize_filename(filename)
|
||||||
filename.strip.tap do |name|
|
filename.strip.tap do |name|
|
||||||
# NOTE: File.basename doesn't work right with Windows paths on Unix
|
# NOTE: File.basename doesn't work right with Windows paths on Unix
|
||||||
# get only the filename, not the whole path
|
# get only the filename, not the whole path
|
||||||
name.gsub! /^.*(\\|\/)/, ''
|
name.gsub!(/^.*(\\|\/)/, '')
|
||||||
|
|
||||||
# Finally, replace all non alphanumeric, underscore or periods with underscore
|
# Finally, replace all non alphanumeric, underscore or periods with underscore
|
||||||
name.gsub! /[^\w\.\-]/, '_'
|
name.gsub!(/[^\w\.\-]/, '_')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
module AttachmentFu
|
module AttachmentFu
|
||||||
class Railtie < ::Rails::Railtie
|
class Railtie < ::Rails::Railtie
|
||||||
initializer "attachment_fu.canvas_plugin" do
|
initializer "attachment_fu.canvas_plugin" do
|
||||||
ActiveRecord::Base.send(:extend, AttachmentFu::ActMethods)
|
ActiveRecord::Base.extend AttachmentFu::ActMethods
|
||||||
AttachmentFu::Railtie.setup_tempfile_path
|
AttachmentFu::Railtie.setup_tempfile_path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ class BookmarkedCollection::MergeProxy < BookmarkedCollection::CompositeProxy
|
||||||
indexed_bookmarks.sort!
|
indexed_bookmarks.sort!
|
||||||
|
|
||||||
last_item, last_leaf_bookmark = nil, nil
|
last_item, last_leaf_bookmark = nil, nil
|
||||||
while indexed_bookmarks.present? && (pager.size < pager.per_page || @merge_proc && indexed_bookmarks.first.first == last_leaf_bookmark)
|
while indexed_bookmarks.present? && (pager.size < pager.per_page || (@merge_proc && indexed_bookmarks.first.first == last_leaf_bookmark))
|
||||||
# pull the index of the collection with the next lowest bookmark and
|
# pull the index of the collection with the next lowest bookmark and
|
||||||
# pull off its first item
|
# pull off its first item
|
||||||
leaf_bookmark, index = indexed_bookmarks.shift
|
leaf_bookmark, index = indexed_bookmarks.shift
|
||||||
|
|
|
@ -117,7 +117,7 @@ module BookmarkedCollection
|
||||||
TYPE_MAP = {
|
TYPE_MAP = {
|
||||||
string: ->(val) { val.is_a?(String) },
|
string: ->(val) { val.is_a?(String) },
|
||||||
integer: ->(val) { val.is_a?(Integer) },
|
integer: ->(val) { val.is_a?(Integer) },
|
||||||
datetime: ->(val) { val.is_a?(DateTime) || val.is_a?(Time) || val.is_a?(String) && !!(DateTime.parse(val) rescue false) }
|
datetime: ->(val) { val.is_a?(DateTime) || val.is_a?(Time) || (val.is_a?(String) && !!(DateTime.parse(val) rescue false)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
def existing_column_definition(col_name)
|
def existing_column_definition(col_name)
|
||||||
|
@ -137,7 +137,7 @@ module BookmarkedCollection
|
||||||
columns.each.with_index.all? do |col, i|
|
columns.each.with_index.all? do |col, i|
|
||||||
type = TYPE_MAP[column_definitions[col][:type]]
|
type = TYPE_MAP[column_definitions[col][:type]]
|
||||||
nullable = column_definitions[col][:null]
|
nullable = column_definitions[col][:null]
|
||||||
type && (nullable && bookmark[i].nil? || type.(bookmark[i]))
|
type && ((nullable && bookmark[i].nil?) || type.(bookmark[i]))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ module BroadcastPolicy
|
||||||
# reasons.
|
# reasons.
|
||||||
def broadcast(record)
|
def broadcast(record)
|
||||||
return if record.respond_to?(:skip_broadcasts) && record.skip_broadcasts
|
return if record.respond_to?(:skip_broadcasts) && record.skip_broadcasts
|
||||||
return unless record.instance_eval &self.whenever
|
return unless record.instance_eval(&self.whenever)
|
||||||
|
|
||||||
notification = BroadcastPolicy.notification_finder.by_name(self.dispatch)
|
notification = BroadcastPolicy.notification_finder.by_name(self.dispatch)
|
||||||
return if notification.nil?
|
return if notification.nil?
|
||||||
|
|
|
@ -33,7 +33,7 @@ module CanvasCache
|
||||||
raise "Redis is not enabled for this install" unless CanvasCache::Redis.enabled?
|
raise "Redis is not enabled for this install" unless CanvasCache::Redis.enabled?
|
||||||
|
|
||||||
conf = CanvasCache::Redis.config
|
conf = CanvasCache::Redis.config
|
||||||
if conf == 'cache_store' || conf.is_a?(Hash) && conf['servers'] == 'cache_store'
|
if conf == 'cache_store' || (conf.is_a?(Hash) && conf['servers'] == 'cache_store')
|
||||||
return Rails.cache.redis
|
return Rails.cache.redis
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -49,154 +49,154 @@ module CanvasColor
|
||||||
BRIGHTNESS_DEFAULT = 0.2
|
BRIGHTNESS_DEFAULT = 0.2
|
||||||
|
|
||||||
NAMED_COLORS = {
|
NAMED_COLORS = {
|
||||||
"aliceblue": "#f0f8ff",
|
aliceblue: "#f0f8ff",
|
||||||
"antiquewhite": "#faebd7",
|
antiquewhite: "#faebd7",
|
||||||
"aqua": "#00ffff",
|
aqua: "#00ffff",
|
||||||
"aquamarine": "#7fffd4",
|
aquamarine: "#7fffd4",
|
||||||
"azure": "#f0ffff",
|
azure: "#f0ffff",
|
||||||
"beige": "#f5f5dc",
|
beige: "#f5f5dc",
|
||||||
"bisque": "#ffe4c4",
|
bisque: "#ffe4c4",
|
||||||
"black": "#000000",
|
black: "#000000",
|
||||||
"blanchedalmond": "#ffebcd",
|
blanchedalmond: "#ffebcd",
|
||||||
"blue": "#0000ff",
|
blue: "#0000ff",
|
||||||
"blueviolet": "#8a2be2",
|
blueviolet: "#8a2be2",
|
||||||
"brown": "#a52a2a",
|
brown: "#a52a2a",
|
||||||
"burlywood": "#deb887",
|
burlywood: "#deb887",
|
||||||
"cadetblue": "#5f9ea0",
|
cadetblue: "#5f9ea0",
|
||||||
"chartreuse": "#7fff00",
|
chartreuse: "#7fff00",
|
||||||
"chocolate": "#d2691e",
|
chocolate: "#d2691e",
|
||||||
"coral": "#ff7f50",
|
coral: "#ff7f50",
|
||||||
"cornflowerblue": "#6495ed",
|
cornflowerblue: "#6495ed",
|
||||||
"cornsilk": "#fff8dc",
|
cornsilk: "#fff8dc",
|
||||||
"crimson": "#dc143c",
|
crimson: "#dc143c",
|
||||||
"cyan": "#00ffff",
|
cyan: "#00ffff",
|
||||||
"darkblue": "#00008b",
|
darkblue: "#00008b",
|
||||||
"darkcyan": "#008b8b",
|
darkcyan: "#008b8b",
|
||||||
"darkgoldenrod": "#b8860b",
|
darkgoldenrod: "#b8860b",
|
||||||
"darkgray": "#a9a9a9",
|
darkgray: "#a9a9a9",
|
||||||
"darkgreen": "#006400",
|
darkgreen: "#006400",
|
||||||
"darkgrey": "#a9a9a9",
|
darkgrey: "#a9a9a9",
|
||||||
"darkkhaki": "#bdb76b",
|
darkkhaki: "#bdb76b",
|
||||||
"darkmagenta": "#8b008b",
|
darkmagenta: "#8b008b",
|
||||||
"darkolivegreen": "#556b2f",
|
darkolivegreen: "#556b2f",
|
||||||
"darkorange": "#ff8c00",
|
darkorange: "#ff8c00",
|
||||||
"darkorchid": "#9932cc",
|
darkorchid: "#9932cc",
|
||||||
"darkred": "#8b0000",
|
darkred: "#8b0000",
|
||||||
"darksalmon": "#e9967a",
|
darksalmon: "#e9967a",
|
||||||
"darkseagreen": "#8fbc8f",
|
darkseagreen: "#8fbc8f",
|
||||||
"darkslateblue": "#483d8b",
|
darkslateblue: "#483d8b",
|
||||||
"darkslategray": "#2f4f4f",
|
darkslategray: "#2f4f4f",
|
||||||
"darkslategrey": "#2f4f4f",
|
darkslategrey: "#2f4f4f",
|
||||||
"darkturquoise": "#00ced1",
|
darkturquoise: "#00ced1",
|
||||||
"darkviolet": "#9400d3",
|
darkviolet: "#9400d3",
|
||||||
"deeppink": "#ff1493",
|
deeppink: "#ff1493",
|
||||||
"deepskyblue": "#00bfff",
|
deepskyblue: "#00bfff",
|
||||||
"dimgray": "#696969",
|
dimgray: "#696969",
|
||||||
"dimgrey": "#696969",
|
dimgrey: "#696969",
|
||||||
"dodgerblue": "#1e90ff",
|
dodgerblue: "#1e90ff",
|
||||||
"firebrick": "#b22222",
|
firebrick: "#b22222",
|
||||||
"floralwhite": "#fffaf0",
|
floralwhite: "#fffaf0",
|
||||||
"forestgreen": "#228b22",
|
forestgreen: "#228b22",
|
||||||
"fuchsia": "#ff00ff",
|
fuchsia: "#ff00ff",
|
||||||
"gainsboro": "#dcdcdc",
|
gainsboro: "#dcdcdc",
|
||||||
"ghostwhite": "#f8f8ff",
|
ghostwhite: "#f8f8ff",
|
||||||
"gold": "#ffd700",
|
gold: "#ffd700",
|
||||||
"goldenrod": "#daa520",
|
goldenrod: "#daa520",
|
||||||
"gray": "#808080",
|
gray: "#808080",
|
||||||
"green": "#008000",
|
green: "#008000",
|
||||||
"greenyellow": "#adff2f",
|
greenyellow: "#adff2f",
|
||||||
"grey": "#808080",
|
grey: "#808080",
|
||||||
"honeydew": "#f0fff0",
|
honeydew: "#f0fff0",
|
||||||
"hotpink": "#ff69b4",
|
hotpink: "#ff69b4",
|
||||||
"indianred": "#cd5c5c",
|
indianred: "#cd5c5c",
|
||||||
"indigo": "#4b0082",
|
indigo: "#4b0082",
|
||||||
"ivory": "#fffff0",
|
ivory: "#fffff0",
|
||||||
"khaki": "#f0e68c",
|
khaki: "#f0e68c",
|
||||||
"lavender": "#e6e6fa",
|
lavender: "#e6e6fa",
|
||||||
"lavenderblush": "#fff0f5",
|
lavenderblush: "#fff0f5",
|
||||||
"lawngreen": "#7cfc00",
|
lawngreen: "#7cfc00",
|
||||||
"lemonchiffon": "#fffacd",
|
lemonchiffon: "#fffacd",
|
||||||
"lightblue": "#add8e6",
|
lightblue: "#add8e6",
|
||||||
"lightcoral": "#f08080",
|
lightcoral: "#f08080",
|
||||||
"lightcyan": "#e0ffff",
|
lightcyan: "#e0ffff",
|
||||||
"lightgoldenrodyellow": "#fafad2",
|
lightgoldenrodyellow: "#fafad2",
|
||||||
"lightgray": "#d3d3d3",
|
lightgray: "#d3d3d3",
|
||||||
"lightgreen": "#90ee90",
|
lightgreen: "#90ee90",
|
||||||
"lightgrey": "#d3d3d3",
|
lightgrey: "#d3d3d3",
|
||||||
"lightpink": "#ffb6c1",
|
lightpink: "#ffb6c1",
|
||||||
"lightsalmon": "#ffa07a",
|
lightsalmon: "#ffa07a",
|
||||||
"lightseagreen": "#20b2aa",
|
lightseagreen: "#20b2aa",
|
||||||
"lightskyblue": "#87cefa",
|
lightskyblue: "#87cefa",
|
||||||
"lightslategray": "#778899",
|
lightslategray: "#778899",
|
||||||
"lightslategrey": "#778899",
|
lightslategrey: "#778899",
|
||||||
"lightsteelblue": "#b0c4de",
|
lightsteelblue: "#b0c4de",
|
||||||
"lightyellow": "#ffffe0",
|
lightyellow: "#ffffe0",
|
||||||
"lime": "#00ff00",
|
lime: "#00ff00",
|
||||||
"limegreen": "#32cd32",
|
limegreen: "#32cd32",
|
||||||
"linen": "#faf0e6",
|
linen: "#faf0e6",
|
||||||
"magenta": "#ff00ff",
|
magenta: "#ff00ff",
|
||||||
"maroon": "#800000",
|
maroon: "#800000",
|
||||||
"mediumaquamarine": "#66cdaa",
|
mediumaquamarine: "#66cdaa",
|
||||||
"mediumblue": "#0000cd",
|
mediumblue: "#0000cd",
|
||||||
"mediumorchid": "#ba55d3",
|
mediumorchid: "#ba55d3",
|
||||||
"mediumpurple": "#9370db",
|
mediumpurple: "#9370db",
|
||||||
"mediumseagreen": "#3cb371",
|
mediumseagreen: "#3cb371",
|
||||||
"mediumslateblue": "#7b68ee",
|
mediumslateblue: "#7b68ee",
|
||||||
"mediumspringgreen": "#00fa9a",
|
mediumspringgreen: "#00fa9a",
|
||||||
"mediumturquoise": "#48d1cc",
|
mediumturquoise: "#48d1cc",
|
||||||
"mediumvioletred": "#c71585",
|
mediumvioletred: "#c71585",
|
||||||
"midnightblue": "#191970",
|
midnightblue: "#191970",
|
||||||
"mintcream": "#f5fffa",
|
mintcream: "#f5fffa",
|
||||||
"mistyrose": "#ffe4e1",
|
mistyrose: "#ffe4e1",
|
||||||
"moccasin": "#ffe4b5",
|
moccasin: "#ffe4b5",
|
||||||
"navajowhite": "#ffdead",
|
navajowhite: "#ffdead",
|
||||||
"navy": "#000080",
|
navy: "#000080",
|
||||||
"oldlace": "#fdf5e6",
|
oldlace: "#fdf5e6",
|
||||||
"olive": "#808000",
|
olive: "#808000",
|
||||||
"olivedrab": "#6b8e23",
|
olivedrab: "#6b8e23",
|
||||||
"orange": "#ffa500",
|
orange: "#ffa500",
|
||||||
"orangered": "#ff4500",
|
orangered: "#ff4500",
|
||||||
"orchid": "#da70d6",
|
orchid: "#da70d6",
|
||||||
"palegoldenrod": "#eee8aa",
|
palegoldenrod: "#eee8aa",
|
||||||
"palegreen": "#98fb98",
|
palegreen: "#98fb98",
|
||||||
"paleturquoise": "#afeeee",
|
paleturquoise: "#afeeee",
|
||||||
"palevioletred": "#db7093",
|
palevioletred: "#db7093",
|
||||||
"papayawhip": "#ffefd5",
|
papayawhip: "#ffefd5",
|
||||||
"peachpuff": "#ffdab9",
|
peachpuff: "#ffdab9",
|
||||||
"peru": "#cd853f",
|
peru: "#cd853f",
|
||||||
"pink": "#ffc0cb",
|
pink: "#ffc0cb",
|
||||||
"plum": "#dda0dd",
|
plum: "#dda0dd",
|
||||||
"powderblue": "#b0e0e6",
|
powderblue: "#b0e0e6",
|
||||||
"purple": "#800080",
|
purple: "#800080",
|
||||||
"rebeccapurple": "#663399",
|
rebeccapurple: "#663399",
|
||||||
"red": "#ff0000",
|
red: "#ff0000",
|
||||||
"rosybrown": "#bc8f8f",
|
rosybrown: "#bc8f8f",
|
||||||
"royalblue": "#4169e1",
|
royalblue: "#4169e1",
|
||||||
"saddlebrown": "#8b4513",
|
saddlebrown: "#8b4513",
|
||||||
"salmon": "#fa8072",
|
salmon: "#fa8072",
|
||||||
"sandybrown": "#f4a460",
|
sandybrown: "#f4a460",
|
||||||
"seagreen": "#2e8b57",
|
seagreen: "#2e8b57",
|
||||||
"seashell": "#fff5ee",
|
seashell: "#fff5ee",
|
||||||
"sienna": "#a0522d",
|
sienna: "#a0522d",
|
||||||
"silver": "#c0c0c0",
|
silver: "#c0c0c0",
|
||||||
"skyblue": "#87ceeb",
|
skyblue: "#87ceeb",
|
||||||
"slateblue": "#6a5acd",
|
slateblue: "#6a5acd",
|
||||||
"slategray": "#708090",
|
slategray: "#708090",
|
||||||
"slategrey": "#708090",
|
slategrey: "#708090",
|
||||||
"snow": "#fffafa",
|
snow: "#fffafa",
|
||||||
"springgreen": "#00ff7f",
|
springgreen: "#00ff7f",
|
||||||
"steelblue": "#4682b4",
|
steelblue: "#4682b4",
|
||||||
"tan": "#d2b48c",
|
tan: "#d2b48c",
|
||||||
"teal": "#008080",
|
teal: "#008080",
|
||||||
"thistle": "#d8bfd8",
|
thistle: "#d8bfd8",
|
||||||
"tomato": "#ff6347",
|
tomato: "#ff6347",
|
||||||
"turquoise": "#40e0d0",
|
turquoise: "#40e0d0",
|
||||||
"violet": "#ee82ee",
|
violet: "#ee82ee",
|
||||||
"wheat": "#f5deb3",
|
wheat: "#f5deb3",
|
||||||
"white": "#ffffff",
|
white: "#ffffff",
|
||||||
"whitesmoke": "#f5f5f5",
|
whitesmoke: "#f5f5f5",
|
||||||
"yellow": "#ffff00",
|
yellow: "#ffff00",
|
||||||
"yellowgreen": "#9acd32"
|
yellowgreen: "#9acd32"
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
# Constructor. Inits to white (#FFFFFF) by default, or accepts any params
|
# Constructor. Inits to white (#FFFFFF) by default, or accepts any params
|
||||||
|
@ -355,7 +355,7 @@ module CanvasColor
|
||||||
# Convert to grayscale, using perception-based weighting
|
# Convert to grayscale, using perception-based weighting
|
||||||
def grayscale
|
def grayscale
|
||||||
val = Color.new(self)
|
val = Color.new(self)
|
||||||
val.r = val.g = val.b = (0.2126 * val.r + 0.7152 * val.g + 0.0722 * val.b)
|
val.r = val.g = val.b = ((0.2126 * val.r) + (0.7152 * val.g) + (0.0722 * val.b))
|
||||||
val
|
val
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ module CanvasDynamoDB
|
||||||
tables[pair[0]] ||= []
|
tables[pair[0]] ||= []
|
||||||
tables[pair[0]] << pair[1]
|
tables[pair[0]] << pair[1]
|
||||||
end
|
end
|
||||||
sleep 2**@backoff_exp / 1000 if @backoff_exp > 0
|
sleep (2**@backoff_exp) / 1000 if @backoff_exp > 0
|
||||||
resp = @database.send(operation, { request_items: request_items(tables) })
|
resp = @database.send(operation, { request_items: request_items(tables) })
|
||||||
responses << resp
|
responses << resp
|
||||||
until resp.send(unprocessed_attr).empty?
|
until resp.send(unprocessed_attr).empty?
|
||||||
|
|
|
@ -21,5 +21,5 @@ require 'active_support/all'
|
||||||
|
|
||||||
module CanvasExt
|
module CanvasExt
|
||||||
project_root = File.dirname(File.absolute_path(__FILE__))
|
project_root = File.dirname(File.absolute_path(__FILE__))
|
||||||
Dir.glob(project_root + '/canvas_ext/*') { |file| require file }
|
Dir.glob(project_root + '/canvas_ext/*').sort.each { |file| require file }
|
||||||
end
|
end
|
||||||
|
|
|
@ -149,7 +149,7 @@ module CanvasKaltura
|
||||||
sources = sources.sort_by do |a|
|
sources = sources.sort_by do |a|
|
||||||
[a[:hasWarnings] || a[:isOriginal] != '0' ? CanvasSort::Last : CanvasSort::First,
|
[a[:hasWarnings] || a[:isOriginal] != '0' ? CanvasSort::Last : CanvasSort::First,
|
||||||
a[:isOriginal] == '0' ? CanvasSort::First : CanvasSort::Last,
|
a[:isOriginal] == '0' ? CanvasSort::First : CanvasSort::Last,
|
||||||
PREFERENCE.index(a[:fileExt]) || PREFERENCE.size + 1,
|
PREFERENCE.index(a[:fileExt]) || (PREFERENCE.size + 1),
|
||||||
a[:bitrate].to_i < suspicious_bitrate_threshold ? CanvasSort::First : CanvasSort::Last,
|
a[:bitrate].to_i < suspicious_bitrate_threshold ? CanvasSort::First : CanvasSort::Last,
|
||||||
0 - a[:bitrate].to_i]
|
0 - a[:bitrate].to_i]
|
||||||
end
|
end
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
require 'thread'
|
|
||||||
require 'set'
|
require 'set'
|
||||||
|
|
||||||
module CanvasPandaPub
|
module CanvasPandaPub
|
||||||
|
|
|
@ -24,7 +24,7 @@ module CanvasPartman
|
||||||
max_id = base_class.maximum(base_class.partitioning_field)
|
max_id = base_class.maximum(base_class.partitioning_field)
|
||||||
return ensure_partitions(advance_partitions) if max_id.nil?
|
return ensure_partitions(advance_partitions) if max_id.nil?
|
||||||
|
|
||||||
(0..max_id / base_class.partition_size + advance_partitions).each do |index|
|
(0..(max_id / base_class.partition_size) + advance_partitions).each do |index|
|
||||||
create_partition(index * base_class.partition_size, graceful: true)
|
create_partition(index * base_class.partition_size, graceful: true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -198,7 +198,7 @@ describe CanvasPartman::Concerns::Partitioned do
|
||||||
|
|
||||||
expect(count_records("partman_trails")).to eq 1
|
expect(count_records("partman_trails")).to eq 1
|
||||||
expect(count_records("partman_trails_#{zoo.id / 5}")).to eq 1
|
expect(count_records("partman_trails_#{zoo.id / 5}")).to eq 1
|
||||||
expect(count_records("partman_trails_#{zoo.id / 5 + 1}")).to eq 0
|
expect(count_records("partman_trails_#{(zoo.id / 5) + 1}")).to eq 0
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'via an association scope' do
|
context 'via an association scope' do
|
||||||
|
@ -210,7 +210,7 @@ describe CanvasPartman::Concerns::Partitioned do
|
||||||
|
|
||||||
expect(count_records("partman_trails")).to eq 1
|
expect(count_records("partman_trails")).to eq 1
|
||||||
expect(count_records("partman_trails_#{zoo.id / 5}")).to eq 1
|
expect(count_records("partman_trails_#{zoo.id / 5}")).to eq 1
|
||||||
expect(count_records("partman_trails_#{zoo.id / 5 + 1}")).to eq 0
|
expect(count_records("partman_trails_#{(zoo.id / 5) + 1}")).to eq 0
|
||||||
|
|
||||||
expect(zoo.trails.count).to eq 1
|
expect(zoo.trails.count).to eq 1
|
||||||
expect(south.zoo).to eq zoo
|
expect(south.zoo).to eq zoo
|
||||||
|
|
|
@ -40,10 +40,10 @@ File.join(File.dirname(__FILE__), 'canvas_quiz_statistics').tap do |cwd|
|
||||||
# spec support in support/
|
# spec support in support/
|
||||||
Dir.glob(File.join([
|
Dir.glob(File.join([
|
||||||
cwd, 'support', '**', '*.rb'
|
cwd, 'support', '**', '*.rb'
|
||||||
])).each { |file| require file }
|
])).sort.each { |file| require file }
|
||||||
|
|
||||||
# specs for shared metrics in analyzers/shared_metrics
|
# specs for shared metrics in analyzers/shared_metrics
|
||||||
Dir.glob(File.join([
|
Dir.glob(File.join([
|
||||||
cwd, 'analyzers', 'shared_metrics', '**', '*.rb'
|
cwd, 'analyzers', 'shared_metrics', '**', '*.rb'
|
||||||
])).each { |file| require file }
|
])).sort.each { |file| require file }
|
||||||
end
|
end
|
||||||
|
|
|
@ -39,7 +39,7 @@ describe CanvasSlug do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "prepends a provided purpose" do
|
it "prepends a provided purpose" do
|
||||||
expect(subject.generate("foobar")).to match /\Afoobar-\w{4}\z/
|
expect(subject.generate("foobar")).to match(/\Afoobar-\w{4}\z/)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -22,12 +22,12 @@ module CanvasStringex
|
||||||
require "lucky_sneaks/unidecoder"
|
require "lucky_sneaks/unidecoder"
|
||||||
require "lucky_sneaks/acts_as_url"
|
require "lucky_sneaks/acts_as_url"
|
||||||
|
|
||||||
String.send :include, LuckySneaks::StringExtensions
|
String.include LuckySneaks::StringExtensions
|
||||||
|
|
||||||
if defined?(ActiveRecord)
|
if defined?(ActiveRecord)
|
||||||
# Prevents uninitialized constant ActiveRecord::DatabaseConfigurations::ConnectionUrlResolver::URI
|
# Prevents uninitialized constant ActiveRecord::DatabaseConfigurations::ConnectionUrlResolver::URI
|
||||||
# (probably only relevant for specs in practice)
|
# (probably only relevant for specs in practice)
|
||||||
require 'uri'
|
require 'uri'
|
||||||
ActiveRecord::Base.send :include, LuckySneaks::ActsAsUrl
|
ActiveRecord::Base.include LuckySneaks::ActsAsUrl
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -71,7 +71,7 @@ module DrDiff
|
||||||
path = path[git_dir.length..-1] if git_dir
|
path = path[git_dir.length..-1] if git_dir
|
||||||
severe = severe?(comment[:severity], severe_levels)
|
severe = severe?(comment[:severity], severe_levels)
|
||||||
next unless heavy ||
|
next unless heavy ||
|
||||||
severe && severe_anywhere ||
|
(severe && severe_anywhere) ||
|
||||||
diff.relevant?(path, comment[:position], severe: severe) ||
|
diff.relevant?(path, comment[:position], severe: severe) ||
|
||||||
comment[:corrected]
|
comment[:corrected]
|
||||||
|
|
||||||
|
|
|
@ -277,7 +277,7 @@ module GoogleDrive
|
||||||
end
|
end
|
||||||
|
|
||||||
def file_extension_from_header(headers, entry)
|
def file_extension_from_header(headers, entry)
|
||||||
file_extension = entry.extension && !entry.extension.empty? && entry.extension || 'unknown'
|
file_extension = (entry.extension && !entry.extension.empty? && entry.extension) || 'unknown'
|
||||||
|
|
||||||
if headers['content-disposition'] &&
|
if headers['content-disposition'] &&
|
||||||
headers['content-disposition'].match(/filename=[\"\']?[^;\"\'\.]+\.(?<file_extension>[^;\"\']+)[\"\']?/)
|
headers['content-disposition'].match(/filename=[\"\']?[^;\"\'\.]+\.(?<file_extension>[^;\"\']+)[\"\']?/)
|
||||||
|
|
|
@ -81,7 +81,7 @@ describe I18nliner::Extractors::RubyExtractor do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "requires explicit keys if a key is provided and there is no scope" do
|
it "requires explicit keys if a key is provided and there is no scope" do
|
||||||
expect { extract("t 'foo', 'Foo'", I18nliner::Scope.root) }.to raise_error /ambiguous translation key/
|
expect { extract("t 'foo', 'Foo'", I18nliner::Scope.root) }.to raise_error(/ambiguous translation key/)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "does not require explicit keys if the key is inferred and there is no scope" do
|
it "does not require explicit keys if the key is inferred and there is no scope" do
|
||||||
|
@ -95,7 +95,7 @@ describe I18nliner::Extractors::RubyExtractor do
|
||||||
|
|
||||||
context "sanitization" do
|
context "sanitization" do
|
||||||
it "rejects stuff that looks sufficiently html-y" do
|
it "rejects stuff that looks sufficiently html-y" do
|
||||||
expect { extract "t 'dude', 'this is <em>important</em>'" }.to raise_error /html tags in default translation/
|
expect { extract "t 'dude', 'this is <em>important</em>'" }.to raise_error(/html tags in default translation/)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "generallies be ok with angle brackets" do
|
it "generallies be ok with angle brackets" do
|
||||||
|
|
|
@ -47,6 +47,6 @@ module I18nTasks
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Hash.send(:include, HashExtensions)
|
Hash.include HashExtensions
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,7 +7,7 @@ require 'shellwords'
|
||||||
namespace :i18n do
|
namespace :i18n do
|
||||||
desc "Verifies all translation calls"
|
desc "Verifies all translation calls"
|
||||||
task :check => :i18n_environment do
|
task :check => :i18n_environment do
|
||||||
Hash.send(:include, I18nTasks::HashExtensions) unless Hash.new.kind_of?(I18nTasks::HashExtensions)
|
Hash.include I18nTasks::HashExtensions unless Hash.new.kind_of?(I18nTasks::HashExtensions)
|
||||||
|
|
||||||
def I18nliner.manual_translations
|
def I18nliner.manual_translations
|
||||||
I18n.available_locales
|
I18n.available_locales
|
||||||
|
@ -105,8 +105,8 @@ namespace :i18n do
|
||||||
I18n.load_path += Dir[Rails.root.join('config', 'locales', 'locales.yml')]
|
I18n.load_path += Dir[Rails.root.join('config', 'locales', 'locales.yml')]
|
||||||
I18n.load_path += Dir[Rails.root.join('config', 'locales', 'community.csv')]
|
I18n.load_path += Dir[Rails.root.join('config', 'locales', 'community.csv')]
|
||||||
|
|
||||||
I18n::Backend::Simple.send(:include, I18nTasks::CsvBackend)
|
I18n::Backend::Simple.include I18nTasks::CsvBackend
|
||||||
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
|
I18n::Backend::Simple.include I18n::Backend::Fallbacks
|
||||||
|
|
||||||
require 'i18nliner/extractors/translation_hash'
|
require 'i18nliner/extractors/translation_hash'
|
||||||
I18nliner::Extractors::TranslationHash.class_eval do
|
I18nliner::Extractors::TranslationHash.class_eval do
|
||||||
|
@ -118,7 +118,7 @@ namespace :i18n do
|
||||||
|
|
||||||
desc "Generates JS bundle i18n files (non-en) and adds them to assets.yml"
|
desc "Generates JS bundle i18n files (non-en) and adds them to assets.yml"
|
||||||
task :generate_js => :i18n_environment do
|
task :generate_js => :i18n_environment do
|
||||||
Hash.send(:include, I18nTasks::HashExtensions) unless Hash.new.kind_of?(I18nTasks::HashExtensions)
|
Hash.include I18nTasks::HashExtensions unless Hash.new.kind_of?(I18nTasks::HashExtensions)
|
||||||
|
|
||||||
locales = I18n.available_locales
|
locales = I18n.available_locales
|
||||||
all_translations = I18n.backend.send(:translations)
|
all_translations = I18n.backend.send(:translations)
|
||||||
|
@ -188,7 +188,7 @@ namespace :i18n do
|
||||||
t = Time.now
|
t = Time.now
|
||||||
translations = YAML.safe_load(open('config/locales/generated/en.yml'))
|
translations = YAML.safe_load(open('config/locales/generated/en.yml'))
|
||||||
|
|
||||||
I18n.send :extend, I18nTasks::Lolcalize
|
I18n.extend I18nTasks::Lolcalize
|
||||||
lolz_translations = Hash.new
|
lolz_translations = Hash.new
|
||||||
lolz_translations['lolz'] = process_lolz.call(translations['en'])
|
lolz_translations['lolz'] = process_lolz.call(translations['en'])
|
||||||
puts
|
puts
|
||||||
|
@ -217,7 +217,7 @@ namespace :i18n do
|
||||||
|
|
||||||
desc "Exports new/changed English strings to be translated"
|
desc "Exports new/changed English strings to be translated"
|
||||||
task :export => :environment do
|
task :export => :environment do
|
||||||
Hash.send(:include, I18nTasks::HashExtensions) unless Hash.new.kind_of?(I18nTasks::HashExtensions)
|
Hash.include I18nTasks::HashExtensions unless Hash.new.kind_of?(I18nTasks::HashExtensions)
|
||||||
|
|
||||||
begin
|
begin
|
||||||
base_filename = "config/locales/generated/en.yml"
|
base_filename = "config/locales/generated/en.yml"
|
||||||
|
@ -321,7 +321,7 @@ namespace :i18n do
|
||||||
desc "Validates and imports new translations"
|
desc "Validates and imports new translations"
|
||||||
task :import, [:source_file, :translated_file] => :environment do |t, args|
|
task :import, [:source_file, :translated_file] => :environment do |t, args|
|
||||||
require 'open-uri'
|
require 'open-uri'
|
||||||
Hash.send(:include, I18nTasks::HashExtensions) unless Hash.new.kind_of?(I18nTasks::HashExtensions)
|
Hash.include I18nTasks::HashExtensions unless Hash.new.kind_of?(I18nTasks::HashExtensions)
|
||||||
|
|
||||||
if args[:source_file]
|
if args[:source_file]
|
||||||
source_translations = YAML.safe_load(open(args[:source_file]))
|
source_translations = YAML.safe_load(open(args[:source_file]))
|
||||||
|
@ -401,7 +401,7 @@ namespace :i18n do
|
||||||
end
|
end
|
||||||
|
|
||||||
def autoimport(source_translations, new_translations)
|
def autoimport(source_translations, new_translations)
|
||||||
Hash.send(:include, I18nTasks::HashExtensions) unless Hash.new.kind_of?(I18nTasks::HashExtensions)
|
Hash.include I18nTasks::HashExtensions unless Hash.new.kind_of?(I18nTasks::HashExtensions)
|
||||||
|
|
||||||
raise "Need source translations" unless source_translations
|
raise "Need source translations" unless source_translations
|
||||||
raise "Need translated_file" unless new_translations
|
raise "Need translated_file" unless new_translations
|
||||||
|
|
|
@ -65,7 +65,7 @@ module IncomingMailProcessor
|
||||||
# Raises anything the timeout method raises.
|
# Raises anything the timeout method raises.
|
||||||
def with_timeout(&block)
|
def with_timeout(&block)
|
||||||
method = @timeout_method || method(:default_timeout_method)
|
method = @timeout_method || method(:default_timeout_method)
|
||||||
method.call &block
|
method.call(&block)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Wrap an object's methods in with_timeout calls. The original
|
# Public: Wrap an object's methods in with_timeout calls. The original
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue