<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Agovil</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Agovil"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Agovil"/>
	<updated>2026-07-21T05:55:30Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-E1988_Allow_reviewer_to_say_review_can_be_shown_to_class_as_an_example&amp;diff=131370</id>
		<title>CSC/ECE 517 Fall 2019 -E1988 Allow reviewer to say review can be shown to class as an example</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-E1988_Allow_reviewer_to_say_review_can_be_shown_to_class_as_an_example&amp;diff=131370"/>
		<updated>2019-12-18T16:14:42Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Files to be changed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction (''Reviews in Expertiza'') ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In Expertiza, students can review other team's projects. The instructors can create assignment specific questions based on which students can write these reviews. The questions are in rating and/or comment form. Currently, the instructors write hints as a part of the review questions. These hints can be instructions on how to structure your review, what to include/exclude etc. These help students write constructive reviews. But this is clearly not enough. If the students could read through some sample reviews, they would gain a better understanding of how to write reviews. This project aims to do just that.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problem Statement ==&lt;br /&gt;
&lt;br /&gt;
The objective of this project is to:&lt;br /&gt;
# Add a feature for students to toggle the visibility of their reviews. When reviews are marked 'public', instructors will have the option of adding them as a 'sample review' to any assignment. When reviews are marked 'private' they will not be shown to other students as a sample. &lt;br /&gt;
# Add a feature for the Instructor to select a subset of 'public' reviews and make those reviews visible as sample reviews of any of their assignments in the course.&lt;br /&gt;
# Add a feature for instructors to select a subset of 'sample' reviews and set those reviews as sample reviews for a particular assignment.&lt;br /&gt;
# Create a view where the student can see a list of sample reviews of the assignment and have a detailed view of each.&lt;br /&gt;
&lt;br /&gt;
== Implementation Details ==&lt;br /&gt;
&lt;br /&gt;
=== What is this project adding to the reviews? ===&lt;br /&gt;
&lt;br /&gt;
The goal of this project is to enable instructors to select certain reviews to show as examples to the entire class. Thus the students will be able to see good reviews that one student has submitted for another student's work. The students will be able to get understand what a good review looks like and what exactly is expected from them when they review any other team's work. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementation === &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) '''Creating a checkbox''': When a student submits a review, they should be able to choose if they want to make their review public or private. Thus we added a checkbox to the review page. Checking this checkbox will make the review public. Unchecking it will make the review private. When this status changes, a message is displayed next to the checkbox saying if the status was changed successfully.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) '''Allow students to make a review private''': Students should be able to change the visibility of their review even after they have submitted it. A checkbox similar to the one described above was implemented where students can see the reviews they have given. If a review has been made private after an instructor has selected it as a sample review, it is still not displayed to students as an example review.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) '''Allow instructors to select (remove) sample reviews''': If a review has been made public by the reviewer, the instructor is able to select that review to be made a sample review. If the review is already a sample review, the instructor is able to remove from the set of example reviews. If the review was private, the instructor is shown a notice that 'This review is private.' and they are not allowed to  select it as a sample review. This selection can be done when the instructor is viewing the review.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4) '''Set some of selected reviews as sample for an assignment''': Sample reviews can be identified by the assignment, reviewer (a participant) and the reviewee (a team). When editing an assignment, the instructor is able to select past assignments, select a reviewer and select the reviewee. The way in which the instructor selects the assignment is to select the from a dropdown. the assignment dropdown is populated with all the assignments that the instructor has created and all the assignments that belong to the course. When the assignment is selected, the reviewer dropdown will then be populated with the names of the reviewers whose reviews have been made public and have been selected by the instructor. Once the reviewer is selected, the reviewee dropdown will get populated with names of teams to whom the review has been given. This will identify the selected review. The instructor will be able to set it as sample review for the current assignment. This means that the instructor can even set a review from any of their earlier assignments as a sample.  &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
5) '''Allow students to see sample reviews''': When a student wants to review other team's work, they will be shown a list of sample reviews that the instructor has selected for them. In the list each review is a link to the full review.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Files to be changed === &lt;br /&gt;
&lt;br /&gt;
* Create migration to create a column called status which can take on the values 'selected' = 2, 'public' = 1 and 'private' = 0. Changes will reflect in '''db/schema.rb''' &amp;lt;br&amp;gt;&lt;br /&gt;
Status can have 3 values as listed below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Explanation of the value &lt;br /&gt;
|-&lt;br /&gt;
| 0 || Response is private. This is the default value.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || The response is marked public by the student but has not been selected as a sample review by the instructors.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || The response has been selected as a sample by the instructors.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Create a checkbox in a view: '''views/response/response.html.erb'''. To allow students to mark their reviews as public.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add code to check the status field from response.html.erb and update the db, in controller: '''app/controllers/response_controller.rb''' (in method &amp;quot;create&amp;quot;). This will reflect the choice of the student in the database.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The instructors will select sample reviews from a set of public reviews. The code change will be in the file '''team_users_popup.html.haml''' which is under the '''views/popup''' directory.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Students will be able to view sample reviews. The code change will be in the file '''list.html.erb''' which is under the '''views/student_review''' directory. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* In order to paginate and display a list of reviews to chose from for the instructors, we will have to create partial view files.&lt;br /&gt;
&lt;br /&gt;
* The instructor will be able to view the reviews which have been marked public by student. Those reviews will have an orange border around them. This is implemented in '''app/views/reports/_review_report.html.erb'''&lt;br /&gt;
&lt;br /&gt;
* The code to check the visibility status of a review is implemented in '''app/helpers/review_mapping_helper.rb'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== UML Diagram ===&lt;br /&gt;
* Use Case -&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:UseCase.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Power Users:''' Instructors, TAs, Admins and Super Admins&lt;br /&gt;
&lt;br /&gt;
== DB Design ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Previous work ===&lt;br /&gt;
1) They added a facility for instructors to select individual reviews and set them as a sample. Hence a migration was created to create a model. The model has an assignment id and a response_map_id. The assignment_id is the id of the assignment for which the sample is to be shown. The response_map_id is the id of the sample review.&amp;lt;br&amp;gt;&lt;br /&gt;
2) A column called visibility was added to the responses model which will show if the review has been marked 'private', 'public' or 'selected'.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Our Approach ===&lt;br /&gt;
We plan to improve the code which was implemented last semester. This code implements the functionality of the given problem statement. But they lack standards which are required to merge into the expertiza branch. So we plan to reuse the code and modularize it by refactoring and taking care of all the unnecessary parts of the implementation by removing the new reports, modified icons and new files under the test folder. Since all this has been already implemented. &lt;br /&gt;
&lt;br /&gt;
In our approach, we will modify the code to work on the reports that already existing in the assignments.&lt;br /&gt;
&lt;br /&gt;
== Design Pattern ==&lt;br /&gt;
&lt;br /&gt;
In our project, the implementation of new functionality would be through a '''Delegation pattern''' which is an object-oriented design pattern that allows object composition to achieve the same code reuse as an inheritance.&lt;br /&gt;
&lt;br /&gt;
== Future Testing Plan ==&lt;br /&gt;
This shows the overall flow of what the users of the system should be able to do. We will write tests such that the entire flow will be completely tested.&amp;lt;br&amp;gt;&lt;br /&gt;
'''As a Power User (TA/Instructor/Admin/Super Admin)''' (Scenario 1)&lt;br /&gt;
# Log in&lt;br /&gt;
# Click on Manage-&amp;gt;Assignments&lt;br /&gt;
# Displays a list of Assignments&lt;br /&gt;
# Click View Report/Review for a particular assignment.&lt;br /&gt;
# Displays a list of reviews submitted by students.&lt;br /&gt;
# Click on any review in &amp;quot;team reviewed&amp;quot; column for a particular student.&lt;br /&gt;
# Displays the summary of reviews submitted by that student, with a &amp;quot;Make as sample&amp;quot; button on the right of every review.&lt;br /&gt;
# Click on &amp;quot;Make as sample&amp;quot; for the intended reviews, which opens a popup that displays a list of all assignments that are a part of the instructor's courses.&lt;br /&gt;
# From this list select all assignments for which the review has to be shown as a sample.&lt;br /&gt;
# Click on 'Submit' after selection (this closes the popup).&lt;br /&gt;
# Navigate to view reviews of that particular assignment and click on &amp;quot;Sample Reviews&amp;quot;.&lt;br /&gt;
# A new page is opened that lists out all the sample reviews of the assignment.&lt;br /&gt;
&lt;br /&gt;
'''As a Power User (TA/Instructor/Admin/Super Admin)''' (Scenario 2)&lt;br /&gt;
# Log in&lt;br /&gt;
# Click on Manage-&amp;gt;Assignments&lt;br /&gt;
# Displays a list of Assignments&lt;br /&gt;
# Click Edit for a particular assignment.&lt;br /&gt;
# Click on the review tab.&lt;br /&gt;
# Select an assignment from the dropdown&lt;br /&gt;
# Select a reviewer from the second dropdown.&lt;br /&gt;
# Select a reviewee from the third dropdown.&lt;br /&gt;
# Click 'Add' button to add the selected review to be shown as a sample for this assignment.&lt;br /&gt;
# Add as many sample reviews as you want in the same way.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''As a Student (Scenario 1)'''&lt;br /&gt;
# Log in.&lt;br /&gt;
# Click on Assignments&lt;br /&gt;
# List of assignments is displayed.&lt;br /&gt;
# Click on any assignment for which the review has to be submitted.&lt;br /&gt;
# Assignment task page is displayed.&lt;br /&gt;
# Click on &amp;quot;Other's work&amp;quot; to open the reviews summary page (at /student_review).&lt;br /&gt;
# Below the heading &amp;quot;Reviews for ...&amp;quot;, click on the &amp;quot;Show sample reviews&amp;quot; link.&lt;br /&gt;
# This opens a page where the student can view all sample reviews for that assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''As a Student (Scenario 2)'''&lt;br /&gt;
# Log in.&lt;br /&gt;
# Click on Assignments&lt;br /&gt;
# List of assignments is displayed.&lt;br /&gt;
# Click on any assignment for which the review has to be submitted.&lt;br /&gt;
# Assignment task page is displayed.&lt;br /&gt;
# Click on &amp;quot;Other's work&amp;quot; to open the reviews summary page (at /student_review).&lt;br /&gt;
# Chose to review any of the teams' assignments that are displayed.&lt;br /&gt;
# Select a team for review and fill in the review.&lt;br /&gt;
# Before submitting the review, select the checkbox that says &amp;quot;I agree to share this review anonymously as an example to the entire class&amp;quot;.&lt;br /&gt;
# After clicking on the submit button, the review submitted has been made public.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References == &lt;br /&gt;
[http://wiki.expertiza.ncsu.edu/index.php/Main_Page Expertiza Wiki] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://expertiza.ncsu.edu/ Expertiza Home]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://wiki.expertiza.ncsu.edu/index.php/E1867_allow_reviewer_to_say_review_can_be_shown_to_class_as_an_example Previous team's documentation]&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
1) Aditya Govil (agovil@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
2) Ritesh Ghorse (rghorse@ncsu.edu) &lt;br /&gt;
&lt;br /&gt;
3) Rohan Patil (rrpatil3@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
4) Jay Jagtap (jjjagtap@ncsu.edu)&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-E1988_Allow_reviewer_to_say_review_can_be_shown_to_class_as_an_example&amp;diff=131369</id>
		<title>CSC/ECE 517 Fall 2019 -E1988 Allow reviewer to say review can be shown to class as an example</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-E1988_Allow_reviewer_to_say_review_can_be_shown_to_class_as_an_example&amp;diff=131369"/>
		<updated>2019-12-18T16:14:28Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Files to be changed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction (''Reviews in Expertiza'') ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In Expertiza, students can review other team's projects. The instructors can create assignment specific questions based on which students can write these reviews. The questions are in rating and/or comment form. Currently, the instructors write hints as a part of the review questions. These hints can be instructions on how to structure your review, what to include/exclude etc. These help students write constructive reviews. But this is clearly not enough. If the students could read through some sample reviews, they would gain a better understanding of how to write reviews. This project aims to do just that.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problem Statement ==&lt;br /&gt;
&lt;br /&gt;
The objective of this project is to:&lt;br /&gt;
# Add a feature for students to toggle the visibility of their reviews. When reviews are marked 'public', instructors will have the option of adding them as a 'sample review' to any assignment. When reviews are marked 'private' they will not be shown to other students as a sample. &lt;br /&gt;
# Add a feature for the Instructor to select a subset of 'public' reviews and make those reviews visible as sample reviews of any of their assignments in the course.&lt;br /&gt;
# Add a feature for instructors to select a subset of 'sample' reviews and set those reviews as sample reviews for a particular assignment.&lt;br /&gt;
# Create a view where the student can see a list of sample reviews of the assignment and have a detailed view of each.&lt;br /&gt;
&lt;br /&gt;
== Implementation Details ==&lt;br /&gt;
&lt;br /&gt;
=== What is this project adding to the reviews? ===&lt;br /&gt;
&lt;br /&gt;
The goal of this project is to enable instructors to select certain reviews to show as examples to the entire class. Thus the students will be able to see good reviews that one student has submitted for another student's work. The students will be able to get understand what a good review looks like and what exactly is expected from them when they review any other team's work. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementation === &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) '''Creating a checkbox''': When a student submits a review, they should be able to choose if they want to make their review public or private. Thus we added a checkbox to the review page. Checking this checkbox will make the review public. Unchecking it will make the review private. When this status changes, a message is displayed next to the checkbox saying if the status was changed successfully.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) '''Allow students to make a review private''': Students should be able to change the visibility of their review even after they have submitted it. A checkbox similar to the one described above was implemented where students can see the reviews they have given. If a review has been made private after an instructor has selected it as a sample review, it is still not displayed to students as an example review.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) '''Allow instructors to select (remove) sample reviews''': If a review has been made public by the reviewer, the instructor is able to select that review to be made a sample review. If the review is already a sample review, the instructor is able to remove from the set of example reviews. If the review was private, the instructor is shown a notice that 'This review is private.' and they are not allowed to  select it as a sample review. This selection can be done when the instructor is viewing the review.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4) '''Set some of selected reviews as sample for an assignment''': Sample reviews can be identified by the assignment, reviewer (a participant) and the reviewee (a team). When editing an assignment, the instructor is able to select past assignments, select a reviewer and select the reviewee. The way in which the instructor selects the assignment is to select the from a dropdown. the assignment dropdown is populated with all the assignments that the instructor has created and all the assignments that belong to the course. When the assignment is selected, the reviewer dropdown will then be populated with the names of the reviewers whose reviews have been made public and have been selected by the instructor. Once the reviewer is selected, the reviewee dropdown will get populated with names of teams to whom the review has been given. This will identify the selected review. The instructor will be able to set it as sample review for the current assignment. This means that the instructor can even set a review from any of their earlier assignments as a sample.  &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
5) '''Allow students to see sample reviews''': When a student wants to review other team's work, they will be shown a list of sample reviews that the instructor has selected for them. In the list each review is a link to the full review.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Files to be changed === &lt;br /&gt;
&lt;br /&gt;
* Create migration to create a column called status which can take on the values 'selected' = 2, 'public' = 1 and 'private' = 0. Changes will reflect in '''db/schema.rb''' &amp;lt;br&amp;gt;&lt;br /&gt;
Status can have 3 values as listed below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Explanation of the value &lt;br /&gt;
|-&lt;br /&gt;
| 0 || Response is private. This is the default value.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || The response is marked public by the student but has not been selected as a sample review by the instructors.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || The response has been selected as a sample by the instructors.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Create a checkbox in a view: '''views/response/response.html.erb'''. To allow students to mark their reviews as public.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add code to check the status field from response.html.erb and update the db, in controller: '''app/controllers/response_controller.rb''' (in method &amp;quot;create&amp;quot;). This will reflect the choice of the student in the database.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The instructors will select sample reviews from a set of public reviews. The code change will be in the file '''team_users_popup.html.haml''' which is under the '''views/popup''' directory.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Students will be able to view sample reviews. The code change will be in the file '''list.html.erb''' which is under the '''views/student_review''' directory. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* In order to paginate and display a list of reviews to chose from for the instructors, we will have to create partial view files.&lt;br /&gt;
&lt;br /&gt;
* The instructor will be able to view the reviews which have been marked public by student. Those reviews will have an orange border around them. This is implemented in '''app/views/reports/_review_report.html.erb'''&lt;br /&gt;
&lt;br /&gt;
* The code to check the visibility status of a review is implemented in '''app/helpers/review_mapping_helper.rb''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== UML Diagram ===&lt;br /&gt;
* Use Case -&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:UseCase.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Power Users:''' Instructors, TAs, Admins and Super Admins&lt;br /&gt;
&lt;br /&gt;
== DB Design ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Previous work ===&lt;br /&gt;
1) They added a facility for instructors to select individual reviews and set them as a sample. Hence a migration was created to create a model. The model has an assignment id and a response_map_id. The assignment_id is the id of the assignment for which the sample is to be shown. The response_map_id is the id of the sample review.&amp;lt;br&amp;gt;&lt;br /&gt;
2) A column called visibility was added to the responses model which will show if the review has been marked 'private', 'public' or 'selected'.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Our Approach ===&lt;br /&gt;
We plan to improve the code which was implemented last semester. This code implements the functionality of the given problem statement. But they lack standards which are required to merge into the expertiza branch. So we plan to reuse the code and modularize it by refactoring and taking care of all the unnecessary parts of the implementation by removing the new reports, modified icons and new files under the test folder. Since all this has been already implemented. &lt;br /&gt;
&lt;br /&gt;
In our approach, we will modify the code to work on the reports that already existing in the assignments.&lt;br /&gt;
&lt;br /&gt;
== Design Pattern ==&lt;br /&gt;
&lt;br /&gt;
In our project, the implementation of new functionality would be through a '''Delegation pattern''' which is an object-oriented design pattern that allows object composition to achieve the same code reuse as an inheritance.&lt;br /&gt;
&lt;br /&gt;
== Future Testing Plan ==&lt;br /&gt;
This shows the overall flow of what the users of the system should be able to do. We will write tests such that the entire flow will be completely tested.&amp;lt;br&amp;gt;&lt;br /&gt;
'''As a Power User (TA/Instructor/Admin/Super Admin)''' (Scenario 1)&lt;br /&gt;
# Log in&lt;br /&gt;
# Click on Manage-&amp;gt;Assignments&lt;br /&gt;
# Displays a list of Assignments&lt;br /&gt;
# Click View Report/Review for a particular assignment.&lt;br /&gt;
# Displays a list of reviews submitted by students.&lt;br /&gt;
# Click on any review in &amp;quot;team reviewed&amp;quot; column for a particular student.&lt;br /&gt;
# Displays the summary of reviews submitted by that student, with a &amp;quot;Make as sample&amp;quot; button on the right of every review.&lt;br /&gt;
# Click on &amp;quot;Make as sample&amp;quot; for the intended reviews, which opens a popup that displays a list of all assignments that are a part of the instructor's courses.&lt;br /&gt;
# From this list select all assignments for which the review has to be shown as a sample.&lt;br /&gt;
# Click on 'Submit' after selection (this closes the popup).&lt;br /&gt;
# Navigate to view reviews of that particular assignment and click on &amp;quot;Sample Reviews&amp;quot;.&lt;br /&gt;
# A new page is opened that lists out all the sample reviews of the assignment.&lt;br /&gt;
&lt;br /&gt;
'''As a Power User (TA/Instructor/Admin/Super Admin)''' (Scenario 2)&lt;br /&gt;
# Log in&lt;br /&gt;
# Click on Manage-&amp;gt;Assignments&lt;br /&gt;
# Displays a list of Assignments&lt;br /&gt;
# Click Edit for a particular assignment.&lt;br /&gt;
# Click on the review tab.&lt;br /&gt;
# Select an assignment from the dropdown&lt;br /&gt;
# Select a reviewer from the second dropdown.&lt;br /&gt;
# Select a reviewee from the third dropdown.&lt;br /&gt;
# Click 'Add' button to add the selected review to be shown as a sample for this assignment.&lt;br /&gt;
# Add as many sample reviews as you want in the same way.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''As a Student (Scenario 1)'''&lt;br /&gt;
# Log in.&lt;br /&gt;
# Click on Assignments&lt;br /&gt;
# List of assignments is displayed.&lt;br /&gt;
# Click on any assignment for which the review has to be submitted.&lt;br /&gt;
# Assignment task page is displayed.&lt;br /&gt;
# Click on &amp;quot;Other's work&amp;quot; to open the reviews summary page (at /student_review).&lt;br /&gt;
# Below the heading &amp;quot;Reviews for ...&amp;quot;, click on the &amp;quot;Show sample reviews&amp;quot; link.&lt;br /&gt;
# This opens a page where the student can view all sample reviews for that assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''As a Student (Scenario 2)'''&lt;br /&gt;
# Log in.&lt;br /&gt;
# Click on Assignments&lt;br /&gt;
# List of assignments is displayed.&lt;br /&gt;
# Click on any assignment for which the review has to be submitted.&lt;br /&gt;
# Assignment task page is displayed.&lt;br /&gt;
# Click on &amp;quot;Other's work&amp;quot; to open the reviews summary page (at /student_review).&lt;br /&gt;
# Chose to review any of the teams' assignments that are displayed.&lt;br /&gt;
# Select a team for review and fill in the review.&lt;br /&gt;
# Before submitting the review, select the checkbox that says &amp;quot;I agree to share this review anonymously as an example to the entire class&amp;quot;.&lt;br /&gt;
# After clicking on the submit button, the review submitted has been made public.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References == &lt;br /&gt;
[http://wiki.expertiza.ncsu.edu/index.php/Main_Page Expertiza Wiki] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://expertiza.ncsu.edu/ Expertiza Home]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://wiki.expertiza.ncsu.edu/index.php/E1867_allow_reviewer_to_say_review_can_be_shown_to_class_as_an_example Previous team's documentation]&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
1) Aditya Govil (agovil@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
2) Ritesh Ghorse (rghorse@ncsu.edu) &lt;br /&gt;
&lt;br /&gt;
3) Rohan Patil (rrpatil3@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
4) Jay Jagtap (jjjagtap@ncsu.edu)&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=127267</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=127267"/>
		<updated>2019-11-06T01:54:19Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Automated RSpec Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Comments added within various functions===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The comments about the internal functionality of the following functions were added : '''get_review_metrics''', '''get_review_metrics''', '''get_review_metrics''', '''get_review_metrics''', '''get_review_metrics''' and their sub-functions.&lt;br /&gt;
&lt;br /&gt;
Example : '''get_review_metrics''' function&lt;br /&gt;
&lt;br /&gt;
'''Before'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''After'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # gets minimum, maximum and average value for all the reviews&lt;br /&gt;
 def get_review_metrics(round, team_id)&lt;br /&gt;
    # Setting values of instance variables&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    # Fetching value of @avg_and_ranges[team_id][round] &lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      # Iterating though the list&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
        # setting values of variables based on certain conditions&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_response_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
===Test Plan===&lt;br /&gt;
There were refactoring changes made in the function. Testing was carried out to check the Cognitive, Cyclomatic, Perceived, Lines of Code and Assignment Branch Condition (ABC) size complexities of these functions. Rubocop was used to test these complexities of the functions. We also did automated testing using RSpec. Also, Travis-CI build of each pull request merge was checked to ensure that the code is working properly after refactoring.&lt;br /&gt;
&lt;br /&gt;
===Rubocop Testing===&lt;br /&gt;
Rubocop testing results for &amp;quot;get_review_metrics&amp;quot; function after refactoring.&lt;br /&gt;
[[File:Webp.net-resizeimage.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_awarded_review_score&amp;quot; function after refactoring.&lt;br /&gt;
[[File:B.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_team_color&amp;quot; function after refactoring.&lt;br /&gt;
[[File:C.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_each_review_and_feedback_response_map&amp;quot; function after refactoring.&lt;br /&gt;
[[File:D.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_css_style_for_calibration_report&amp;quot; function after refactoring.&lt;br /&gt;
[[File:E.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Travis-CI Build Testing===&lt;br /&gt;
Travis-CI Build Test of the beta branch after a refactored function is merged in the beta branch.&lt;br /&gt;
[[File:sc1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Automated RSpec Testing===&lt;br /&gt;
We carried out automated testing using Rspec for the files where we made changes to, during the project. All the 14 test cases in the spec file successfully passed.&lt;br /&gt;
Note: In some cases, to resolve the code climate issues we have broken down an existing long function into logical smaller functions. In these cases, we are neither manipulating any instance or class variables nor are we manipulating any values being fetched from the database in any way. Hence we decided it would not be practical or useful to write RSpec tests to test inbuilt Ruby and Rails functionalities. We followed &amp;quot;The Magic Tricks of Testing by Sandi Metz - Rails Conf 2013&amp;quot; [[https://www.youtube.com/watch?v=URSWYvyc42M] which asserts the importance of not adding any unnecessary new tests as well as getting rid of any kind of unnecessary tests.&lt;br /&gt;
&lt;br /&gt;
Link to Rspec Testing Video: [https://bit.ly/2NiWlgI]&lt;br /&gt;
&lt;br /&gt;
[[File:sh2.jpg]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://www.youtube.com/watch?v=URSWYvyc42M&lt;br /&gt;
&lt;br /&gt;
2) https://bit.ly/2NiWlgI&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
4) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
5) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
6) https://github.com/ArshdeepSinghSyal/expertiza/tree/beta&lt;br /&gt;
&lt;br /&gt;
7) https://github.com/expertiza/expertiza/pull/1526&lt;br /&gt;
&lt;br /&gt;
==Project Mentors==&lt;br /&gt;
&lt;br /&gt;
Edward Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Mohit Jain (mjain6@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil (agovil@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal (asyal@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil (rrpatil3@ncsu.edu)&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=127266</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=127266"/>
		<updated>2019-11-06T01:54:00Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Automated RSpec Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Comments added within various functions===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The comments about the internal functionality of the following functions were added : '''get_review_metrics''', '''get_review_metrics''', '''get_review_metrics''', '''get_review_metrics''', '''get_review_metrics''' and their sub-functions.&lt;br /&gt;
&lt;br /&gt;
Example : '''get_review_metrics''' function&lt;br /&gt;
&lt;br /&gt;
'''Before'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''After'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # gets minimum, maximum and average value for all the reviews&lt;br /&gt;
 def get_review_metrics(round, team_id)&lt;br /&gt;
    # Setting values of instance variables&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    # Fetching value of @avg_and_ranges[team_id][round] &lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      # Iterating though the list&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
        # setting values of variables based on certain conditions&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_response_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
===Test Plan===&lt;br /&gt;
There were refactoring changes made in the function. Testing was carried out to check the Cognitive, Cyclomatic, Perceived, Lines of Code and Assignment Branch Condition (ABC) size complexities of these functions. Rubocop was used to test these complexities of the functions. We also did automated testing using RSpec. Also, Travis-CI build of each pull request merge was checked to ensure that the code is working properly after refactoring.&lt;br /&gt;
&lt;br /&gt;
===Rubocop Testing===&lt;br /&gt;
Rubocop testing results for &amp;quot;get_review_metrics&amp;quot; function after refactoring.&lt;br /&gt;
[[File:Webp.net-resizeimage.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_awarded_review_score&amp;quot; function after refactoring.&lt;br /&gt;
[[File:B.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_team_color&amp;quot; function after refactoring.&lt;br /&gt;
[[File:C.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_each_review_and_feedback_response_map&amp;quot; function after refactoring.&lt;br /&gt;
[[File:D.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_css_style_for_calibration_report&amp;quot; function after refactoring.&lt;br /&gt;
[[File:E.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Travis-CI Build Testing===&lt;br /&gt;
Travis-CI Build Test of the beta branch after a refactored function is merged in the beta branch.&lt;br /&gt;
[[File:sc1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Automated RSpec Testing===&lt;br /&gt;
We carried out automated testing using Rspec for the files where we made changes to, during the project. All the 14 test cases in the spec file successfully passed.&lt;br /&gt;
Note: In some cases, to resolve the code climate issues we have broken down an existing long function into logical smaller functions. In these cases, we are neither manipulating any instance or class variables nor are we manipulating any values being fetched from the database in any way. Hence we decided it would not be practical or useful to write RSpec tests to test inbuilt Ruby and Rails functionalities. We followed &amp;quot;The Magic Tricks of Testing by Sandi Metz - Rails Conf 2013&amp;quot; [[https://www.youtube.com/watch?v=URSWYvyc42M] which asserts the importance of not adding any unnecessary new tests as well as getting rid of any kind of unnecessary tests.&lt;br /&gt;
&lt;br /&gt;
[[File:sh2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Link to Rspec Testing Video: [https://bit.ly/2NiWlgI]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://www.youtube.com/watch?v=URSWYvyc42M&lt;br /&gt;
&lt;br /&gt;
2) https://bit.ly/2NiWlgI&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
4) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
5) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
6) https://github.com/ArshdeepSinghSyal/expertiza/tree/beta&lt;br /&gt;
&lt;br /&gt;
7) https://github.com/expertiza/expertiza/pull/1526&lt;br /&gt;
&lt;br /&gt;
==Project Mentors==&lt;br /&gt;
&lt;br /&gt;
Edward Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Mohit Jain (mjain6@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil (agovil@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal (asyal@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil (rrpatil3@ncsu.edu)&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Sh2.jpg&amp;diff=127265</id>
		<title>File:Sh2.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Sh2.jpg&amp;diff=127265"/>
		<updated>2019-11-06T01:53:47Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Sh1.jpg&amp;diff=127264</id>
		<title>File:Sh1.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Sh1.jpg&amp;diff=127264"/>
		<updated>2019-11-06T01:53:02Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Sh.jpg&amp;diff=127263</id>
		<title>File:Sh.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Sh.jpg&amp;diff=127263"/>
		<updated>2019-11-06T01:51:20Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125665</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125665"/>
		<updated>2019-10-27T20:40:07Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Comments added within various functions===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The comments about the internal functionality of the following functions were added : '''get_review_metrics''', '''get_review_metrics''', '''get_review_metrics''', '''get_review_metrics''', '''get_review_metrics''' and their sub-functions.&lt;br /&gt;
&lt;br /&gt;
Example : '''get_review_metrics''' function&lt;br /&gt;
&lt;br /&gt;
'''Before'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''After'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # gets minimum, maximum and average value for all the reviews&lt;br /&gt;
 def get_review_metrics(round, team_id)&lt;br /&gt;
    # Setting values of instance variables&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    # Fetching value of @avg_and_ranges[team_id][round] &lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      # Iterating though the list&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
        # setting values of variables based on certain conditions&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_response_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
===Test Plan===&lt;br /&gt;
There were refactoring changes made in the function. Testing was carried out to check the Cognitive, Cyclomatic, Perceived, Lines of Code and Assignment Branch Condition (ABC) size complexities of these functions. Rubocop was used to test these complexities of the functions. For these cases, RSpec testing, was also carried out using the original spec file and it showed no new errors. Also, Travis-CI build of each pull request merge was checked to ensure that the code is working properly after refactoring.&lt;br /&gt;
&lt;br /&gt;
===Rubocop Testing===&lt;br /&gt;
Rubocop testing results for &amp;quot;get_review_metrics&amp;quot; function after refactoring.&lt;br /&gt;
[[File:Webp.net-resizeimage.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_awarded_review_score&amp;quot; function after refactoring.&lt;br /&gt;
[[File:B.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_team_color&amp;quot; function after refactoring.&lt;br /&gt;
[[File:C.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_each_review_and_feedback_response_map&amp;quot; function after refactoring.&lt;br /&gt;
[[File:D.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_css_style_for_calibration_report&amp;quot; function after refactoring.&lt;br /&gt;
[[File:E.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Travis-CI Build Testing===&lt;br /&gt;
Travis-CI Build Test of the beta branch after a refactored function is merged in the beta branch.&lt;br /&gt;
[[File:sc1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
2) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Project Mentors==&lt;br /&gt;
&lt;br /&gt;
Edward Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Mohit Jain (mjain6@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil (agovil@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal (asyal@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil (rrpatil3@ncsu.edu)&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125408</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125408"/>
		<updated>2019-10-26T22:40:37Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_response_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
===Test Plan===&lt;br /&gt;
There were refactoring changes made in the function. Testing was carried out to check the Cognitive, Cyclomatic, Perceived, Lines of Code and Assignment Branch Condition (ABC) size complexities of these functions. Rubocop was used to test these complexities of the functions. For these cases, RSpec testing, was also carried out using the original spec file and it showed no new errors. Also, Travis-CI build of each pull request merge was checked to ensure that the code is working properly after refactoring.&lt;br /&gt;
&lt;br /&gt;
===Rubocop Testing===&lt;br /&gt;
Rubocop testing results for &amp;quot;get_review_metrics&amp;quot; function after refactoring.&lt;br /&gt;
[[File:Webp.net-resizeimage.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_awarded_review_score&amp;quot; function after refactoring.&lt;br /&gt;
[[File:B.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_team_color&amp;quot; function after refactoring.&lt;br /&gt;
[[File:C.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_each_review_and_feedback_response_map&amp;quot; function after refactoring.&lt;br /&gt;
[[File:D.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_css_style_for_calibration_report&amp;quot; function after refactoring.&lt;br /&gt;
[[File:E.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Travis-CI Build Testing===&lt;br /&gt;
Travis-CI Build Test of the beta branch after a refactored function is merged in the beta branch.&lt;br /&gt;
[[File:sc1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
2) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Project Mentors==&lt;br /&gt;
&lt;br /&gt;
Edward Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Mohit Jain (mjain6@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil (agovil@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal (asyal@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil (rrpatil3@ncsu.edu)&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125407</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125407"/>
		<updated>2019-10-26T22:39:10Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_response_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
===Test Plan===&lt;br /&gt;
There were refactoring changes made in the function. Testing was carried out to check the Cognitive, Cyclomatic, Perceived, Lines of Code and Assignment Branch Condition (ABC) size complexities of these functions. Rubocop was used to test these complexities of the functions. For these cases, RSpec testing, was also carried out using the original spec file and it showed no new errors. Also, Travis-CI build of each pull request merge was checked to ensure that the code is working properly after refactoring.&lt;br /&gt;
&lt;br /&gt;
===Rubocop Testing===&lt;br /&gt;
Rubocop testing results for &amp;quot;get_review_metrics&amp;quot; function after refactoring.&lt;br /&gt;
[[File:Webp.net-resizeimage.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_awarded_review_score&amp;quot; function after refactoring.&lt;br /&gt;
[[File:B.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_team_color&amp;quot; function after refactoring.&lt;br /&gt;
[[File:C.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_each_review_and_feedback_response_map&amp;quot; function after refactoring.&lt;br /&gt;
[[File:D.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_css_style_for_calibration_report&amp;quot; function after refactoring.&lt;br /&gt;
[[File:E.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Travis-CI Build Testing===&lt;br /&gt;
Travis-CI Build Test of the beta branch after a refactored function is merged in the beta branch.&lt;br /&gt;
[[File:sc1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
2) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil (agovil@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal (asyal@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil (rrpatil3@ncsu.edu)&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Sc1.jpg&amp;diff=125405</id>
		<title>File:Sc1.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Sc1.jpg&amp;diff=125405"/>
		<updated>2019-10-26T22:37:42Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:Sc1.jpg&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Sc.jpeg&amp;diff=125402</id>
		<title>File:Sc.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Sc.jpeg&amp;diff=125402"/>
		<updated>2019-10-26T22:36:04Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125401</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125401"/>
		<updated>2019-10-26T22:34:53Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_response_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
===Test Plan===&lt;br /&gt;
There were refactoring changes made in the function. Testing was carried out to check the Cognitive, Cyclomatic, Perceived, Lines of Code and Assignment Branch Condition (ABC) size complexities of these functions. Rubocop was used to test these complexities of the functions. For these cases, RSpec testing, was also carried out using the original spec file and it showed no new errors. Also, Travis-CI build of each pull request merge was checked to ensure that the code is working properly after refactoring.&lt;br /&gt;
&lt;br /&gt;
===Rubocop Testing===&lt;br /&gt;
Rubocop testing results for &amp;quot;get_review_metrics&amp;quot; function after refactoring.&lt;br /&gt;
[[File:Webp.net-resizeimage.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_awarded_review_score&amp;quot; function after refactoring.&lt;br /&gt;
[[File:B.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_team_color&amp;quot; function after refactoring.&lt;br /&gt;
[[File:C.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_each_review_and_feedback_response_map&amp;quot; function after refactoring.&lt;br /&gt;
[[File:D.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_css_style_for_calibration_report&amp;quot; function after refactoring.&lt;br /&gt;
[[File:E.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Travis-CI Build Testing===&lt;br /&gt;
Travis-CI Build Test of the beta branch after a refactored function is merged in the beta branch.&lt;br /&gt;
[[File:sc.jpeg]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
2) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil (agovil@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal (asyal@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil (rrpatil3@ncsu.edu)&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125398</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125398"/>
		<updated>2019-10-26T22:31:27Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Rubocop Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_response_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
===Test Plan===&lt;br /&gt;
There were refactoring changes made in the function. Testing was carried out to check the Cognitive, Cyclomatic, Perceived, Lines of Code and Assignment Branch Condition (ABC) size complexities of these functions. Rubocop was used to test these complexities of the functions. For these cases, RSpec testing, was also carried out using the original spec file and it showed no new errors. Also, Travis-CI build of each pull request merge was checked to ensure that the code is working properly after refactoring.&lt;br /&gt;
&lt;br /&gt;
===Rubocop Testing===&lt;br /&gt;
Rubocop testing results for &amp;quot;get_review_metrics&amp;quot; function after refactoring.&lt;br /&gt;
[[File:Webp.net-resizeimage.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_awarded_review_score&amp;quot; function after refactoring.&lt;br /&gt;
[[File:B.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_team_color&amp;quot; function after refactoring.&lt;br /&gt;
[[File:C.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_each_review_and_feedback_response_map&amp;quot; function after refactoring.&lt;br /&gt;
[[File:D.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_css_style_for_calibration_report&amp;quot; function after refactoring.&lt;br /&gt;
[[File:E.png]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
2) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:E.png&amp;diff=125397</id>
		<title>File:E.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:E.png&amp;diff=125397"/>
		<updated>2019-10-26T22:30:50Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:D.png&amp;diff=125396</id>
		<title>File:D.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:D.png&amp;diff=125396"/>
		<updated>2019-10-26T22:30:40Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:C.png&amp;diff=125395</id>
		<title>File:C.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:C.png&amp;diff=125395"/>
		<updated>2019-10-26T22:30:29Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:C.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:C.png&amp;diff=125394</id>
		<title>File:C.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:C.png&amp;diff=125394"/>
		<updated>2019-10-26T22:30:07Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:B.png&amp;diff=125393</id>
		<title>File:B.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:B.png&amp;diff=125393"/>
		<updated>2019-10-26T22:29:47Z</updated>

		<summary type="html">&lt;p&gt;Agovil: something&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;something&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125391</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125391"/>
		<updated>2019-10-26T22:27:59Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Rubocop Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_response_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
===Test Plan===&lt;br /&gt;
There were refactoring changes made in the function. Testing was carried out to check the Cognitive, Cyclomatic, Perceived, Lines of Code and Assignment Branch Condition (ABC) size complexities of these functions. Rubocop was used to test these complexities of the functions. For these cases, RSpec testing, was also carried out using the original spec file and it showed no new errors. Also, Travis-CI build of each pull request merge was checked to ensure that the code is working properly after refactoring.&lt;br /&gt;
&lt;br /&gt;
===Rubocop Testing===&lt;br /&gt;
Rubocop testing results for &amp;quot;get_review_metrics&amp;quot; function after refactoring.&lt;br /&gt;
[[File:Webp.net-resizeimage.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_awarded_review_score&amp;quot; function after refactoring.&lt;br /&gt;
[[File:B.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_team_color&amp;quot; function after refactoring.&lt;br /&gt;
[[File:Webp.net-resizeimage (2).png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_each_review_and_feedback_response_map&amp;quot; function after refactoring.&lt;br /&gt;
[[File:Webp.net-resizeimage (3).png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_css_style_for_calibration_report&amp;quot; function after refactoring.&lt;br /&gt;
[[File:Webp.net-resizeimage (4).png]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
2) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Webp.net-resizeimage_(4).png&amp;diff=125389</id>
		<title>File:Webp.net-resizeimage (4).png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Webp.net-resizeimage_(4).png&amp;diff=125389"/>
		<updated>2019-10-26T22:24:53Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:Webp.net-resizeimage (4).png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Webp.net-resizeimage_(3).png&amp;diff=125388</id>
		<title>File:Webp.net-resizeimage (3).png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Webp.net-resizeimage_(3).png&amp;diff=125388"/>
		<updated>2019-10-26T22:24:45Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:Webp.net-resizeimage (3).png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Webp.net-resizeimage_(2).png&amp;diff=125387</id>
		<title>File:Webp.net-resizeimage (2).png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Webp.net-resizeimage_(2).png&amp;diff=125387"/>
		<updated>2019-10-26T22:24:37Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:Webp.net-resizeimage (2).png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Webp.net-resizeimage_(1).png&amp;diff=125386</id>
		<title>File:Webp.net-resizeimage (1).png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Webp.net-resizeimage_(1).png&amp;diff=125386"/>
		<updated>2019-10-26T22:24:28Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:Webp.net-resizeimage (1).png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:5.png&amp;diff=125385</id>
		<title>File:5.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:5.png&amp;diff=125385"/>
		<updated>2019-10-26T22:22:29Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:5.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:4.png&amp;diff=125384</id>
		<title>File:4.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:4.png&amp;diff=125384"/>
		<updated>2019-10-26T22:22:21Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:4.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:3.png&amp;diff=125383</id>
		<title>File:3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:3.png&amp;diff=125383"/>
		<updated>2019-10-26T22:22:12Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:3.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;IS-A and HAS-A Rules of Inheritance&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:2.png&amp;diff=125382</id>
		<title>File:2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:2.png&amp;diff=125382"/>
		<updated>2019-10-26T22:22:04Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:2.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Double diamond problem&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Webp.net-resizeimage.png&amp;diff=125381</id>
		<title>File:Webp.net-resizeimage.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Webp.net-resizeimage.png&amp;diff=125381"/>
		<updated>2019-10-26T22:19:11Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:Webp.net-resizeimage.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;resized flow diagram&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Screenshot_from_2019-10-25_14-16-57.png&amp;diff=125377</id>
		<title>File:Screenshot from 2019-10-25 14-16-57.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Screenshot_from_2019-10-25_14-16-57.png&amp;diff=125377"/>
		<updated>2019-10-26T22:13:03Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125376</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125376"/>
		<updated>2019-10-26T22:11:44Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_response_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
===Test Plan===&lt;br /&gt;
There were refactoring changes made in the function. Testing was carried out to check the Cognitive, Cyclomatic, Perceived, Lines of Code and Assignment Branch Condition (ABC) size complexities of these functions. Rubocop was used to test these complexities of the functions. For these cases, RSpec testing, was also carried out using the original spec file and it showed no new errors. Also, Travis-CI build of each pull request merge was checked to ensure that the code is working properly after refactoring.&lt;br /&gt;
&lt;br /&gt;
===Rubocop Testing===&lt;br /&gt;
Rubocop testing results for &amp;quot;get_review_metrics&amp;quot; function after refactoring.&lt;br /&gt;
[[File:1.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_awarded_review_score&amp;quot; function after refactoring.&lt;br /&gt;
[[File:2.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_team_color&amp;quot; function after refactoring.&lt;br /&gt;
[[File:3.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_each_review_and_feedback_response_map&amp;quot; function after refactoring.&lt;br /&gt;
[[File:4.png]]&lt;br /&gt;
&lt;br /&gt;
Rubocop testing results for &amp;quot;get_css_style_for_calibration_report&amp;quot; function after refactoring.&lt;br /&gt;
[[File:5.png]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
2) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:5.png&amp;diff=125372</id>
		<title>File:5.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:5.png&amp;diff=125372"/>
		<updated>2019-10-26T22:07:09Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:5.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:4.png&amp;diff=125371</id>
		<title>File:4.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:4.png&amp;diff=125371"/>
		<updated>2019-10-26T22:06:53Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:4.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:3.png&amp;diff=125370</id>
		<title>File:3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:3.png&amp;diff=125370"/>
		<updated>2019-10-26T22:06:30Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:3.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;IS-A and HAS-A Rules of Inheritance&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:2.png&amp;diff=125369</id>
		<title>File:2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:2.png&amp;diff=125369"/>
		<updated>2019-10-26T22:06:22Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:2.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Double diamond problem&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:1.png&amp;diff=125368</id>
		<title>File:1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:1.png&amp;diff=125368"/>
		<updated>2019-10-26T22:06:13Z</updated>

		<summary type="html">&lt;p&gt;Agovil: uploaded a new version of &amp;amp;quot;File:1.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distributed Version Control System&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125365</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125365"/>
		<updated>2019-10-26T21:55:20Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Refactoring */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_response_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
There were refactoring changes made in the function. Testing was carried out to check the Cognitive, Cyclomatic, Perceived, Lines of Code and Assignment Branch Condition (ABC) size complexities of these functions. Rubocop was used to test these complexities of the functions. For these cases, RSpec testing, was also carried out using the original spec file and it showed no new errors. Also, Travis-CI build of each pull request merge was checked to ensure that the code is working properly after refactoring.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
2) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125363</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125363"/>
		<updated>2019-10-26T21:47:51Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
There were refactoring changes made in the function. Testing was carried out to check the Cognitive, Cyclomatic, Perceived, Lines of Code and Assignment Branch Condition (ABC) size complexities of these functions. Rubocop was used to test these complexities of the functions. For these cases, RSpec testing, was also carried out using the original spec file and it showed no new errors. Also, Travis-CI build of each pull request merge was checked to ensure that the code is working properly after refactoring.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
2) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125331</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125331"/>
		<updated>2019-10-26T20:28:37Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Team Members */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
2) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal&lt;br /&gt;
&lt;br /&gt;
Rohan Rajesh Patil&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125329</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125329"/>
		<updated>2019-10-26T20:28:11Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
1) https://en.wikipedia.org/wiki/Cyclomatic_complexity&lt;br /&gt;
&lt;br /&gt;
2) https://docs.codeclimate.com/docs/cognitive-complexity&lt;br /&gt;
&lt;br /&gt;
3) https://en.wikipedia.org/wiki/ABC_Software_Metric&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
Aditya Govil&lt;br /&gt;
&lt;br /&gt;
Arshdeep Singh Syal&lt;br /&gt;
&lt;br /&gt;
Rohan Rahul Patil&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125323</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125323"/>
		<updated>2019-10-26T19:38:52Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Flowchart */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:flowchart.jpeg]]&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Flowchart.jpeg&amp;diff=125322</id>
		<title>File:Flowchart.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Flowchart.jpeg&amp;diff=125322"/>
		<updated>2019-10-26T19:37:59Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125319</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125319"/>
		<updated>2019-10-26T19:36:01Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:Steps for project.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had Cyclomatic, Perceived, Lines of Code and ABC size complexity. It was refactored by breaking the logical functionality into two sub functions and the main (get_team_color) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_map''' had high ABC size complexity. It was refactored by breaking the logical functionality into a sub function and the main (get_each_review_and_feedback_map) function.&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125311</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125311"/>
		<updated>2019-10-26T19:25:40Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Refactoring */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:Steps for project.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_team_color''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        color = []&lt;br /&gt;
        (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
          if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            color.push 'purple'&lt;br /&gt;
          else&lt;br /&gt;
            link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
            if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
              color.push 'green'&lt;br /&gt;
            else&lt;br /&gt;
              link_updated_at = get_link_updated_at(link)&lt;br /&gt;
              color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green'&lt;br /&gt;
            end&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        color[-1]&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_team_colour(response_map)&lt;br /&gt;
    assignment_created = @assignment.created_at&lt;br /&gt;
    assignment_due_dates = DueDate.where(parent_id: response_map.reviewed_object_id)&lt;br /&gt;
    if Response.exists?(map_id: response_map.id)&lt;br /&gt;
      if !response_map.try(:reviewer).try(:review_grade).nil?&lt;br /&gt;
        'brown'&lt;br /&gt;
      elsif response_for_each_round?(response_map)&lt;br /&gt;
        'blue'&lt;br /&gt;
      else&lt;br /&gt;
        obtain_team_colour(response_map,assignment_created,assignment_due_dates)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      'red'&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  # loops through the number of assignment review rounds and obains the team colour&lt;br /&gt;
  def obtain_team_colour(response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
    color = []&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    end&lt;br /&gt;
    color[-1]&lt;br /&gt;
  end&lt;br /&gt;
  # checks the submission state within each round and assigns team colour&lt;br /&gt;
  def check_submission_state(response_map, assignment_created, assignment_due_dates, round)&lt;br /&gt;
    if submitted_within_round?(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      color.push 'purple'&lt;br /&gt;
    else&lt;br /&gt;
      link = submitted_hyperlink(round, response_map, assignment_created, assignment_due_dates)&lt;br /&gt;
      if link.nil? or (link !~ %r{https*:\/\/wiki(.*)}) # can be extended for github links in future&lt;br /&gt;
        color.push 'green'&lt;br /&gt;
      else&lt;br /&gt;
        link_updated_at = get_link_updated_at(link)&lt;br /&gt;
        color.push link_updated_since_last?(round, assignment_due_dates, link_updated_at) ? 'purple' : 'green' &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_each_review_and_feedback_map''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                       instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_each_review_and_feedback_response_map(author)&lt;br /&gt;
    @team_id = TeamsUser.team_id(@id.to_i, author.user_id)&lt;br /&gt;
    # Calculate how many responses one team received from each round&lt;br /&gt;
    # It is the feedback number each team member should make&lt;br /&gt;
    @review_response_map_ids = ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and reviewee_id = ?&amp;quot;, @id, @team_id]).pluck(&amp;quot;id&amp;quot;)&lt;br /&gt;
    feedback_response_map_record(author)&lt;br /&gt;
    # rspan means the all peer reviews one student received, including unfinished one&lt;br /&gt;
    @rspan_round_one = @review_responses_round_one.length&lt;br /&gt;
    @rspan_round_two = @review_responses_round_two.length&lt;br /&gt;
    @rspan_round_three = @review_responses_round_three.nil? ? 0 : @review_responses_round_three.length&lt;br /&gt;
  end&lt;br /&gt;
  def feedback_response_map_record(author)&lt;br /&gt;
    {1 =&amp;gt; 'one', 2 =&amp;gt; 'two', 3 =&amp;gt; 'three'}.each do |key, round_num|&lt;br /&gt;
      instance_variable_set('@review_responses_round_' + round_num,&lt;br /&gt;
                            Response.where([&amp;quot;map_id IN (?) and round = ?&amp;quot;, @review_response_map_ids, key]))&lt;br /&gt;
      # Calculate feedback response map records&lt;br /&gt;
      instance_variable_set('@feedback_response_maps_round_' + round_num,&lt;br /&gt;
                            FeedbackResponseMap.where([&amp;quot;reviewed_object_id IN (?) and reviewer_id = ?&amp;quot;,&lt;br /&gt;
                                                      instance_variable_get('@all_review_response_ids_round_' + round_num), author.id]))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_css_style_for_calibration_report''' had ABC size complexity of 19. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5',1 =&amp;gt; 'c4',2 =&amp;gt; 'c3',3 =&amp;gt; 'c2'}&lt;br /&gt;
    if dict.key?(diff.abs)&lt;br /&gt;
      css_class = dict[diff.abs]&lt;br /&gt;
    else&lt;br /&gt;
      css_class = 'c1'&lt;br /&gt;
    end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_css_style_for_calibration_report(diff)&lt;br /&gt;
    # diff - difference between stu's answer and instructor's answer&lt;br /&gt;
    dict = {0 =&amp;gt; 'c5', 1 =&amp;gt; 'c4', 2 =&amp;gt; 'c3', 3 =&amp;gt; 'c2'}&lt;br /&gt;
    css_class = if dict.key?(diff.abs)&lt;br /&gt;
                  dict[diff.abs]&lt;br /&gt;
                else&lt;br /&gt;
                  css_class = 'c1'&lt;br /&gt;
                end&lt;br /&gt;
    css_class&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125305</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125305"/>
		<updated>2019-10-26T19:16:33Z</updated>

		<summary type="html">&lt;p&gt;Agovil: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:Steps for project.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_awarded_review_score''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and creating new variable for redundant computations. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id)&lt;br /&gt;
    (1..@assignment.num_review_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..@assignment.num_review_rounds).each do |round|&lt;br /&gt;
      if @review_scores[reviewer_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] &amp;amp;&amp;amp; @review_scores[reviewer_id][round][team_id] != -1.0&lt;br /&gt;
        instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, @review_scores[reviewer_id][round][team_id].inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''After:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_awarded_review_score(reviewer_id, team_id) &lt;br /&gt;
	num_rounds = @assignment.num_review_rounds&lt;br /&gt;
    (1..num_rounds).each {|round| instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, '-----') }&lt;br /&gt;
    (1..num_rounds).each do |round|&lt;br /&gt;
	  teamID = @review_scores.dig(reviewer_id, round, team_id)&lt;br /&gt;
      if teamID != nil &amp;amp;&amp;amp; teamID != -1.0&lt;br /&gt;
         instance_variable_set(&amp;quot;@score_awarded_round_&amp;quot; + round.to_s, teamID.inspect + '%')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125299</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125299"/>
		<updated>2019-10-26T19:05:44Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Refactoring */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:Steps for project.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The method '''get_review_metrics''' had cognitive complexity of 6 and ABC size complexity 25. It was refactored using .dig() function and removing .to_s function by changing the variable type. &lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&lt;br /&gt;
def get_review_metrics(round, team_id)&lt;br /&gt;
    %i[max min avg].each {|metric| instance_variable_set('@' + metric.to_s, '-----') }&lt;br /&gt;
    if @avg_and_ranges[team_id] &amp;amp;&amp;amp; @avg_and_ranges[team_id][round] &amp;amp;&amp;amp; %i[max min avg].all? {|k| @avg_and_ranges[team_id][round].key? k }&lt;br /&gt;
      %i[max min avg].each do |metric|&lt;br /&gt;
        metric_value = @avg_and_ranges[team_id][round][metric].nil? ? '-----' : @avg_and_ranges[team_id][round][metric].round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric.to_s, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After:'''&lt;br /&gt;
&lt;br /&gt;
  def get_review_metrics(round, team_id)&lt;br /&gt;
    ['max', 'min', 'avg'].each {|metric| instance_variable_set('@' + metric, '-----') }&lt;br /&gt;
    x = @avg_and_ranges.dig(team_id, round)&lt;br /&gt;
    if x &amp;amp;&amp;amp; %i[max min avg].all? {|k| x.key? k }&lt;br /&gt;
      ['max', 'min', 'avg'].each do |metric|&lt;br /&gt;
	average_metric = @avg_and_ranges.dig(team_id, round, metric)&lt;br /&gt;
        metric_value = average_metric.nil? ? '-----' : average_metric.round(0).to_s + '%'&lt;br /&gt;
        instance_variable_set('@' + metric, metric_value)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125297</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125297"/>
		<updated>2019-10-26T18:56:11Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;br /&gt;
&lt;br /&gt;
===Flowchart===&lt;br /&gt;
&lt;br /&gt;
The following process is carried out to complete the project-&lt;br /&gt;
&lt;br /&gt;
                                                                           [[File:Steps for project.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Refactoring method names====&lt;br /&gt;
All the method names that are refactored are mentioned below-&lt;br /&gt;
&lt;br /&gt;
'''Before:''' &lt;br /&gt;
&lt;br /&gt;
  get_each_round_review_and_feedback_response_map_for_feedback_report&lt;br /&gt;
&lt;br /&gt;
'''After:'''&lt;br /&gt;
&lt;br /&gt;
  get_each_review_and_feedback_response_map     ''[Since the method and file is already about feedback report, we do not need to put feedback_report in the method name]''&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125296</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125296"/>
		<updated>2019-10-26T18:52:33Z</updated>

		<summary type="html">&lt;p&gt;Agovil: /* Problem Statement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [https://codeclimate.com/github/expertiza/expertiza/pull/1498'''Code Climate'''].&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125295</id>
		<title>CSC/ECE 517 Fall 2019 - E1948. Refactor review mapping helper.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1948._Refactor_review_mapping_helper.rb&amp;diff=125295"/>
		<updated>2019-10-26T18:50:50Z</updated>

		<summary type="html">&lt;p&gt;Agovil: Created page with &amp;quot;==Introduction== This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.  ===Expertiza Background === Expertiza is ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
This page gives a description of the changes made for the ''review_mapping_helper.rb'' of Expertiza based OSS project.&lt;br /&gt;
&lt;br /&gt;
===Expertiza Background ===&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, codes, websites, etc). Instructors add and grade the assignments submitted by students to Expertiza. Students can be assigned in teams based on their selection of the topics. It has functionalities such as peer reviews in which students can provide feedback on other's work which helps peer in better developing the project. It is supported by the National Science Foundation.&lt;br /&gt;
&lt;br /&gt;
=== Problem Statement ===&lt;br /&gt;
&lt;br /&gt;
The review_mapping_helper.rb  has multiple functions with a high complexities namely - Cognitive, Perceived, Cyclomatic, Assignment Branch Condition size (ABC size) and Lines of Code (LOC). The review_mapping_helper.rb has methods which exceeds the limit on lines of code Also, it is missing proper comments for each functionality. Cyclomatic complexity of most of the methods is way too high as per the standard defined in the [Code Climate]https://codeclimate.com/github/expertiza/expertiza/pull/1498.&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019&amp;diff=125294</id>
		<title>CSC/ECE 517 Fall 2019</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019&amp;diff=125294"/>
		<updated>2019-10-26T18:39:32Z</updated>

		<summary type="html">&lt;p&gt;Agovil: new  page added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[CSC/ECE 517 Fall 2019 - Project E1947. Refactor quiz_questionnaire_controller.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2019 - Project E1965. Review report should link to the usual view for reviews]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2019 - E1972. OSS project J. Skellington: Accessing Assignment Rubrics]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2019 - E1971. OSS project Finklestein: Instructors &amp;amp; Institutions]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2019 - E1955.Write  unit tests for student_task.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2019 - E1954. Auto-generate submission directory names based on assignment names]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2019 - E1958. Two issues related to assignment management]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2019 - E1948. Refactor review_mapping_helper.rb]]&lt;/div&gt;</summary>
		<author><name>Agovil</name></author>
	</entry>
</feed>