Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add mass pruneable blocks #137

Merged
merged 6 commits into from
Feb 27, 2024
Merged

Conversation

enjinabner
Copy link
Contributor

@enjinabner enjinabner commented Feb 26, 2024

Type

enhancement, tests


Description

  • Added a new configuration option prune_blocks to specify the number of days to retain block data before pruning.
  • Updated the Block model to support mass pruning based on the new configuration.
  • Updated the BlockFactory to use a more flexible number generation for block numbers.
  • Added tests to verify the functionality of pruning blocks based on the new configuration.

Changes walkthrough

Relevant files
Enhancement
enjin-platform.php
Add Configuration for Pruning Blocks                                         

config/enjin-platform.php

  • Added configuration for pruning blocks with a default of 7 days.
+11/-0   
BlockFactory.php
Update Block Number Generation in Factory                               

database/factories/BlockFactory.php

  • Updated block number generation to use Faker's numberBetween method
    without specifying the upper limit.
  • +1/-1     
    Block.php
    Implement MassPrunable in Block Model                                       

    src/Models/Laravel/Block.php

  • Imported MassPrunable and Builder.
  • Implemented MassPrunable with a prunable method to define the pruning
    logic based on the configuration.
  • +17/-0   
    Tests
    PruneTest.php
    Add Tests for Pruning Expired Blocks                                         

    tests/Feature/Commands/PruneTest.php

  • Added tests for pruning expired blocks.
  • Ensured blocks are not pruned when configured not to.
  • +26/-0   

    PR-Agent usage:
    Comment /help on the PR to get a list of all available PR-Agent tools and their descriptions

    @enjinabner enjinabner added the enhancement New feature or request label Feb 26, 2024
    @enjinabner enjinabner self-assigned this Feb 26, 2024
    @github-actions github-actions bot added the tests label Feb 26, 2024
    Copy link

    PR Description updated to latest commit (4052eba)

    Copy link

    PR Review

         PR feedback                    
    ⏱️ Estimated effort to review [1-5]

    3, because the PR introduces a new feature with configuration changes, model updates, and tests. Reviewing the logic for pruning, configuration handling, and ensuring the tests cover the new functionality adequately requires a moderate level of effort.

    🧪 Relevant tests

    Yes

    🔍 Possible issues
    • The numberBetween method in BlockFactory.php is missing its second argument, which might lead to unexpected behavior or errors during block number generation.
    • The fallback condition in Block::prunable method might not be the most efficient way to handle cases where pruning is disabled. It's better to prevent the pruning operation altogether instead of running a query that intentionally returns no results.
    🔒 Security concerns

    No

    Code feedback:
    relevant filedatabase/factories/BlockFactory.php
    suggestion      

    Update the numberBetween method call to include both the minimum and maximum range for block number generation. For example, $this->faker->numberBetween(1, 1000). This ensures that the block numbers are generated within a specified range, avoiding potential issues with missing arguments. [important]

    relevant line'number' => $this->faker->numberBetween(1),

    relevant filesrc/Models/Laravel/Block.php
    suggestion      

    Consider adding a condition to directly return from the prunable method without querying the database if pruning is disabled ($days is null or zero). This can be more efficient than executing a query that is guaranteed to return no results. For example, if ($days <= 0) { return; } before the query logic. [medium]

    relevant lineif (!is_null($days = config('enjin-platform.prune_blocks'))) {


    ✨ Review tool usage guide:

    Overview:
    The review tool scans the PR code changes, and generates a PR review. The tool can be triggered automatically every time a new PR is opened, or can be invoked manually by commenting on any PR.
    When commenting, to edit configurations related to the review tool (pr_reviewer section), use the following template:

    /review --pr_reviewer.some_config1=... --pr_reviewer.some_config2=...
    

    With a configuration file, use the following template:

    [pr_reviewer]
    some_config1=...
    some_config2=...
    
    Utilizing extra instructions

    The review tool can be configured with extra instructions, which can be used to guide the model to a feedback tailored to the needs of your project.

    Be specific, clear, and concise in the instructions. With extra instructions, you are the prompter. Specify the relevant sub-tool, and the relevant aspects of the PR that you want to emphasize.

    Examples for extra instructions:

    [pr_reviewer] # /review #
    extra_instructions="""
    In the 'possible issues' section, emphasize the following:
    - Does the code logic cover relevant edge cases?
    - Is the code logic clear and easy to understand?
    - Is the code logic efficient?
    ...
    """
    

    Use triple quotes to write multi-line instructions. Use bullet points to make the instructions more readable.

    How to enable\disable automation
    • When you first install PR-Agent app, the default mode for the review tool is:
    pr_commands = ["/review", ...]
    

    meaning the review tool will run automatically on every PR, with the default configuration.
    Edit this field to enable/disable the tool, or to change the used configurations

    Auto-labels

    The review tool can auto-generate two specific types of labels for a PR:

    • a possible security issue label, that detects possible security issues (enable_review_labels_security flag)
    • a Review effort [1-5]: x label, where x is the estimated effort to review the PR (enable_review_labels_effort flag)
    Extra sub-tools

    The review tool provides a collection of possible feedbacks about a PR.
    It is recommended to review the possible options, and choose the ones relevant for your use case.
    Some of the feature that are disabled by default are quite useful, and should be considered for enabling. For example:
    require_score_review, require_soc2_ticket, and more.

    Auto-approve PRs

    By invoking:

    /review auto_approve
    

    The tool will automatically approve the PR, and add a comment with the approval.

    To ensure safety, the auto-approval feature is disabled by default. To enable auto-approval, you need to actively set in a pre-defined configuration file the following:

    [pr_reviewer]
    enable_auto_approval = true
    

    (this specific flag cannot be set with a command line argument, only in the configuration file, committed to the repository)

    You can also enable auto-approval only if the PR meets certain requirements, such as that the estimated_review_effort is equal or below a certain threshold, by adjusting the flag:

    [pr_reviewer]
    maximal_review_effort = 5
    
    More PR-Agent commands

    To invoke the PR-Agent, add a comment using one of the following commands:

    • /review: Request a review of your Pull Request.
    • /describe: Update the PR title and description based on the contents of the PR.
    • /improve [--extended]: Suggest code improvements. Extended mode provides a higher quality feedback.
    • /ask <QUESTION>: Ask a question about the PR.
    • /update_changelog: Update the changelog based on the PR's contents.
    • /add_docs 💎: Generate docstring for new components introduced in the PR.
    • /generate_labels 💎: Generate labels for the PR based on the PR's contents.
    • /analyze 💎: Automatically analyzes the PR, and presents changes walkthrough for each component.

    See the tools guide for more details.
    To list the possible configuration parameters, add a /config comment.

    See the review usage page for a comprehensive guide on using this tool.

    Copy link

    github-actions bot commented Feb 26, 2024

    PR Code Suggestions

    Suggestions                                                                                                                                                     
    bug
    Correct the usage of numberBetween by specifying both start and end range.

    It seems like the numberBetween method is called with only one argument, which might not
    be the intended usage as it requires at least two arguments (start and end range).
    Consider specifying both the start and end range for the numberBetween method to ensure it
    works as expected.

    database/factories/BlockFactory.php [25]

    -'number' => $this->faker->numberBetween(1),
    +'number' => $this->faker->numberBetween(1, 1000),
     
    Fix a typo in the configuration key to ensure the correct test behavior.     

    The test test_it_cannot_prune_expired_blocks sets a configuration for prune_expired_events
    instead of prune_blocks in its last part. This seems to be a typo. Correct the
    configuration key to ensure the test behaves as intended.

    tests/Feature/Commands/PruneTest.php [59]

    -config(['enjin-platform.prune_expired_events' => 0]);
    +config(['enjin-platform.prune_blocks' => 0]);
     
    performance
    Avoid unnecessary database interaction by returning an empty query when pruning is disabled.

    The prunable method currently returns a query that selects all records with an id of 0 if
    pruning is disabled. This approach is inefficient as it still performs a query. Consider
    returning an empty Builder instance instead to avoid unnecessary database interaction.

    src/Models/Laravel/Block.php [55]

    -return static::where('id', 0);
    +return static::query()->whereRaw('1 = 0');
     
    enhancement
    Document the PRUNE_BLOCKS configuration in the .env.example file.

    The configuration for prune_blocks uses the env function with a default value of 7 days.
    It's a good practice to also define this configuration in the application's .env.example
    file with a comment explaining its purpose, ensuring that other developers are aware of
    this configuration option and its default behavior.

    config/enjin-platform.php [241]

    -'prune_blocks' => env('PRUNE_BLOCKS', 7),
    +# Add to .env.example:
    +# PRUNE_BLOCKS=7 # Number of days to retain blocks data before pruning. Set to 0 or null to disable pruning.
     
    best practice
    Use Laravel's filled function for more robust configuration value checking.

    The prunable method uses a direct comparison to null to check if pruning is enabled. For
    better readability and to cover more edge cases (like empty strings), consider using
    Laravel's helper function filled to check if the prune_blocks configuration value is
    present and not empty.

    src/Models/Laravel/Block.php [51]

    -if (!is_null($days = config('enjin-platform.prune_blocks'))) {
    +if (filled($days = config('enjin-platform.prune_blocks'))) {
     

    ✨ Improve tool usage guide:

    Overview:
    The improve tool scans the PR code changes, and automatically generates suggestions for improving the PR code. The tool can be triggered automatically every time a new PR is opened, or can be invoked manually by commenting on a PR.
    When commenting, to edit configurations related to the improve tool (pr_code_suggestions section), use the following template:

    /improve --pr_code_suggestions.some_config1=... --pr_code_suggestions.some_config2=...
    

    With a configuration file, use the following template:

    [pr_code_suggestions]
    some_config1=...
    some_config2=...
    
    Enabling\disabling automation

    When you first install the app, the default mode for the improve tool is:

    pr_commands = ["/improve --pr_code_suggestions.summarize=true", ...]
    

    meaning the improve tool will run automatically on every PR, with summarization enabled. Delete this line to disable the tool from running automatically.

    Utilizing extra instructions

    Extra instructions are very important for the improve tool, since they enable to guide the model to suggestions that are more relevant to the specific needs of the project.

    Be specific, clear, and concise in the instructions. With extra instructions, you are the prompter. Specify relevant aspects that you want the model to focus on.

    Examples for extra instructions:

    [pr_code_suggestions] # /improve #
    extra_instructions="""
    Emphasize the following aspects:
    - Does the code logic cover relevant edge cases?
    - Is the code logic clear and easy to understand?
    - Is the code logic efficient?
    ...
    """
    

    Use triple quotes to write multi-line instructions. Use bullet points to make the instructions more readable.

    A note on code suggestions quality
    • While the current AI for code is getting better and better (GPT-4), it's not flawless. Not all the suggestions will be perfect, and a user should not accept all of them automatically.
    • Suggestions are not meant to be simplistic. Instead, they aim to give deep feedback and raise questions, ideas and thoughts to the user, who can then use his judgment, experience, and understanding of the code base.
    • Recommended to use the 'extra_instructions' field to guide the model to suggestions that are more relevant to the specific needs of the project, or use the custom suggestions 💎 tool
    • With large PRs, best quality will be obtained by using 'improve --extended' mode.
    More PR-Agent commands

    To invoke the PR-Agent, add a comment using one of the following commands:

    • /review: Request a review of your Pull Request.
    • /describe: Update the PR title and description based on the contents of the PR.
    • /improve [--extended]: Suggest code improvements. Extended mode provides a higher quality feedback.
    • /ask <QUESTION>: Ask a question about the PR.
    • /update_changelog: Update the changelog based on the PR's contents.
    • /add_docs 💎: Generate docstring for new components introduced in the PR.
    • /generate_labels 💎: Generate labels for the PR based on the PR's contents.
    • /analyze 💎: Automatically analyzes the PR, and presents changes walkthrough for each component.

    See the tools guide for more details.
    To list the possible configuration parameters, add a /config comment.

    See the improve usage page for a more comprehensive guide on using this tool.

    Copy link
    Contributor

    @v16Studios v16Studios left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Great work :) Most of the PR suggestions that were generated all look sensible to me, maybe get them in too 👍🏻

    @enjinabner
    Copy link
    Contributor Author

    Great work :) Most of the PR suggestions that were generated all look sensible to me, maybe get them in too 👍🏻

    Avoid unnecessary database interaction by returning an empty query when pruning is disable

    This suggestion was not implemented, because of how the trait was coded

    @enjinabner enjinabner merged commit 0a1db99 into master Feb 27, 2024
    7 checks passed
    @enjinabner enjinabner deleted the feature/pla-1637/add-pruneable-blocks branch February 27, 2024 21:56
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Development

    Successfully merging this pull request may close these issues.

    3 participants