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

refactor(lang): update convention for keys and values naming #2660

Merged
merged 9 commits into from
Nov 8, 2024

Conversation

bengineer42
Copy link
Contributor

@bengineer42 bengineer42 commented Nov 8, 2024

Description

Related issue

Tests

  • Yes
  • No, because they aren't needed
  • No, because I need help

Added to documentation?

  • README.md
  • Dojo Book
  • No documentation needed

Checklist

  • I've formatted my code (scripts/prettier.sh, scripts/rust_fmt.sh, scripts/cairo_fmt.sh)
  • I've linted my code (scripts/clippy.sh, scripts/docs.sh)
  • I've commented my code
  • I've requested a review after addressing the comments

Summary by CodeRabbit

  • New Features

    • Introduced serialized key handling across various methods for improved consistency in entity ID generation and data management.
  • Bug Fixes

    • Enhanced error handling in player configuration reset logic to validate state accurately.
  • Refactor

    • Renamed methods to reflect serialized data handling, including changes to keys and values methods across multiple files.
    • Streamlined model writing logic in the set_models function.
    • Updated benchmark tests to utilize serialized values consistently.
  • Chores

    • Updated test cases to align with new utility functions and method signatures.
    • Updated dependencies in Cargo.toml for scarb and scarb-ui.

Copy link

coderabbitai bot commented Nov 8, 2024

Walkthrough

Ohayo, sensei! This pull request introduces significant changes across multiple files, primarily focusing on the handling of serialized keys and values within the Dojo framework. Key modifications include renaming functions and methods to reflect a shift towards serialization, updating method signatures, and altering internal logic to ensure consistent processing of serialized data. Additionally, several structs and enums have been removed, and the overall structure of various traits and implementations remains intact while enhancing clarity in the API.

Changes

File Path Change Summary
crates/dojo/core-cairo-test/src/tests/model/model.cairo Updated values() to serialized_values(), from_values() to from_serialized(), and adjusted key handling methods. Renamed test_model_ptr_from_key() to test_model_ptr_from_keys().
crates/dojo/core-cairo-test/src/tests/utils/key.cairo Replaced entity_id_from_keys with entity_id_from_serialized_keys in tests.
crates/dojo/core-cairo-test/src/tests/world/entities.cairo Deleted file containing multiple structs and enums related to the world model.
crates/dojo/core/src/event/event.cairo Renamed keys to serialized_keys and values to serialized_values in the Event trait.
crates/dojo/core/src/lib.cairo Updated exported function from entity_id_from_keys to entity_id_from_serialized_keys.
crates/dojo/core/src/model/model.cairo Renamed methods in Model trait to reflect serialization, including key to keys and from_values to from_serialized.
crates/dojo/core/src/model/model_value.cairo Renamed values to serialized_values and from_values to from_serialized in ModelValue trait.
crates/dojo/core/src/model/storage.cairo Changed parameter key to keys in several methods across storage traits.
crates/dojo/core/src/utils/key.cairo Renamed entity_id_from_keys to entity_id_from_serialized_keys, updated internal calls.
crates/dojo/core/src/world/storage.cairo Updated methods to handle serialized keys and values, including changes to read_model and write_value.
crates/dojo/core/src/world/world_contract.cairo Replaced entity_id_from_keys with entity_id_from_serialized_keys in multiple functions.
crates/dojo/lang/src/attribute_macros/patches/event.patch.cairo Renamed keys to serialized_keys and values to serialized_values in DojoEventImpl.
examples/spawn-and-move/src/actions.cairo Updated move and get_player_position methods to utilize entity_id_from_serialized_keys.

Possibly related PRs

Suggested reviewers

  • kariy

📜 Recent review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between e6bc73a and af95590.

⛔ Files ignored due to path filters (3)
  • Cargo.lock is excluded by !**/*.lock
  • spawn-and-move-db.tar.gz is excluded by !**/*.gz
  • types-test-db.tar.gz is excluded by !**/*.gz
📒 Files selected for processing (1)
  • Cargo.toml (1 hunks)
🔇 Additional comments (1)
Cargo.toml (1)

195-196: Ohayo sensei! Please verify the scarb dependency update.

The update of both scarb and scarb-ui to the newer revision a6d3b5b17b288502fe9cc63c96c0ae22fd175857 looks good, maintaining consistency between related dependencies.

Let's verify the changes in this scarb revision:

✅ Verification successful

Ohayo sensei! The scarb dependency update is safe to proceed with.

The commit message shows this is a simple dependency bump of dojo in scarb. The codebase extensively uses scarb for build tooling, package management, and compilation, but the update is compatible with the project's requirements as evidenced by:

  • All scarb usages in the codebase are for build-time operations (compilation, workspace management)
  • No direct runtime dependencies on scarb version-specific features
  • The project maintains its own scarb extensions via sozo_scarbext
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the changes in the new scarb revision

# Test: Fetch the commit message and changes for the new scarb revision
gh api repos/dojoengine/scarb/commits/a6d3b5b17b288502fe9cc63c96c0ae22fd175857 --jq '.commit.message'

Length of output: 116


Script:

#!/bin/bash
# Let's check what other dependencies in the codebase might be related to dojo
rg "dojo" Cargo.toml -A 2 -B 2

# Also check if there are any direct references to scarb in the code
rg "scarb" -g "!Cargo.toml" -g "!*.lock" -A 2 -B 2

Length of output: 47332


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?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

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 using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a 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

🧹 Outside diff range and nitpick comments (9)
crates/dojo/core-cairo-test/src/tests/utils/key.cairo (1)

3-9: Consider renaming the test function for clarity.

Ohayo sensei! While the implementation looks good, the test function name test_entity_id_from_keys doesn't reflect that it's testing the new entity_id_from_serialized_keys function. Consider renaming it to maintain consistency with the new API.

-fn test_entity_id_from_keys() {
+fn test_entity_id_from_serialized_keys() {
     let keys = [1, 2, 3].span();
     assert(
         entity_id_from_serialized_keys(keys) == core::poseidon::poseidon_hash_span(keys),
         'bad entity ID'
     );
 }
crates/dojo/core/src/model/model_value.cairo (1)

16-16: Ohayo! Update documentation to reflect serialization terminology.

The method names have been updated nicely to emphasize serialization, but the documentation comments above these methods still use the old terminology. Let's align them with the new convention, sensei!

Apply this diff to update the documentation:

-    /// Returns a span of values associated with the entity, every field of a model
+    /// Returns a span of serialized values associated with the entity, every field of a model
     /// that is not a key.
     fn serialized_values(self: @V) -> Span<felt252>;
-    /// Constructs a model value from its identifier and values.
+    /// Constructs a model value from its identifier and serialized values.
     fn from_serialized(entity_id: felt252, ref values: Span<felt252>) -> Option<V>;

Also applies to: 18-18

crates/dojo/lang/src/attribute_macros/patches/event.patch.cairo (1)

32-42: Consider adding documentation for the serialization format, sensei!

While the implementation is solid, it would be helpful to document the expected serialization format for both keys and values. This would help other developers understand how to properly interact with these methods.

Consider adding comments like this:

 #[inline(always)]
 fn serialized_keys(self: @$type_name$) -> Span<felt252> {
+    // Serializes the event keys into felt252 values following the format:
+    // [key1, key2, ..., keyN]
     let mut serialized = core::array::ArrayTrait::new();
     $serialized_keys$
     core::array::ArrayTrait::span(@serialized)
 }
crates/dojo/core/src/model/storage.cairo (2)

Line range hint 3-3: Ohayo sensei! Please enhance the TODO comment with more details.

The current TODO comment lacks specificity about what aspects of the member access interface need to be defined. Consider adding more context about the requirements and constraints.


105-105: Consider enhancing test trait documentation with security notes.

While the parameter rename is correct, since this trait bypasses permission checks, it would be helpful to document:

  • When it's appropriate to use this trait
  • Security implications of bypassing permissions
  • Any safeguards that should be in place during testing
crates/dojo/core-cairo-test/src/tests/model/model.cairo (1)

166-171: Excellent addition of serialized keys test, sensei!

The new test properly validates the serialized keys functionality. Consider adding a brief comment explaining the difference between ptr_from_keys() and ptr_from_serialized_keys() for future maintainers.

 #[test]
 fn test_model_ptr_from_serialized_keys() {
+    // Validates pointer creation from pre-serialized keys, complementing the regular keys test above
     let mut world = spawn_foo_world();
     let foo = Foo { k1: 1, k2: 2, v1: 3, v2: 4 };
crates/dojo/core/src/model/model.cairo (3)

3-3: Ohayo sensei! Consider removing the unused import.

The import list includes both entity_id_from_keys and entity_id_from_serialized_keys, but only the serialized version appears to be used in the implementation.

-    utils::{entity_id_from_serialized_keys, find_model_field_layout, entity_id_from_keys}
+    utils::{entity_id_from_serialized_keys, find_model_field_layout}

33-41: Ohayo sensei! Documentation needs updating for renamed methods.

The method renames align well with the new serialization convention, but the documentation comments above each method still use the old terminology.

Consider updating the documentation to reflect the new method names and clarify their serialization aspects:

-    /// Parses the key from the given model, where `K` is a type containing the keys of the model.
+    /// Parses the serialized keys from the given model, where `K` is a type containing the keys of the model.
     fn keys<K, +KeyParser<M, K>>(self: @M) -> K;
     
-    /// Returns the keys of the model.
+    /// Returns the serialized keys of the model as a span of felt252 values.
     fn serialized_keys(self: @M) -> Span<felt252>;

77-77: Consider caching the entity ID.

The entity_id method computes the ID from serialized keys on every call. For frequently accessed models, this could impact performance.

Consider caching the entity ID if the keys are immutable:

+    /// Cached entity ID for performance optimization
+    cached_id: Option<felt252>,
+
     fn entity_id(self: @M) -> felt252 {
-        entity_id_from_serialized_keys(Self::serialized_keys(self))
+        if let Some(id) = self.cached_id {
+            id
+        } else {
+            let id = entity_id_from_serialized_keys(Self::serialized_keys(self));
+            self.cached_id = Option::Some(id);
+            id
+        }
     }
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ed12756 and 477c24b.

📒 Files selected for processing (13)
  • crates/dojo/core-cairo-test/src/tests/model/model.cairo (5 hunks)
  • crates/dojo/core-cairo-test/src/tests/utils/key.cairo (1 hunks)
  • crates/dojo/core-cairo-test/src/tests/world/entities.cairo (0 hunks)
  • crates/dojo/core/src/event/event.cairo (1 hunks)
  • crates/dojo/core/src/lib.cairo (1 hunks)
  • crates/dojo/core/src/model/model.cairo (4 hunks)
  • crates/dojo/core/src/model/model_value.cairo (2 hunks)
  • crates/dojo/core/src/model/storage.cairo (4 hunks)
  • crates/dojo/core/src/utils/key.cairo (2 hunks)
  • crates/dojo/core/src/world/storage.cairo (19 hunks)
  • crates/dojo/core/src/world/world_contract.cairo (6 hunks)
  • crates/dojo/lang/src/attribute_macros/patches/event.patch.cairo (1 hunks)
  • examples/spawn-and-move/src/actions.cairo (2 hunks)
💤 Files with no reviewable changes (1)
  • crates/dojo/core-cairo-test/src/tests/world/entities.cairo
🔇 Additional comments (48)
crates/dojo/core-cairo-test/src/tests/utils/key.cairo (2)

6-9: LGTM! Test implementation is correct.

The test correctly verifies that the new entity_id_from_serialized_keys function produces the same hash as poseidon_hash_span, maintaining the expected behavior.


Line range hint 12-16: LGTM! Unchanged test remains valid.

The test_combine_key function correctly maintains its original implementation since the underlying combine_key functionality hasn't changed.

crates/dojo/core/src/event/event.cairo (1)

16-17: Ohayo! Method renames align with serialization convention.

The renaming of keys and values to serialized_keys and serialized_values respectively provides better clarity about the serialized nature of the returned data.

Let's verify the consistency of this naming convention across the codebase:

#!/bin/bash
# Description: Check for any remaining non-serialized key/value method names
# that might have been missed in the conversion

# Search for old method names that might have been missed
echo "Checking for potentially missed conversions..."
rg -g '*.cairo' 'fn (keys|values)\(' --type cairo

# Search for the new naming pattern to ensure consistency
echo "Verifying new naming convention usage..."
rg -g '*.cairo' 'fn serialized_(keys|values)\(' --type cairo
crates/dojo/core/src/utils/key.cairo (2)

12-12: Ohayo! Clean and correct implementation, sensei!

The function signature clearly indicates its purpose of working with serialized keys, and the implementation correctly uses poseidon_hash_span for computing the entity ID.


22-23: Excellent use of generic constraints and code reuse, sensei!

The implementation follows good practices by:

  • Using generic type K with the Serde trait constraint
  • Reusing entity_id_from_serialized_keys after serialization
  • Maintaining type safety while providing a clear API
crates/dojo/core/src/model/model_value.cairo (2)

Line range hint 30-39: Implementation looks solid, sensei!

The implementation correctly maintains the existing serialization logic while adopting the new naming convention. The changes are consistent with the trait definition and preserve the functionality.


16-18: Verify trait method usage across the codebase.

Let's ensure all callers have been updated to use the new method names.

#!/bin/bash
# Description: Search for any remaining usage of old method names
# which might indicate missed updates

echo "Checking for potential missed updates..."

# Check for old method names that should have been updated
rg -l 'fn values\(' --type cairo
rg -l 'fn from_values\(' --type cairo
rg -l '\.values\(\)' --type cairo
rg -l '\.from_values\(' --type cairo

echo "Note: If any files are found, they might need updates to match the new convention."

Also applies to: 30-39

crates/dojo/lang/src/attribute_macros/patches/event.patch.cairo (3)

32-35: Ohayo! The serialized_keys implementation looks good, sensei!

The renaming from keys to serialized_keys better reflects the method's purpose of providing serialized data. The implementation maintains the efficient array-based approach with proper span conversion.


39-42: The serialized_values implementation is well-aligned with the new convention!

The change from values to serialized_values maintains consistency with the serialization-focused naming scheme. The implementation follows the same pattern as serialized_keys, ensuring a uniform approach to data handling.


32-42: Verify complete migration to serialized naming convention

Let's ensure we haven't missed any references to the old method names in the codebase.

#!/bin/bash
# Search for any remaining references to the old method names
echo "Checking for old method names..."
rg -l '\.keys\(\)' --type cairo
rg -l '\.values\(\)' --type cairo

# Search for potential inconsistencies in naming
echo "Checking for mixed naming conventions..."
rg -l 'serialized.*keys|serialized.*values' --type cairo
crates/dojo/core/src/lib.cairo (1)

73-73: Ohayo sensei! Consider clarifying the coexistence of both key functions.

The line exports both entity_id_from_keys and entity_id_from_serialized_keys. If we're transitioning to serialized keys as indicated by the PR title, having both functions might cause confusion about which one to use.

Let's verify the usage patterns:

#!/bin/bash
# Description: Check usage patterns of both key functions
echo "Checking usage of entity_id_from_keys:"
rg "entity_id_from_keys\(" --type cairo

echo -e "\nChecking usage of entity_id_from_serialized_keys:"
rg "entity_id_from_serialized_keys\(" --type cairo

Consider either:

  1. Marking entity_id_from_keys as deprecated if it's kept for backward compatibility
  2. Removing entity_id_from_keys if it's no longer needed
  3. Adding documentation to clarify when to use each function if both are intentionally maintained
crates/dojo/core/src/model/storage.cairo (2)

53-53: LGTM! Changes maintain consistency and type safety.

The parameter renaming in read_value and write_value methods maintains consistency with the serialization approach while preserving all necessary generic constraints and type safety.

Also applies to: 67-67


17-17: Verify consistency with other method signatures.

The parameter rename from key to keys aligns with the PR's objective of transitioning to serialized keys. However, let's ensure this change is consistently applied across the codebase.

#!/bin/bash
# Description: Check for any remaining singular 'key' parameters in method signatures
# that might need to be updated for consistency

rg -g '*.cairo' 'fn.*\(.*key:.*\)' 
crates/dojo/core-cairo-test/src/tests/model/model.cairo (4)

57-58: Ohayo! The serialized values implementation looks good, sensei!

The change from values() to serialized_values() maintains the same functionality while better reflecting the serialized nature of the data.


65-66: The serialization method updates are consistent, sensei!

The transition from from_values() to from_serialized() maintains proper validation in both success and failure scenarios.

Also applies to: 74-75


156-159: Clean transition to the new keys convention, sensei!

The function rename and method update maintain the test's integrity while aligning with the new naming convention.


86-87: The keys() method change looks good, but let's verify the API impact, sensei!

The change from key() to keys() suggests support for multiple keys. The test logic remains valid.

#!/bin/bash
# Search for other key() method usages that might need updating
rg -l 'fn key\(' --type cairo

Also applies to: 95-96

crates/dojo/core/src/model/model.cairo (1)

138-143: LGTM! Clean implementation of pointer methods.

The implementation correctly handles both serialized and non-serialized key variants, maintaining consistency with the trait's new convention.

examples/spawn-and-move/src/actions.cairo (3)

105-107: Ohayo sensei! The entity ID generation looks good.

The update to use entity_id_from_serialized_keys aligns well with the new convention. The comment accurately reflects the change and provides helpful context about alternative approaches.


261-261: Test case properly updated for serialized keys, sensei!

The test implementation consistently uses the new entity_id_from_serialized_keys function, maintaining parity with the production code.


105-107: Verify the migration to serialized keys across the codebase.

Let's ensure all occurrences of entity ID generation have been updated consistently.

#!/bin/bash
# Description: Check for any remaining uses of the old entity_id_from_keys function
# and verify consistent usage of the new serialized version

echo "Checking for old entity_id_from_keys usage..."
rg "entity_id_from_keys" -A 2

echo "Verifying consistent usage of new function..."
rg "entity_id_from_serialized_keys" -A 2

Also applies to: 261-261

crates/dojo/core/src/world/world_contract.cairo (4)

49-51: Ohayo! Import changes look good, sensei!

The update to use entity_id_from_serialized_keys from the utils module is consistent with the new convention.


333-339: Clean implementation of serialized keys in metadata functions!

The conversion to use entity_id_from_serialized_keys in both metadata and set_metadata functions maintains consistency with the new convention while preserving the existing error handling and function signatures.

Also applies to: 352-353


1177-1177: Excellent consistency in entity management implementation, sensei!

The migration to entity_id_from_serialized_keys has been properly implemented across all entity management functions while maintaining the existing pattern matching, error handling, and event emission logic.

Also applies to: 1217-1217, 1241-1241


49-51: Verify complete migration to serialized keys

Let's ensure all instances of the old function have been replaced.

#!/bin/bash
# Description: Check for any remaining instances of the old function
# Test: Search for any remaining instances of entity_id_from_keys. Expect: No matches.
rg "entity_id_from_keys" --type cairo
crates/dojo/core/src/world/storage.cairo (23)

9-9: Ohayo, sensei! Inclusion of entity_id_from_serialized_keys in imports

The addition of entity_id_from_serialized_keys to the import list aligns with the shift towards handling serialized keys, ensuring consistency in the codebase.


61-62: Transition to serialized keys and values in event emission

Updating to Event::<E>::serialized_keys(event) and Event::<E>::serialized_values(event) ensures that events are emitted with serialized data. This change maintains consistency with the new serialization approach across the event system.


68-69: Update read_model to accept and serialize keys

Modifying the read_model function to accept keys: K and serializing them with serialize_inline allows for proper handling of serialized keys when retrieving models.


76-76: Use from_serialized for model deserialization

Switching to Model::<M>::from_serialized(ref keys, ref values) ensures models are correctly deserialized from serialized data, enhancing compatibility with the new serialization format.


111-111: Consistent deserialization in read_models

Using Model::<M>::from_serialized(ref mk, ref mv) in the read_models function maintains consistency in model deserialization, properly handling serialized keys and values.


130-131: Modify write_model to use serialized keys and values

Updating write_model to utilize Model::<M>::serialized_keys(model) and Model::<M>::serialized_values(model) ensures that models are written with serialized data, aligning with the serialization changes throughout the codebase.


140-141: Collect serialized keys and values when writing multiple models

By appending serialized keys and values in the write_models function, the code efficiently handles batch writing of models with serialized data.


157-157: Use serialized keys in erase_model

Employing ModelIndex::Keys(Model::<M>::serialized_keys(model)) ensures that models are correctly identified and erased using serialized keys.


231-232: Adjust read_value to work with serialized keys

The read_value function now accepts keys: K and uses entity_id_from_keys(@keys) for entity ID generation, ensuring proper retrieval of values using serialized keys.


242-242: Deserialization with from_serialized in read_value_from_id

Using ModelValue::<V>::from_serialized(entity_id, ref values) guarantees that values are correctly deserialized from serialized data.


257-257: Append entity IDs generated from serialized keys

Adding entity_ids.append(entity_id_from_keys(k)); in read_values ensures that all entity IDs correspond to the serialized keys provided.


286-286: Consistent deserialization in read_values_from_ids

Using ModelValue::<V>::from_serialized(entity_id, ref v) maintains consistent deserialization of values from serialized data.


302-302: Update write_value to accept keys and serialize them

Modifying write_value to accept keys: K and generate the entity ID using serialized keys aligns the function with the serialized data handling approach.


308-309: Use serialized keys and values in write_value

By generating the entity ID with entity_id_from_serialized_keys(serialize_inline::<K>(@keys)) and using ModelValue::<V>::serialized_values(value), the function ensures that values are written correctly using serialized data.


319-319: Collect entity IDs from serialized keys in write_values

Appending entity IDs generated from serialized keys in write_values ensures accurate mapping between keys and values during batch writes.


330-330: Ensure serialized values are used in write_value_from_id

Using ModelValue::<V>::serialized_values(value) when writing values by entity ID maintains consistency with serialized data handling.


346-346: Accumulate serialized values in write_values_from_ids

Appending serialized values in the write_values_from_ids function supports correct batch writing of values associated with their entity IDs.


372-373: Emit events with serialized data in test implementation

Updating emit_event_test to use Event::<E>::serialized_keys(event) and Event::<E>::serialized_values(event) aligns the test event emission with the serialization approach.


391-392: Use serialized keys and values in write_model_test

In the test implementation, employing Model::serialized_keys(model) and Model::<M>::serialized_values(model) ensures models are correctly written with serialized data during testing.


411-411: Erase models using serialized keys in tests

Using ModelIndex::Keys(Model::serialized_keys(model)) in erase_model_test allows for accurate model deletion in tests based on serialized keys.


458-460: Adjust write_value_test to accept and handle serialized keys

Modifying write_value_test to accept keys: K and generate the entity ID from serialized keys ensures that test value writes are consistent with the serialization changes.


468-468: Collect entity IDs from serialized keys in write_values_test

Appending entity IDs from serialized keys in the test function write_values_test maintains consistency during batch writes in testing scenarios.


483-483: Use serialized values in write_value_from_id_test

Ensuring ModelValue::<V>::serialized_values(value) is used in test writes by entity ID keeps the testing logic aligned with the serialization approach.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (2)
crates/dojo/core-cairo-test/src/tests/benchmarks.cairo (2)

300-300: Ohayo! Consider adapting this ignored test, sensei!

While the serialization change is correct, the TODO comment indicates this test needs adaptation for the new layout system. Would you like assistance in updating this test?


381-381: Another test awaiting adaptation, sensei!

Like the previous test, this one is correctly updated for serialization but needs adaptation for the new layout system. Would you like assistance in updating this test as well?

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 477c24b and 5877a35.

📒 Files selected for processing (1)
  • crates/dojo/core-cairo-test/src/tests/benchmarks.cairo (9 hunks)
🔇 Additional comments (4)
crates/dojo/core-cairo-test/src/tests/benchmarks.cairo (4)

198-198: Ohayo sensei! The serialization change looks good!

The transition from values() to serialized_values() maintains test integrity while aligning with the new serialization convention.


252-252: The quaternion serialization change is properly aligned, sensei!

The transition to serialized_values() maintains consistency with the new convention while preserving the validation logic.


271-271: Database operation updated correctly, sensei!

The database set operation now properly uses serialized_values(), maintaining consistency with the new serialization approach.


401-401: Database operation properly updated, sensei!

The change to serialized_values() maintains consistency with the new serialization approach in database operations.

Comment on lines +470 to +471
index: ModelIndex::Keys(simple_entity_packed.serialized_keys()),
values: simple_entity_packed.serialized_values(),
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Ohayo sensei! Found an inconsistency in serialization!

While most changes correctly use the new serialization methods, there's an inconsistency at line 491 where keys() is used instead of serialized_keys(). This should be updated for consistency.

Apply this diff to fix the inconsistency:

-            index: ModelIndex::Keys(complex_entity.keys()),
+            index: ModelIndex::Keys(complex_entity.serialized_keys()),

Also applies to: 480-481, 491-491

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (5)
crates/dojo/core-cairo-test/src/tests/model/model.cairo (1)

166-172: Excellent test coverage for serialized keys!

The new test explicitly verifies our serialized keys functionality. Consider adding a brief comment explaining the difference between ptr_from_keys and ptr_from_serialized_keys for future maintainers.

 #[test]
 fn test_model_ptr_from_serialized_keys() {
+    // Verifies model pointer creation from pre-serialized keys, as opposed to
+    // automatic serialization in ptr_from_keys
     let mut world = spawn_foo_world();
     let foo = Foo { k1: 1, k2: 2, v1: 3, v2: 4 };
crates/dojo/core/src/model/model.cairo (1)

33-41: Ohayo sensei! Documentation needs updating for the new serialization convention.

While the method renames (keysserialized_keys, valuesserialized_values) improve API clarity, the trait documentation should be updated to explain:

  • The new serialization convention
  • Why serialization is preferred
  • Migration guide for users of the old convention

Example documentation addition:

/// The `Model` trait.
///
/// It provides a standardized way to interact with models using serialized data.
/// Keys and values are handled in their serialized form to ensure consistent
/// data representation across the system.
///
/// # Migration
/// - Use `serialized_keys()` instead of `keys()`
/// - Use `serialized_values()` instead of `values()`
/// - Use `from_serialized()` for construction from serialized data
crates/dojo/core/src/world/storage.cairo (2)

88-92: Consider optimizing bulk serialization.

The current implementation serializes keys individually in a loop. Consider adding a bulk serialization method to improve performance when handling multiple keys.


Line range hint 236-270: Ohayo sensei! Consider adding batch deserialization optimization.

The current implementation deserializes values one at a time in a loop. Consider implementing batch deserialization for better performance when handling multiple values.

- for v in IWorldDispatcherTrait::entities(...) {
-     let mut v = *v;
-     match ModelValue::<V>::from_serialized(v) {
-         Option::Some(value) => values.append(value),
-         Option::None => { panic!(...) }
-     }
- }
+ let entities = IWorldDispatcherTrait::entities(...);
+ ModelValue::<V>::batch_from_serialized(entities)
crates/dojo/core/src/world/world_contract.cairo (1)

1177-1177: LGTM! Consider adding documentation about serialization format.

The transition to serialized keys is consistently implemented across all entity management functions. However, it would be helpful to add documentation about the expected serialization format for future maintainers.

Consider adding a comment block like this above the first usage:

+    /// The keys are expected to be serialized in the following format:
+    /// [key1, key2, ..., keyN] where each key follows the Dojo serialization standard
     let entity_id = entity_id_from_serialized_keys(keys);

Also applies to: 1217-1217, 1241-1241

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 5877a35 and e6bc73a.

📒 Files selected for processing (5)
  • crates/dojo/core-cairo-test/src/tests/model/model.cairo (5 hunks)
  • crates/dojo/core/src/model/model.cairo (4 hunks)
  • crates/dojo/core/src/model/model_value.cairo (2 hunks)
  • crates/dojo/core/src/world/storage.cairo (19 hunks)
  • crates/dojo/core/src/world/world_contract.cairo (6 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • crates/dojo/core/src/model/model_value.cairo
🔇 Additional comments (13)
crates/dojo/core-cairo-test/src/tests/model/model.cairo (4)

65-68: Serialization handling looks solid, sensei!

The update to use from_serialized() maintains proper test coverage for both successful and error cases.

Also applies to: 74-75


156-163: Clean transition to plural keys, sensei!

The rename and implementation update maintain consistency with our new approach.


Line range hint 86-96: Verify API consistency for key/keys transition

The change from key() to keys() looks good, but let's ensure this API change is consistently applied across the codebase.

#!/bin/bash
# Check for any remaining singular key() calls that should be updated
rg -g '*.cairo' 'fn key\(' 
# Check the new keys() implementation usage
rg -g '*.cairo' 'fn keys\('

57-58: Ohayo sensei! LGTM - Serialization change looks good!

The transition from values() to serialized_values() aligns well with our new serialization approach.

Let's verify the consistency of this change:

✅ Verification successful

Ohayo sensei! The serialization transition is complete and consistent!

The codebase search shows that all value retrievals have been properly transitioned to use serialized_values(). The method is consistently used across different parts of the codebase including:

  • World contract implementation
  • Benchmark tests
  • Model tests

No instances of the old .values() method were found, confirming a complete migration.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for any remaining non-serialized value calls
rg -g '*.cairo' 'fn values\(' 

Length of output: 58


Script:

#!/bin/bash
# Let's search for both the old and new method names to understand the transition
rg -g '*.cairo' 'serialized_values\(\)' -A 2
rg -g '*.cairo' '\.values\(\)' -A 2

Length of output: 3026

crates/dojo/core/src/model/model.cairo (2)

3-3: Ohayo sensei! Consider deprecating the old key handling function.

The presence of both entity_id_from_keys and entity_id_from_serialized_keys might cause confusion about which function to use.

Let's check the usage patterns:


77-77: Ohayo sensei! Verify entity_id compatibility with existing data.

The switch to entity_id_from_serialized_keys in the entity_id method is a critical change that could affect model identity.

Let's check for potential impacts:

✅ Verification successful

Ohayo! The entity_id implementation is safe and backward compatible, sensei!

The git history shows that entity_id has consistently used entity_id_from_keys since the initial implementation, which in turn has always used entity_id_from_serialized_keys. The change in the review is actually just a code refactor that makes the implementation more direct, without changing the underlying behavior.

Key evidence from the git history:

  • The original implementation used the same logic through entity_id_from_keys
  • There are existing tests verifying the entity ID generation in test_entity_id_from_keys
  • The model identity computation has remained consistent throughout the codebase history

The change maintains compatibility with existing data as it's using the same underlying key serialization and hashing mechanism.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Look for tests comparing old and new entity_id generation
echo "Checking for entity_id compatibility tests:"
rg -A 5 "test.*entity_id" 

# Look for direct entity_id comparisons
echo -e "\nChecking for direct entity_id usage:"
ast-grep --pattern 'entity_id == $_'

Length of output: 3480


Script:

#!/bin/bash
# Let's check the implementation history of entity_id
echo "Checking entity_id implementation changes:"
git log -p --all -S "entity_id" -- "crates/dojo/core/src/model/model.cairo"

# Look for any tests that might verify model data consistency
echo -e "\nChecking for model data consistency tests:"
rg -l "test.*model.*data|test.*model.*consistency" 

# Check current implementation of serialized_keys
echo -e "\nChecking serialized_keys implementation:"
ast-grep --pattern 'fn serialized_keys'

Length of output: 18813

crates/dojo/core/src/world/storage.cairo (4)

9-9: Ohayo sensei! LGTM on the new serialization utility import.

The addition of entity_id_from_serialized_keys aligns well with the PR's objective of transitioning to serialized key handling.


61-62: Event emission now uses serialized data consistently.

The transition to serialized_keys and serialized_values maintains consistency with the new serialization approach.


353-354: Test implementations properly mirror production changes.

The test implementations correctly reflect the transition to serialized keys and values, maintaining consistency between test and production code.

Also applies to: 372-373, 392-392, 439-464


68-76: Ohayo! Verify error handling in model deserialization.

While the transition to serialized keys looks good, we should ensure robust error handling for deserialization failures.

✅ Verification successful

The previous command failed because the file type wasn't recognized. Let's try a more general search to find deserialization error handling patterns and related test files.


Let's try to find the Model trait definition and any related test files to understand the error handling patterns better.


Ohayo! The error handling for deserialization is properly implemented, sensei!

Looking at the codebase, I can confirm that the deserialization error handling is robust and consistent:

  1. The Model::from_serialized implementation includes proper error handling with descriptive panic messages:
match Model::<M>::from_serialized(keys, values) {
    Option::Some(model) => model,
    Option::None => {
        panic!(
            "Model: deserialization failed. Ensure the length of the keys tuple is matching the number of #[key] fields in the model struct."
        )
    }
}
  1. The error handling is consistently implemented across both single model and bulk model operations, with clear error messages that help developers identify the issue.

  2. The ModelValue trait also follows the same pattern with proper error handling for deserialization failures.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for test cases handling deserialization failures
rg -l "from_serialized.*None" --type cairo

Length of output: 74


Script:

#!/bin/bash
# Search for test cases handling deserialization failures with ripgrep
rg "from_serialized.*None" -A 5

# Search for any error handling patterns in model deserialization
rg "Model::from_serialized" -A 5

# Look for test files related to model storage
fd "test.*\.cairo$" --exec rg -l "ModelStorage"

Length of output: 114


Script:

#!/bin/bash
# Look for the Model trait definition and implementation
rg "trait Model" -A 10

# Search for any match expressions involving Model deserialization
rg "match.*Model.*from_serialized" -A 5

# Find test files in the dojo directory
fd "test" --type f --extension cairo --exec cat {} \;

Length of output: 31579

crates/dojo/core/src/world/world_contract.cairo (3)

49-51: LGTM! Import changes align with serialization transition.

The updated import statement correctly reflects the transition to serialized keys handling.


333-339: Verify metadata deserialization behavior.

The transition to serialized keys looks good, but let's verify that all callers of this function are prepared for the new serialization approach.

✅ Verification successful

Serialization changes are consistent across the codebase

The transition to serialized keys in the metadata function is properly supported:

  • The ResourceMetadata model is consistently used across the codebase with proper serialization/deserialization
  • Test files in crates/dojo/core-cairo-test/src/tests/world/metadata.cairo verify the metadata functionality
  • All callers use the standardized model interface through Model::<ResourceMetadata>
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Find all callers of the metadata function to ensure compatibility
# with the new serialization approach

# Search for direct metadata function calls
rg -l "metadata\(" --type cairo

# Search for ResourceMetadata usage
rg -l "ResourceMetadata" --type cairo

Length of output: 305


Script:

#!/bin/bash
# Let's try without file type filtering since cairo isn't recognized
# Search for metadata function calls
rg "metadata\("

# Search for ResourceMetadata usage
rg "ResourceMetadata"

# Also search for files with .cairo extension to ensure we're looking at the right files
fd "\.cairo$"

Length of output: 14879


352-353: Ensure test coverage for serialized metadata.

Ohayo, sensei! The transition to serialized keys looks good, but we should ensure proper test coverage for this critical functionality.

✅ Verification successful

Test coverage for serialized metadata is comprehensive, sensei! ✨

Ohayo! After reviewing the test files, I can confirm that the metadata functionality is well-tested in crates/dojo/core-cairo-test/src/tests/world/metadata.cairo with multiple test cases covering:

  • Basic metadata setting and retrieval
  • Resource owner permissions
  • Writer permissions validation
  • Random account access restrictions
  • Malicious contract prevention

The tests properly verify the metadata functionality including the serialization aspects through the complete flow of setting and retrieving metadata values.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check test coverage for metadata serialization

# Look for relevant test cases
rg -l "test.*metadata" --type cairo

Length of output: 305


Script:

#!/bin/bash
# Let's try without file type filtering since cairo isn't recognized
# Search for test files and metadata-related patterns
rg -l "test.*metadata|#\[test\].*metadata|ResourceMetadata|set_metadata" 

# Also search specifically for test functions related to metadata
ast-grep --pattern 'fn test_$_metadata$_() { $$$ }'

Length of output: 818


Script:

#!/bin/bash
# Search for test files in test directories
fd "test.*\.cairo$"

Length of output: 166


Script:

#!/bin/bash
# Look for metadata-related tests in any test file
rg -B 2 -A 2 "#\[test\]" $(fd "test.*\.cairo$")

Length of output: 520


Script:

#!/bin/bash
# Let's check the core-cairo-test metadata tests specifically
rg -B 2 -A 5 "test.*metadata" crates/dojo/core-cairo-test/src/tests/world/metadata.cairo

# Also check for any metadata test implementations in the core
rg -B 2 -A 5 "test.*metadata" crates/dojo/core/src/

Length of output: 1498


Script:

#!/bin/bash
# Look for actual metadata test implementations
rg -B 2 -A 5 "set_metadata|get_metadata" crates/dojo/core-cairo-test/src/tests/world/metadata.cairo

Length of output: 2225

Comment on lines +138 to +143
fn ptr_from_keys<K, +Serde<K>, +Drop<K>>(keys: K) -> ModelPtr<M> {
ModelPtr { id: entity_id_from_keys(@keys) }
}

fn ptr_from_keys(keys: Span<felt252>) -> ModelPtr<M> {
ModelPtr { id: entity_id_from_keys(keys) }
fn ptr_from_serialized_keys(keys: Span<felt252>) -> ModelPtr<M> {
ModelPtr { id: entity_id_from_serialized_keys(keys) }
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Ohayo sensei! Consider aligning ptr methods with the new serialization convention.

The implementation maintains both serialized and non-serialized ptr methods, but ptr_from_keys still uses the old entity_id_from_keys. For consistency:

-    fn ptr_from_keys<K, +Serde<K>, +Drop<K>>(keys: K) -> ModelPtr<M> {
-        ModelPtr { id: entity_id_from_keys(@keys) }
+    fn ptr_from_keys<K, +Serde<K>, +Drop<K>>(keys: K) -> ModelPtr<M> {
+        // Serialize keys and use the new convention
+        let mut serialized = ArrayTrait::new();
+        keys.serialize(ref serialized);
+        Self::ptr_from_serialized_keys(serialized.span())
     }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
fn ptr_from_keys<K, +Serde<K>, +Drop<K>>(keys: K) -> ModelPtr<M> {
ModelPtr { id: entity_id_from_keys(@keys) }
}
fn ptr_from_keys(keys: Span<felt252>) -> ModelPtr<M> {
ModelPtr { id: entity_id_from_keys(keys) }
fn ptr_from_serialized_keys(keys: Span<felt252>) -> ModelPtr<M> {
ModelPtr { id: entity_id_from_serialized_keys(keys) }
fn ptr_from_keys<K, +Serde<K>, +Drop<K>>(keys: K) -> ModelPtr<M> {
// Serialize keys and use the new convention
let mut serialized = ArrayTrait::new();
keys.serialize(ref serialized);
Self::ptr_from_serialized_keys(serialized.span())
}
fn ptr_from_serialized_keys(keys: Span<felt252>) -> ModelPtr<M> {
ModelPtr { id: entity_id_from_serialized_keys(keys) }

@glihm glihm changed the title Updated covetion from keys and values to serialized keys and values refactor(lang): update convention for keys and values naming Nov 8, 2024
Copy link

codecov bot commented Nov 8, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 57.35%. Comparing base (ed12756) to head (af95590).
Report is 3 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2660      +/-   ##
==========================================
- Coverage   57.49%   57.35%   -0.14%     
==========================================
  Files         400      401       +1     
  Lines       50276    50387     +111     
==========================================
- Hits        28905    28900       -5     
- Misses      21371    21487     +116     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants