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:
Cody Cutrer 2021-09-27 09:58:39 -06:00
parent 117d484c1c
commit dbd8c46655
363 changed files with 1277 additions and 1263 deletions

View File

@ -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

View File

@ -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

View File

@ -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]))

View File

@ -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

View File

@ -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

View File

@ -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])

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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) }

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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) }

View File

@ -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

View File

@ -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

View File

@ -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 }

View File

@ -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: []

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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")

View File

@ -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

View File

@ -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?

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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? } }

View File

@ -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

View File

@ -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?

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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))

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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, {

View File

@ -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,

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -19,4 +19,4 @@
require 'canvas_sanitize' require 'canvas_sanitize'
ActiveRecord::Base.send :include, CanvasSanitize ActiveRecord::Base.include CanvasSanitize

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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}"

View File

@ -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}"

View File

@ -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
} }
} }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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?

View File

@ -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

View File

@ -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

View File

@ -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?

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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]

View File

@ -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>[^;\"\']+)[\"\']?/)

View File

@ -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

View File

@ -47,6 +47,6 @@ module I18nTasks
end end
end end
Hash.send(:include, HashExtensions) Hash.include HashExtensions
end end
end end

View File

@ -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

View File

@ -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