-
Notifications
You must be signed in to change notification settings - Fork 89
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
feat: [#280] Refactor database migrate - optimize make:migration command #606
Conversation
WalkthroughThe recent changes enhance the migration framework by introducing a comprehensive package for managing database schemas and drivers. Key improvements include the establishment of interfaces for schema and migration management, the implementation of default and SQL drivers, and schema functionalities integrated into the service provider. Additionally, new test suites validate functionality, contributing to a robust architecture for effectively handling database migrations. Changes
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (invoked as PR comments)
Additionally, you can add CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 6
Outside diff range, codebase verification and nitpick comments (1)
database/migration/default_driver.go (1)
66-68
: Consider error handling foros.Getwd
.Currently, the error from
os.Getwd
is ignored. Consider handling it to avoid potential issues.Use this diff to handle the error:
- pwd, _ := os.Getwd() + pwd, err := os.Getwd() + if err != nil { + return "" + }
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files ignored due to path filters (6)
mocks/database/migration/Driver.go
is excluded by!mocks/**
mocks/database/schema/Blueprint.go
is excluded by!mocks/**
mocks/database/schema/Migration.go
is excluded by!mocks/**
mocks/database/schema/Schema.go
is excluded by!mocks/**
mocks/foundation/Application.go
is excluded by!mocks/**
mocks/foundation/Container.go
is excluded by!mocks/**
Files selected for processing (17)
- contracts/database/migration/migration.go (1 hunks)
- contracts/database/schema/blueprint.go (1 hunks)
- contracts/database/schema/schema.go (1 hunks)
- contracts/foundation/container.go (2 hunks)
- database/console/migrate_creator.go (5 hunks)
- database/console/migrate_make_command.go (2 hunks)
- database/migration/default_driver.go (1 hunks)
- database/migration/default_driver_test.go (1 hunks)
- database/migration/schema.go (1 hunks)
- database/migration/sql_driver.go (1 hunks)
- database/migration/sql_driver_test.go (1 hunks)
- database/migration/stubs.go (1 hunks)
- database/migration/table_guesser.go (1 hunks)
- database/migration/table_guesser_test.go (1 hunks)
- database/service_provider.go (2 hunks)
- facades/schema.go (1 hunks)
- foundation/container.go (2 hunks)
Files skipped from review due to trivial changes (4)
- contracts/database/migration/migration.go
- contracts/database/schema/blueprint.go
- database/migration/table_guesser.go
- database/migration/table_guesser_test.go
Additional comments not posted (22)
facades/schema.go (1)
7-9
: LGTM!The
Schema
function correctly retrieves a schema instance using dependency injection.contracts/database/schema/schema.go (2)
3-16
: Interfaces are well-defined.The
Schema
interface provides a clear contract for schema operations. Consider implementing or removing commented-out methods if not needed.
18-27
: Interfaces are well-defined.The
Migration
interface provides a clear contract for migration operations.database/service_provider.go (2)
14-14
: LGTM!The addition of
BindingSchema
enhances the service provider's capabilities by allowing schema management.
32-34
: LGTM!The registration of the schema singleton is correctly implemented.
database/migration/default_driver.go (2)
21-41
: LGTM!The
Create
method is well-structured, handling file creation and template population.
71-73
: LGTM!The
getFileName
method correctly formats the file name with a timestamp.database/console/migrate_make_command.go (2)
62-72
: Ensure all migration drivers are covered.The switch statement handles
DriverDefault
andDriverSql
. Ensure that all necessary drivers are covered and consider logging unsupported drivers for better debugging.Consider adding logging for unsupported drivers:
default: fmt.Printf("Unsupported migration driver: %s\n", driver) return fmt.Errorf("unsupported migration driver: %s", driver)
75-75
: Check error handling for migration creation.Ensure that the error returned by
migrationDriver.Create(name)
is properly logged or handled to aid in debugging.Consider adding logging for errors:
if err := migrationDriver.Create(name); err != nil { fmt.Printf("Error creating migration: %s\n", err) return err }database/console/migrate_creator.go (4)
Line range hint
26-42
: Appropriate use of pointer receiver.Using a pointer receiver allows the method to modify the receiver's state, which is appropriate for this method.
Line range hint
46-76
: Clear and correct stub retrieval logic.The method correctly references the
migration
package for stub retrieval, improving clarity and maintainability.
Line range hint
81-89
: Correct and efficient placeholder population.The method efficiently populates placeholders in the stub, ensuring correct configuration values are used.
Line range hint
92-99
: Correct path construction logic.The method constructs the migration file path correctly, using the current working directory and formatted timestamps.
database/migration/sql_driver.go (4)
25-47
: Ensure robust error handling inCreate
method.The
Create
method should handle errors robustly, especially when dealing with file operations.Consider adding logging for errors:
if err := file.Create(r.getPath(name, "up"), r.populateStub(upStub, table)); err != nil { fmt.Printf("Error creating up.sql: %s\n", err) return err } if err := file.Create(r.getPath(name, "down"), r.populateStub(downStub, table)); err != nil { fmt.Printf("Error creating down.sql: %s\n", err) return err }
49-82
: Correct stub retrieval logic.The method correctly retrieves stubs based on the database driver and operation type, ensuring accurate migration templates.
84-93
: Efficient placeholder population inpopulateStub
.The method efficiently replaces placeholders in the stub with configuration values, ensuring correct migration scripts.
95-100
: Correct path construction ingetPath
.The method constructs the migration file path correctly, using the current working directory and formatted timestamps.
database/migration/default_driver_test.go (1)
14-127
: Comprehensive test coverage forDefaultDriverCreate
.The test cases comprehensively cover various migration scenarios, ensuring the
Create
method functions as expected.contracts/foundation/container.go (1)
74-75
: Appropriate addition ofMakeSchema
method.The
MakeSchema
method aligns with theContainer
interface's purpose, enhancing its functionality by managing schema-related operations.database/migration/stubs.go (1)
1-90
: LGTM!The restructuring of the codebase and the introduction of the
Stubs
type with methods for migration templates are well-structured and improve maintainability.database/migration/sql_driver_test.go (1)
1-209
: LGTM!The test cases are comprehensive and well-structured, providing thorough coverage for different database types and scenarios.
foundation/container.go (1)
259-267
: LGTM!The addition of the
MakeSchema
method is well-implemented and aligns with the existing design pattern for instance creation.
func (r *Schema) Create(table string, callback func(table schema.Blueprint)) error { | ||
//TODO implement me | ||
panic("implement me") | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reminder: Implement the Create
method.
The method is currently a placeholder with a TODO comment and a panic statement.
Would you like assistance in implementing this method?
func (r *Schema) Connection() schema.Schema { | ||
//TODO implement me | ||
panic("implement me") | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reminder: Implement the Connection
method.
The method is currently a placeholder with a TODO comment and a panic statement.
Would you like assistance in implementing this method?
func (r *Schema) Register(migrations []schema.Migration) { | ||
//TODO implement me | ||
panic("implement me") | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reminder: Implement the Register
method.
The method is currently a placeholder with a TODO comment and a panic statement.
Would you like assistance in implementing this method?
func (r *Schema) Table(table string, callback func(table schema.Blueprint)) error { | ||
//TODO implement me | ||
panic("implement me") | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reminder: Implement the Table
method.
The method is currently a placeholder with a TODO comment and a panic statement.
Would you like assistance in implementing this method?
` | ||
} | ||
|
||
// TODO add the facades.Schema().Create() method |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reminder: Implement facades.Schema().Create()
method.
The TODO comment indicates that this method needs to be added to complete the functionality.
Do you want me to generate a stub for this method or open a GitHub issue to track this task?
` | ||
} | ||
|
||
// TODO add the facades.Schema().Table() method |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reminder: Implement facades.Schema().Table()
method.
The TODO comment indicates that this method needs to be added to complete the functionality.
Do you want me to generate a stub for this method or open a GitHub issue to track this task?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files selected for processing (1)
- database/console/migrate_make_command_test.go (1 hunks)
Additional comments not posted (8)
database/console/migrate_make_command_test.go (8)
26-29
: Good practice: Use ofbeforeEach
function.The
beforeEach
function effectively initializes mock objects, reducing redundancy and improving test readability.
31-34
: Good practice: Use ofafterEach
function.The
afterEach
function ensures that all expectations on mock objects are verified, which is crucial for maintaining test integrity.
36-41
: Well-structured test case definition.The use of a structured slice of structs for test cases enhances readability and maintainability, making it easier to add or modify tests.
42-50
: Comprehensive test for empty migration name.The test correctly handles the scenario where the migration name is empty, ensuring that the appropriate error is returned.
51-61
: Thorough test for default driver scenario.The test case for the default driver ensures that the migration file is created as expected, verifying the integration with the file system.
63-78
: Comprehensive test for SQL driver scenario.The test case for the SQL driver covers multiple configuration settings and checks for both
up
anddown
migration files, ensuring robust coverage.
82-94
: Efficient test execution loop.The loop over test cases is efficiently handled, with clear separation of setup, execution, and assertion phases.
96-96
: Clean-up operation withfile.Remove
.The use of
file.Remove
to clean up after tests is a good practice to ensure no residual files affect subsequent tests.
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #606 +/- ##
==========================================
+ Coverage 69.53% 70.07% +0.53%
==========================================
Files 181 184 +3
Lines 11121 11241 +120
==========================================
+ Hits 7733 7877 +144
+ Misses 2811 2784 -27
- Partials 577 580 +3 ☔ View full report in Codecov by Sentry. |
📑 Description
Issue: goravel/goravel#280
make:migration
command, supports two drivers:default
andsql
.facades.Schema()
.Summary by CodeRabbit
New Features
Schema
interface for structured management of database schemas and migrations.DefaultDriver
for dynamic creation of migration files.SqlDriver
for managing SQL migrations with specific templates for various databases.MigrateMakeCommand
with a driver-based approach for migration creation.Bug Fixes
Documentation
DefaultDriver
,SqlDriver
, andMigrateMakeCommand
, ensuring correct functionality and file generation.Chores
✅ Checks