Red Green Repeat Adventures of a Spec Driven Junkie
Understanding assignment branch condition.
Recently, I integrated Rubocop into my work flow and it’s been very humbling. I feel I’m a great coder with all the specs passing and doing a good job of refactoring, Rubocop always finds something wrong with my code.
I usually go back and make fixes based on Rubocop’s suggestions, but I keep running into the same few issues and solving them isn’t as easy as using: rubocop -a (which auto-corrects all the easy ones!)
The toughest offense for me so far: Assignment Branch Condition
This offense is harder to fix really make me think about my coding style in general. I want to learn more about this offense to help me understand. By understanding, my goals is to not make this offense so often and/or make it easier for me to fix in the future.

What is: ABC?
Rubocop message:
The default is 15 and the first pass of my code is always way past this, probably on average twice this value. So cleaning up my code to meet the default value really takes a lot of work.
From the documentation :
Really Understanding: ABC
Let’s understand what ABC is by checking out the definition of ABC :
Broken down:
- assignments (anything with = )
- branches (anything that jumps out of the current method)
- conditionals (anything that tests logic if , case , unary ? )
SO, to reduce the ABC value, reduce assignments (use less intermediate variables), fewer branches (calling other methods), and conditionals (if/else statements).
Computing ABC
The ABC value is not just a counting of them, but a square root of the sum of their squares. If any one of them getting too high will spike the ABC count.
The Rubocop default for ABC metric is 15. What does 15 really mean?
Well, doing the math, to get an ABC score of 15, a method would have:
- 8 assignments
- 8 conditionals
(Just working backwards from 15*15 => 225; 225/3 => 75; Math.sqrt(75) ~=> 8.66)
Now that I lay it out that way, an ABC value of 15 is very reasonable. Having eight of each for a method is just enough to do a lot of work in a method, but a value of 15 keeps the method from spiraling out of control in assignments, branches, or conditionals.
Whenever I encountered Rubocop’s ‘ABC is too high’ message, I was annoyed with ABC metric because I didn’t understand how it was computed and I couldn’t refactor efficiently to lower the ABC value quickly.
Now that I spent some effort into researching what Assignment Branch Condition really means, I feel better about creating or refactoring code that has a better ABC score.

DEV Community

Posted on Jun 26, 2020 • Updated on Aug 3, 2020 • Originally published at thedevpost.com
11 Most Asked Questions About RuboCop
RuboCop is a Ruby static code analyzer and code formatter which helps to track errors easily and fix minor code issues during the development process saving your time. It has many advantages and you can learn more about RuboCop on https://docs.rubocop.org/en/stable/ .
Today, we will be talking about the most asked questions about RuboCop.
1. How to check if record exists from controller in Rails
How to test if at least one record exists?
Option 1: Using .exists?
Option 2: Using .present? (or .blank? , the opposite of .present? )
Option 3: Variable assignment in the if statement
This option can be considered a code smell by some linters (RuboCop for example).
Option 3b: Variable assignment
You can also use .find_by_user_id(current_user.id) instead of .where(...).first
Best option:
- If you don’t use the Business object(s): Option 1
- If you need to use the Business object(s): Option 3
Alternative Answer:
In this case, you can use the exists? method provided by ActiveRecord:
2. How to ignore lines with comments?
There is a way to ignore cops on a per-line basis.
There is also a way to do it via the configuration file.
Run rubocop --auto-gen-config and it will generate a file that you can use to disable the offenses.
The command also gives a hint on what to do to load those options.
On a line per line basis, you can enable and disable the cops as well.
You can also do more than one rule at a time in your code.
By using an inline directive, the directive becomes valid only for that line, and it would look like this:
It’s possible to define regex patterns to automatically ignore certain lines in rubocop.yml , so you could choose to ignore all lines starting with a # character:
This could be improved so that “indented” comment lines (i.e. whitespace followed by a # character) is also ignored if that’s what you want.
Note that this doesn’t account for lines of code that end with a comment, though:
3. How to split Ruby regex over multiple lines?
You need to use the /x modifier, which enables free-spacing mode.
Like in this case:
Using %r with the x option is the preferred way to do this.
See this example from the GitHub ruby style guide
4. RuboCop: Line is too long ← How to Ignore?
You can disable a bunch of lines like this:
Or add this to your .rubocop.yml file to increase the max length:
Creating a .rubocop.yml file (keep an eye on the initial . in the filename) in the root of your project, you’ll have a bunch of options:
5. What is meant by ‘Assignment Branch Condition Size too high’ and how to fix it?
Assignment Branch Condition (ABC) size is a measurement of the size of a method. It is essentially determined by counting the number of A ssignments, B ranches, and C onditional statements.
To reduce the ABC score, you could move some of those assignments into before_action calls:
6. How to tell RuboCop to ignore a specific directory or file?
You can add the following to .rubocop.yml:
where the path is relative to .rubocop.yml
From rubocop/default.yml :
7. How to integrate RuboCop with Rake?
The simple answer is just adding this to your Rakefile:
As of version 0.10.0 RuboCop contains a custom rake task that you can use. Just put the following in your Rakefile
Make sure to use upper-case ‘R’ and ‘C’ or you will get a NameError.
8. How to silence RuboCop warning on Assignment Branch Condition?
This is the message for the Metrics/AbcSize cop.
# rubocop:disable Metrics/AbcSize
On your RuboCop config
9. How to disable frozen string literal comment checking?
Add the following to your .rubocop.yml :
10. How to pass &:key as an argument to map instead of a block with Ruby?
Pass &:key as an argument to map instead of a block.
11. How to fix "SublimeLinter-RuboCop not running even when enabled and RuboCop in the path"?
First, specify the right path for you ruby env in Packages/User/SublimeLinter.sublime-settings as this:
After that close sublime completely and reopen it.
In Conclusion
These are the most asked questions about the RuboCop. If you have any suggestions or any confusion, please comment below. If you need any help, we will be glad to help you.
We, at Truemark , provide services like web and mobile app development, digital marketing, and website development. So, if you need any help and want to work with us, please feel free to contact us.
Hope this article helped you.
Original Source: DevPostbyTruemark
Top comments (0)

Templates let you quickly answer FAQs or store snippets for re-use.
Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink .
Hide child comments as well
For further actions, you may consider blocking this person and/or reporting abuse

Rails GraphQL authentication from scratch #2
Alexey Poimtsev - Sep 25


Object-Oriented Ruby Programming: A Beginner's Guide
Minchul An - Sep 24
Rails GraphQL authentication from scratch #1
Alexey Poimtsev - Sep 22

Local snapshots
Stephen Margheim - Sep 22
Once suspended, truemark will not be able to comment or publish posts until their suspension is removed.
Once unsuspended, truemark will be able to comment and publish posts again.
Once unpublished, all posts by truemark will become hidden and only accessible to themselves.
If truemark is not suspended, they can still re-publish their posts from their dashboard.
Once unpublished, this post will become invisible to the public and only accessible to KiranPoudel98.
They can still re-publish the post if they are not suspended.
Thanks for keeping DEV Community safe. Here is what you can do to flag truemark:
truemark consistently posts content that violates DEV Community's code of conduct because it is harassing, offensive or spammy.
Unflagging truemark will restore default visibility to their posts.

We're a place where coders share, stay up-to-date and grow their careers.
What is meant by 'Assignment Branch Condition Size too high' and how to fix it?
In my Rails app, I use Rubocop to check for problems. Today it gave me an error like this : Assignment Branch Condition size for show is too high . Here's my code :
What does this mean and how can I fix it?

- 13 A brief search uncovers [this](http://c2.com/cgi/wiki?AbcMetric). It's a `rubocop`'s formal way of saying "your method does too much". – D-side Jun 19 '15 at 08:11
- Are all of the defined variables be used in the rendering? – Antarr Byrd Jun 19 '15 at 15:20
Conditional branching: if, '?'
Sometimes, we need to perform different actions based on different conditions.
To do that, we can use the if statement and the conditional operator ? , that’s also called a “question mark” operator.
The “if” statement
The if(...) statement evaluates a condition in parentheses and, if the result is true , executes a block of code.
For example:
In the example above, the condition is a simple equality check ( year == 2015 ), but it can be much more complex.
If we want to execute more than one statement, we have to wrap our code block inside curly braces:
We recommend wrapping your code block with curly braces {} every time you use an if statement, even if there is only one statement to execute. Doing so improves readability.
Boolean conversion
The if (…) statement evaluates the expression in its parentheses and converts the result to a boolean.
Let’s recall the conversion rules from the chapter Type Conversions :
- A number 0 , an empty string "" , null , undefined , and NaN all become false . Because of that they are called “falsy” values.
- Other values become true , so they are called “truthy”.
So, the code under this condition would never execute:
…and inside this condition – it always will:
We can also pass a pre-evaluated boolean value to if , like this:
The “else” clause
The if statement may contain an optional else block. It executes when the condition is falsy.
Several conditions: “else if”
Sometimes, we’d like to test several variants of a condition. The else if clause lets us do that.
In the code above, JavaScript first checks year < 2015 . If that is falsy, it goes to the next condition year > 2015 . If that is also falsy, it shows the last alert .
There can be more else if blocks. The final else is optional.
Conditional operator ‘?’
Sometimes, we need to assign a variable depending on a condition.
For instance:
The so-called “conditional” or “question mark” operator lets us do that in a shorter and simpler way.
The operator is represented by a question mark ? . Sometimes it’s called “ternary”, because the operator has three operands. It is actually the one and only operator in JavaScript which has that many.
The syntax is:
The condition is evaluated: if it’s truthy then value1 is returned, otherwise – value2 .
Technically, we can omit the parentheses around age > 18 . The question mark operator has a low precedence, so it executes after the comparison > .
This example will do the same thing as the previous one:
But parentheses make the code more readable, so we recommend using them.
In the example above, you can avoid using the question mark operator because the comparison itself returns true/false :
Multiple ‘?’
A sequence of question mark operators ? can return a value that depends on more than one condition.
It may be difficult at first to grasp what’s going on. But after a closer look, we can see that it’s just an ordinary sequence of tests:
- The first question mark checks whether age < 3 .
- If true – it returns 'Hi, baby!' . Otherwise, it continues to the expression after the colon “:”, checking age < 18 .
- If that’s true – it returns 'Hello!' . Otherwise, it continues to the expression after the next colon “:”, checking age < 100 .
- If that’s true – it returns 'Greetings!' . Otherwise, it continues to the expression after the last colon “:”, returning 'What an unusual age!' .
Here’s how this looks using if..else :
Non-traditional use of ‘?’
Sometimes the question mark ? is used as a replacement for if :
Depending on the condition company == 'Netscape' , either the first or the second expression after the ? gets executed and shows an alert.
We don’t assign a result to a variable here. Instead, we execute different code depending on the condition.
It’s not recommended to use the question mark operator in this way.
The notation is shorter than the equivalent if statement, which appeals to some programmers. But it is less readable.
Here is the same code using if for comparison:
Our eyes scan the code vertically. Code blocks which span several lines are easier to understand than a long, horizontal instruction set.
The purpose of the question mark operator ? is to return one value or another depending on its condition. Please use it for exactly that. Use if when you need to execute different branches of code.
if (a string with zero)
Will alert be shown?
Yes, it will.
Any string except an empty one (and "0" is not empty) becomes true in the logical context.
We can run and check:
The name of JavaScript
Using the if..else construct, write the code which asks: ‘What is the “official” name of JavaScript?’
If the visitor enters “ECMAScript”, then output “Right!”, otherwise – output: “You don’t know? ECMAScript!”
Demo in new window
Show the sign
Using if..else , write the code which gets a number via prompt and then shows in alert :
- 1 , if the value is greater than zero,
- -1 , if less than zero,
- 0 , if equals zero.
In this task we assume that the input is always a number.
Rewrite 'if' into '?'
Rewrite this if using the conditional operator '?' :
Rewrite 'if..else' into '?'
Rewrite if..else using multiple ternary operators '?' .
For readability, it’s recommended to split the code into multiple lines.
- If you have suggestions what to improve - please submit a GitHub issue or a pull request instead of commenting.
- If you can't understand something in the article – please elaborate.
- To insert few words of code, use the <code> tag, for several lines – wrap them in <pre> tag, for more than 10 lines – use a sandbox ( plnkr , jsbin , codepen …)
Lesson navigation
- © 2007—2023 Ilya Kantor
- about the project
- terms of usage
- privacy policy
Fix Rubocop issues
The current .rubocop_todo.yml file is ignoring alot of problems. We should fix these problems and ideally the todo should be zero or close to it.

IMAGES
COMMENTS
Assignment Branch Condition (ABC) size is a measurement of the size of a method. It is essentially determined by counting the number of A ssignments, B ranches, and C onditional statements. (more detail..)
Assignment Branch Condition size for [method] is too high The default is 15 and the first pass of my code is always way past this, probably on average twice this value. So cleaning up my code to meet the default value really takes a lot of work. From the documentation:
5 Answers Sorted by: 11 The ABC size is calculated by doing the following: √ (assignments² + branches² + conditionals²) Let's first have a look at the assignments: result = [] ip = x [/^.* - -/] datetime = x [/ [\ [].* [\]]/] address = x [/T .* H/] This leaves us with 4 assignments. Next up the branches.
1. How to check if record exists from controller in Rails Answer: How to test if at least one record exists? Option 1: Using .exists? if Business.exists? (user_id: current_user.id) # same as Business.where (user_id: current_user.id).exists? # ... else # ... end Option 2: Using .present? (or .blank?, the opposite of .present?)
'Assignment Branch Condition size for %s is too high. [%.4g/%.4g]' BRANCH_NODES = [:send] CONDITION_NODES = CyclomaticComplexity :: COUNTED_NODES Constants included from Util Util::ASGN_NODES, Util::EQUALS_ASGN_NODES, Util::OPERATOR_METHODS, Util::PROC_NEW_NODE, Util::SHORTHAND_ASGN_NODES Instance Attribute Summary Attributes inherited from Cop
Assignment Branch Condition size is a synthetic metric which helps us understand the size of the source code from a structural point of view, i.e. without looking at superficial things like the sheer amount of code. It is computed by counting the number of assignments, branches and conditions for a given section of code. These are - slightly counterintuitively - defined as:
Assignment Branch Condition size for call is too high. [<5, 28, 4> 28.72/17] The <5, 28, 4> is your <Assignments, Branches, Conditionals>, as described in this article. The overall score is calculated like this: sqrt (5^2 + 28^2 + 4^2) = 28.72 The default maximum score for the cop is 17.
My code is working correctly, but is resulting in a "Assignment branch condition too high" warning with a score of 12.08 on CodeBeat. Codebeat is an automated code review utility that helps developers write clean code. I have been using it lately in order to monitor the quality of my code since clean code is being a necessity in today's word.
Assignment Branch Condition (ABC) size is a measurement of the size of a method. It is essentially determined by counting the number of Assignments, Branches, and Conditional statements. (more detail..) To reduce ABC score, you could move some of those assignments into before_action calls:
Resolved: What is 'Assignment Branch Condition Size too high' and how to fix it? - Question: In my Rails app, I tried to run Rubocop to check for problems. It gave me an error like this : Assignment Branch Condition size for show is too 0 Oracle/SQL Programing Language Javascript C Language Javascript Python PHP Redis Selenium Cloud Troubleshoot
1 - move the require statements to the top of your file. It's clearer when they're there. Rubocop may be counting them as function calls as well. 2 - split out ARGV in a main method and pass in only the arguments you need. You should have a dedicated function parsing ARGV. It shouldn't be in the middle of a function like this.
A more complete example would be more helpful as the way the variables x, a, b and cond are accessed can play a role. If they are global variables declared outside the function that performs the conditional assignment then they will be accessed using loads and stores, which the compiler may deem to be too expensive to execute conditionally.
December 7, 2022 Conditional branching: if, '?' Sometimes, we need to perform different actions based on different conditions. To do that, we can use the if statement and the conditional operator ?, that's also called a "question mark" operator. The "if" statement
The condition type of a conditional branch instruction is indicated by a suffix, which is listed in Table 5.58. These suffixes are also used for conditional execution operations (see Section 5.14.6). Conditional branch instructions (Table 5.57, where <cond> is one of the condition suffixes) are available in 16-bit and 32-bit versions. The 16 ...
The CALL and RET instructions aren't conditional and aren't considered either a branch or a jump. They're part of a larger group of instructions call control transfer instructions that include branches/jumps. - Ross Ridge. Mar 30, 2017 at 20:28 ... they cause software interrupts when a condition is met, but they're never used in modern x86 ...
To set this up, a Test Build task is created. A Conditional Branching task is used to define two conditional rules. The first condition is specified to state that if the Task Status is set to "Passed", the release task will be implemented. If the task status is set to "Failed", the task for assessing the business requirements is ...
#33 An error occurred while fetching the assigned iteration of the selected issue. Fix Rubocop issues Open Issue created 3 years ago by Cody West The current .rubocop_todo.yml file is ignoring alot of problems. We should fix these problems and ideally the todo should be zero or close to it.