Conversation
|
Thanks for opening a new PR! AI started to review it |
|
Your PR couldn't be matched to an assignment in this module. Please check its title is in the correct format, and that you only have one PR per assignment. If this PR is not coursework, please add the NotCoursework label (and message on Slack in #cyf-curriculum or it will probably not be noticed). If this PR needs reviewed, please add the 'Needs Review' label to this PR after you have resolved the issues listed above. |
1 similar comment
|
Your PR couldn't be matched to an assignment in this module. Please check its title is in the correct format, and that you only have one PR per assignment. If this PR is not coursework, please add the NotCoursework label (and message on Slack in #cyf-curriculum or it will probably not be noticed). If this PR needs reviewed, please add the 'Needs Review' label to this PR after you have resolved the issues listed above. |
| if(options.numberNonEmpty) { | ||
| //-b option: number non-empty lines | ||
| if(line.trim()) { | ||
| process.stdout.write( | ||
| `${String(globalLineCounter).padStart(6)}\t${line}\n` | ||
| ); | ||
| globalLineCounter++; | ||
| } else { | ||
| process.stdout.write('\n'); | ||
| } | ||
| } else if(options.numberAll) { | ||
| //-n option: number all lines | ||
| process.stdout.write( | ||
| `${String(globalLineCounter).padStart(6)}\t${line}\n` | ||
| ); | ||
| globalLineCounter++; | ||
| } else { | ||
| //default: just print the line | ||
| process.stdout.write(line + '\n'); | ||
| } |
There was a problem hiding this comment.
What differences and similarities do you notice in how each option prints lines? How might you avoid repeating the printing and formatting logic?
There was a problem hiding this comment.
I left a similar comment, but with a little more detail
| const showAll = args.includes('-a'); | ||
| const onePerLine = args.includes('-1'); |
There was a problem hiding this comment.
If someone else reads this code, would it be immediately obvious what 'showAll' or 'onePerLine' do? Is there a name you could choose that would make their purpose even clearer?
There was a problem hiding this comment.
@Droid-An These variable names look pretty reasonable to me as-is - WDYT?
There was a problem hiding this comment.
I also think the naming is fine - this feedback seems to be just informational. In the Coolify logs for the deployed app, the AI review output is logged, and this point is classified as 1 on a scale from 1 to 5, while the other points are classified as 2.
There was a problem hiding this comment.
Yeah, let's maybe filter out informational things.
When we have quality tracking in place, we could try letting in some % of informational comments to see if people find them useful (maybe leave 10% of informational comments, but gather feedback on which are useful). But this would be a future enhancement, not part of the initial project :)
| if(directories.length === 0) { | ||
| listDirectory(process.cwd(), showAll, onePerLine); | ||
| return; |
There was a problem hiding this comment.
Can you think of a way to remove this duplication so that the function for listing directories is always called in the same way, regardless of how many directories or files are provided?
There was a problem hiding this comment.
I left a similar comment to this 👍
| directories.forEach((arg, index) => { | ||
| try { | ||
| const stats = fs.statSync(arg); | ||
| if(stats.isDirectory()) { | ||
| //Print header if multiple directories are listed | ||
| if(directories.length > 1) console.log(`${arg}:`); | ||
|
|
||
| listDirectory(arg, showAll, onePerLine); | ||
| //add a blank line between directory listings if there are multiple directories | ||
| if(directories.length > 1 && index < directories.length - 1) console.log(''); |
There was a problem hiding this comment.
Can you think of a way to remove this duplication so that the function for listing directories is always called in the same way, regardless of how many directories or files are provided?
There was a problem hiding this comment.
@Droid-An This code looks pretty reasonable to me - do you know what it's trying to nudge towards?
There was a problem hiding this comment.
From the logs, it looks like this comment refers to the same point as the one above. I assume it simply specifies the lines where the problematic code appears. Since listDirectories is called twice, the ai posted two comments.
There was a problem hiding this comment.
Yeah, consolidating these down into just one comment (either at the first location, or in a line range that covers both) feels more useful?
| let totalCounts = { lines: 0, words: 0, bytes: 0 }; | ||
| const multipleFiles = files.length > 1; | ||
|
|
||
| files.forEach(file => { | ||
| try { | ||
| const content = fs.readFileSync(file, 'utf-8'); | ||
| const counts = countFileContent(content); | ||
|
|
||
| // Sum counts for total if multiple files | ||
| totalCounts.lines += counts.lines; | ||
| totalCounts.words += counts.words; | ||
| totalCounts.bytes += counts.bytes; |
There was a problem hiding this comment.
What might happen to the 'totalCounts' object if you only have one file? Does it ever get used? How could you make updating totals conditional on having more than one file?
There was a problem hiding this comment.
@Droid-An This comment feels contradictory - before the comments were saying "try not to special case the single-file case" and now it's saying "try to special case the single-file case"?
There was a problem hiding this comment.
yes, I agree. I think I need to promt ai to be more consistent
| const parts = []; | ||
| if(options.line) parts.push(counts.lines); | ||
| if(options.word) parts.push(counts.words); | ||
| if(options.byte) parts.push(counts.bytes); | ||
| //if no specific count options are provided, print all counts | ||
| if(!options.line && !options.word && !options.byte) { | ||
| //default is to print all counts | ||
| parts.push(counts.lines, counts.words, counts.bytes); | ||
| } | ||
| console.log(parts.join('\t'),filePath); |
There was a problem hiding this comment.
How would you design the code so that adding future options for 'wc' outputs would not require modifying existing code for every new output?
There was a problem hiding this comment.
@Droid-An I'm not sure this comment is specific enough? I guess this is trying to get at the same thing as CodeYourFuture/Module-Tools#376 (comment)?
There was a problem hiding this comment.
I think it's telling about lots of if else statements. Here is more detailed description of this issue from ai logs:
description: "Within the 'printCounts' function, you use several if-statements to determine what should be in the output, but the approach means you need to keep updating 'parts' for each new possible option. Have you thought about a way to build up the list of what to print based on the enabled options, or set the default in a way that avoids having to manually check and set each option for every output?",
| ); | ||
| globalLineCounter++; | ||
| } else { | ||
| //default: just print the line |
There was a problem hiding this comment.
Maybe the tool could have noticed this comment isn't very useful
| filePatterns.push(arg); | ||
| } | ||
| }); | ||
| // -b takes precedence over -n |
There was a problem hiding this comment.
Maybe the tool could have asked if there's a way to rewrite the code to not need this comment
There was a problem hiding this comment.
Interesting, I haven't thought about this, thanks for pointing it out
| // Check for options | ||
| const showAll = args.includes('-a'); | ||
| const onePerLine = args.includes('-1'); | ||
| //remove options from args |
There was a problem hiding this comment.
This comment feels unnecessary
| } | ||
| }); | ||
|
|
||
| // If multiple files, print total counts |
There was a problem hiding this comment.
This comment feels unnecessary
| }; | ||
| const filePatterns = []; | ||
|
|
||
| args.forEach((arg) => { |
There was a problem hiding this comment.
While it is possible to build an argument parser like this, my approach would be to prefer an argument parser specific library. Is the ai bot set up to recognise situations like this? I guess it is tricky because we don't want it to just suggest replacing the entire file with (in this case) a call to an existing cat tool, but using something like commander's program API might make this more readable.
There was a problem hiding this comment.
I think it depend on the goal of the assignment whether trainee supposed to build something from scratch or learn to use existing tools. Ai bot doesn't set up to give feedback on such situations. In this particular task I believe trainees should use commander, since it's covered in the prep for this backlog.
There was a problem hiding this comment.
Yeah, the bot is (currently) doing context-free reviews without knowing the assignments - if we want to include "are you solving the correct problem" style reviews, I'd punt that to a future feature request :)
No description provided.