Skip to content

Feat/add UUID to attribute#1290

Open
BenPinet wants to merge 21 commits into
v18from
feat/add_uuid_to_attribute
Open

Feat/add UUID to attribute#1290
BenPinet wants to merge 21 commits into
v18from
feat/add_uuid_to_attribute

Conversation

@BenPinet

Copy link
Copy Markdown
Member

No description provided.

@BenPinet BenPinet requested review from BotellaA and panquez June 19, 2026 12:21
@github-actions

github-actions Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Cpp-Linter Report ⚠️

Some files did not pass the configured checks!

clang-tidy (v20.1.8) reports: 2060 concern(s)
  • bindings/python/src/basic/attribute_manager.cpp:36:10: warning: [cppcoreguidelines-avoid-non-const-global-variables]

    variable 'python_attribute_class' is non-const and globally accessible, consider making it const

       36 |     void python_attribute_class( pybind11::class_< AttributeManager >& manager,
          |          ^
  • bindings/python/src/basic/attribute_manager.cpp:36:10: warning: [misc-use-internal-linkage]

    variable 'python_attribute_class' can be made static or moved into an anonymous namespace to enforce internal linkage

       36 |     void python_attribute_class( pybind11::class_< AttributeManager >& manager,
          |          ^
          |     static 
  • bindings/python/src/basic/attribute_manager.cpp:86:10: warning: [misc-use-internal-linkage]

    function 'define_attribute_manager' can be made static or moved into an anonymous namespace to enforce internal linkage

       86 |     void define_attribute_manager( pybind11::module& module )
          |          ^
          |     static 
  • include/geode/basic/attribute.hpp:52:11: warning: [cppcoreguidelines-special-member-functions]

    class 'AttributeBase' defines a default destructor, a copy constructor and a copy assignment operator but does not define a move constructor or a move assignment operator

       52 |     class AttributeBase : public Identifier
          |           ^
  • include/geode/basic/attribute.hpp:80:27: warning: [hicpp-move-const-arg]

    std::move of the variable 'new_properties' of the trivially-copyable type 'AttributeProperties' has no effect; remove std::move()

       80 |             properties_ = std::move( new_properties );
          |                           ^~~~~~~~~~                ~
  • include/geode/basic/attribute.hpp:154:28: warning: [hicpp-move-const-arg]

    std::move of the variable 'properties' of the trivially-copyable type 'AttributeProperties' has no effect; remove std::move()

      154 |             : properties_( std::move( properties ) )
          |                            ^~~~~~~~~~            ~
  • include/geode/basic/bitsery_archive.hpp:51:17: warning: [performance-enum-size]

    enum 'BITSERY' uses a larger base type ('int', size: 4 bytes) than necessary for its value set, consider using 'std::uint8_t' (1 byte) as the base type to reduce its size

       51 |     enum struct BITSERY
          |                 ^
  • include/geode/basic/bitsery_archive.hpp:100:33: warning: [readability-identifier-length]

    parameter name 's' is too short, expected at least 3 characters

      100 |     void serialize( Serializer &s, absl::InlinedVector< T, N > &obj )
          |                                 ^
  • include/geode/basic/bitsery_archive.hpp:115:33: warning: [readability-identifier-length]

    parameter name 's' is too short, expected at least 3 characters

      115 |     void serialize( Serializer &s, absl::FixedArray< T, N > &obj )
          |                                 ^
  • include/geode/basic/bitsery_archive.hpp:121:9: warning: [cppcoreguidelines-macro-usage]

    function-like macro 'SERIALIZE_BITSERY_ARCHIVE' used; consider a 'constexpr' template function

      121 | #define SERIALIZE_BITSERY_ARCHIVE( EXPORT, TYPE )                              \
          |         ^
  • include/geode/basic/bitsery_archive.hpp:122:14: warning: [bugprone-macro-parentheses]

    macro argument should be enclosed in parentheses

      122 |     template EXPORT void TYPE::serialize< geode::Serializer >(                 \
          |              ^
          |              (     )
  • include/geode/basic/bitsery_archive.hpp:124:14: warning: [bugprone-macro-parentheses]

    macro argument should be enclosed in parentheses

      124 |     template EXPORT void TYPE::serialize< geode::Deserializer >(               \
          |              ^
          |              (     )
  • include/geode/basic/bitsery_archive.hpp:127:9: warning: [cppcoreguidelines-macro-usage]

    function-like macro 'BITSERY_CLASS_NAME' used; consider a 'constexpr' template function

      127 | #define BITSERY_CLASS_NAME( Type, Name )                                       \
          |         ^
  • include/geode/basic/constant_attribute.hpp:115:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

      115 |         ConstantAttribute( std::string_view name )
          |         ^
          |         explicit 
  • include/geode/basic/growable.hpp:52:39: warning: [cppcoreguidelines-pro-type-const-cast]

    do not use const_cast to remove const qualifier

       52 |             serializers_.back()( ser, const_cast< T & >( obj ) );
          |                                       ^
  • include/geode/basic/growable.hpp:76:31: warning: [readability-identifier-naming]

    invalid case style for constexpr variable 'SupportValueOverload'

       76 |         static constexpr bool SupportValueOverload = false;
          |                               ^~~~~~~~~~~~~~~~~~~~
          |                               SUPPORT_VALUE_OVERLOAD
  • include/geode/basic/growable.hpp:77:31: warning: [readability-identifier-naming]

    invalid case style for constexpr variable 'SupportObjectOverload'

       77 |         static constexpr bool SupportObjectOverload = true;
          |                               ^~~~~~~~~~~~~~~~~~~~~
          |                               SUPPORT_OBJECT_OVERLOAD
  • include/geode/basic/growable.hpp:78:31: warning: [readability-identifier-naming]

    invalid case style for constexpr variable 'SupportLambdaOverload'

       78 |         static constexpr bool SupportLambdaOverload = true;
          |                               ^~~~~~~~~~~~~~~~~~~~~
          |                               SUPPORT_LAMBDA_OVERLOAD
  • include/geode/basic/sparse_attribute.hpp:124:30: warning: [cppcoreguidelines-avoid-magic-numbers]

    10 is a magic number; consider replacing it with a named constant

      124 |             values_.reserve( 10 );
          |                              ^
  • include/geode/basic/sparse_attribute.hpp:127:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

      127 |         SparseAttribute( std::string_view name )
          |         ^
          |         explicit 
  • include/geode/basic/sparse_attribute.hpp:150:61: warning: [readability-identifier-length]

    parameter name 'i' is too short, expected at least 3 characters

      150 |                             []( Archive& archive2, index_t& i, T& item ) {
          |                                                             ^
  • include/geode/basic/sparse_attribute.hpp:155:30: warning: [cppcoreguidelines-avoid-magic-numbers]

    10 is a magic number; consider replacing it with a named constant

      155 |             values_.reserve( 10 );
          |                              ^
  • include/geode/basic/sparse_attribute.hpp:264:31: warning: [readability-identifier-length]

    variable name 'in' is too short, expected at least 3 characters

      264 |             for( const auto& [in, outs] : old2new_mapping.in2out_map() )
          |                               ^
  • include/geode/basic/sparse_attribute.hpp:315:31: warning: [readability-identifier-length]

    variable name 'in' is too short, expected at least 3 characters

      315 |             for( const auto& [in, outs] : old2new_mapping.in2out_map() )
          |                               ^
  • include/geode/basic/variable_attribute.hpp:117:30: warning: [cppcoreguidelines-avoid-magic-numbers]

    10 is a magic number; consider replacing it with a named constant

      117 |             values_.reserve( 10 );
          |                              ^
  • include/geode/basic/variable_attribute.hpp:120:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

      120 |         VariableAttribute( std::string_view name )
          |         ^
          |         explicit 
  • include/geode/basic/variable_attribute.hpp:143:30: warning: [cppcoreguidelines-avoid-magic-numbers]

    10 is a magic number; consider replacing it with a named constant

      143 |             values_.reserve( 10 );
          |                              ^
  • include/geode/basic/variable_attribute.hpp:296:31: warning: [readability-identifier-length]

    variable name 'in' is too short, expected at least 3 characters

      296 |             for( const auto& [in, outs] : old2new_mapping.in2out_map() )
          |                               ^
  • include/geode/basic/variable_attribute.hpp:325:55: warning: [hicpp-move-const-arg]

    std::move of the variable 'properties' of the trivially-copyable type 'AttributeProperties' has no effect; remove std::move()

      325 |             : VariableAttribute( default_value, name, std::move( properties ) )
          |                                                       ^~~~~~~~~~            ~
  • include/geode/basic/variable_attribute.hpp:331:20: warning: [cppcoreguidelines-pro-type-reinterpret-cast]

    do not use reinterpret_cast

      331 |             return reinterpret_cast< const bool& >( values_[element] );
          |                    ^
  • include/geode/basic/variable_attribute.hpp:336:32: warning: [hicpp-move-const-arg]

    std::move of the variable 'value' of the trivially-copyable type 'bool' has no effect; remove std::move()

      336 |             values_[element] = std::move( value );
          |                                ^~~~~~~~~~       ~
  • include/geode/basic/variable_attribute.hpp:336:32: warning: [readability-implicit-bool-conversion]

    implicit conversion 'bool' -> 'value_type' (aka 'unsigned char')

      336 |             values_[element] = std::move( value );
          |                                ^                 
          |                                static_cast<value_type>( )
  • include/geode/basic/variable_attribute.hpp:341:20: warning: [readability-implicit-bool-conversion]

    implicit conversion 'unsigned char' -> 'bool'

      341 |             return default_value_;
          |                    ^             
          |                                   != 0u
  • include/geode/basic/variable_attribute.hpp:347:23: warning: [cppcoreguidelines-pro-type-reinterpret-cast]

    do not use reinterpret_cast

      347 |             modifier( reinterpret_cast< bool& >( values_[element] ) );
          |                       ^
  • include/geode/basic/variable_attribute.hpp:374:48: warning: [hicpp-move-const-arg]

    std::move of the variable 'properties' of the trivially-copyable type 'AttributeProperties' has no effect; remove std::move()

      374 |             : ReadOnlyAttribute< bool >( name, std::move( properties ) ),
          |                                                ^~~~~~~~~~            ~
  • include/geode/basic/variable_attribute.hpp:375:31: warning: [readability-implicit-bool-conversion]

    implicit conversion 'bool' -> 'unsigned char'

      375 |               default_value_( default_value )
          |                               ^
          |                               static_cast<unsigned char>( )
  • include/geode/basic/variable_attribute.hpp:377:30: warning: [cppcoreguidelines-avoid-magic-numbers]

    10 is a magic number; consider replacing it with a named constant

      377 |             values_.reserve( 10 );
          |                              ^
  • include/geode/basic/variable_attribute.hpp:380:9: warning: [cppcoreguidelines-pro-type-member-init]

    constructor does not initialize these fields: default_value_

      380 |         VariableAttribute( std::string_view name )
          |         ^
  • include/geode/basic/variable_attribute.hpp:380:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

      380 |         VariableAttribute( std::string_view name )
          |         ^
          |         explicit 
  • include/geode/basic/variable_attribute.hpp:383:9: warning: [cppcoreguidelines-pro-type-member-init]

    constructor does not initialize these fields: default_value_

      383 |         VariableAttribute()
          |         ^
  • include/geode/basic/variable_attribute.hpp:402:30: warning: [cppcoreguidelines-avoid-magic-numbers]

    10 is a magic number; consider replacing it with a named constant

      402 |             values_.reserve( 10 );
          |                              ^
  • include/geode/basic/variable_attribute.hpp:440:60: warning: [bugprone-unchecked-optional-access]

    unchecked access to optional value

      440 |                     static_cast< bool >( default_value_ ), this->name().value(),
          |                                                            ^
  • include/geode/basic/variable_attribute.hpp:459:34: warning: [readability-implicit-bool-conversion]

    implicit conversion 'bool' -> 'value_type' (aka 'unsigned char')

      459 |                     values_[i] = typed_attribute.value( i );
          |                                  ^                         
          |                                  static_cast<value_type>(  )
  • include/geode/basic/variable_attribute.hpp:471:60: warning: [bugprone-unchecked-optional-access]

    unchecked access to optional value

      471 |                     static_cast< bool >( default_value_ ), this->name().value(),
          |                                                            ^
  • include/geode/basic/variable_attribute.hpp:502:60: warning: [bugprone-unchecked-optional-access]

    unchecked access to optional value

      502 |                     static_cast< bool >( default_value_ ), this->name().value(),
          |                                                            ^
  • include/geode/basic/variable_attribute.hpp:506:31: warning: [readability-identifier-length]

    variable name 'in' is too short, expected at least 3 characters

      506 |             for( const auto& [in, outs] : old2new_mapping.in2out_map() )
          |                               ^
  • include/geode/basic/variable_attribute.hpp:557:31: warning: [readability-identifier-length]

    variable name 'in' is too short, expected at least 3 characters

      557 |             for( const auto& [in, outs] : old2new_mapping.in2out_map() )
          |                               ^
  • include/geode/basic/variable_attribute.hpp:568:45: warning: [readability-redundant-member-init]

    initializer for member 'values_' is redundant

      568 |         std::vector< unsigned char > values_{};
          |                                             ^~
  • include/geode/mesh/builder/geode/geode_vertex_set_builder.hpp:42:30: warning: [cppcoreguidelines-special-member-functions]

    class 'OpenGeodeVertexSetBuilder' defines a move constructor but does not define a destructor, a copy constructor, a copy assignment operator or a move assignment operator

       42 |     class opengeode_mesh_api OpenGeodeVertexSetBuilder : public VertexSetBuilder
          |                              ^
  • include/geode/mesh/builder/geode/geode_vertex_set_builder.hpp:55:42: warning: [readability-identifier-length]

    parameter name 'nb' is too short, expected at least 3 characters

       55 |         void do_create_vertices( index_t nb ) final;
          |                                          ^
  • include/geode/mesh/core/attribute_coordinate_reference_system.hpp:39:11: warning: [cppcoreguidelines-special-member-functions]

    class 'AttributeCoordinateReferenceSystem' defines a destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator

       39 |     class AttributeCoordinateReferenceSystem
          |           ^
  • include/geode/mesh/core/detail/facet_storage.hpp:39:1: warning: [modernize-concat-nested-namespaces]

    nested namespaces can be concatenated

       39 | namespace geode
          | ^~~~~~~~~~~~~~~
       40 | {
          | ~
       41 |     namespace detail
          |     ~~~~~~~~~~~~~~~~
          |     namespace geode::detail
  • include/geode/mesh/core/detail/facet_storage.hpp:60:13: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       60 |             FacetStorage( BITSERY ) {}
          |             ^
          |             explicit 
  • include/geode/mesh/core/detail/facet_storage.hpp:60:27: error: [clang-diagnostic-error]

    unknown type name 'BITSERY'

       60 |             FacetStorage( BITSERY ) {}
          |                           ^
  • include/geode/mesh/core/detail/facet_storage.hpp:60:35: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       60 |             FacetStorage( BITSERY ) {}
          |                                   ^
          |                                    /*unused*/
  • include/geode/mesh/core/detail/facet_storage.hpp:67:40: warning: [hicpp-uppercase-literal-suffix]

    integer literal has suffix 'u', which is not uppercase

       67 |                             "counter", 1u, { false, false, false } );
          |                                        ^~
          |                                         U
  • include/geode/mesh/core/detail/facet_storage.hpp:100:28: warning: [readability-identifier-length]

    variable name 'id' is too short, expected at least 3 characters

      100 |                 const auto id = facet_indices_.size();
          |                            ^
  • include/geode/mesh/core/detail/facet_storage.hpp:103:28: warning: [readability-identifier-length]

    variable name 'it' is too short, expected at least 3 characters

      103 |                 const auto it = std::get< 0 >( output );
          |                            ^
  • include/geode/mesh/core/detail/facet_storage.hpp:118:28: warning: [readability-identifier-length]

    variable name 'it' is too short, expected at least 3 characters

      118 |                 const auto it = facet_indices_.find( vertices );
          |                            ^
  • include/geode/mesh/core/detail/facet_storage.hpp:123:28: warning: [readability-identifier-length]

    variable name 'id' is too short, expected at least 3 characters

      123 |                 const auto id = it->second;
          |                            ^
  • include/geode/mesh/core/detail/facet_storage.hpp:128:50: warning: [hicpp-uppercase-literal-suffix]

    integer literal has suffix 'u', which is not uppercase

      128 |                 const auto new_count = std::max( 1u, old_count ) - 1;
          |                                                  ^~
          |                                                   U
  • include/geode/mesh/core/detail/facet_storage.hpp:206:36: warning: [readability-identifier-length]

    variable name 'it' is too short, expected at least 3 characters

      206 |                         const auto it =
          |                                    ^
  • include/geode/mesh/core/detail/facet_storage.hpp:274:48: error: [clang-diagnostic-error]

    no member named 'StdSmartPtr' in namespace 'bitsery::ext'

      274 |                                  bitsery::ext::StdSmartPtr{} );
          |                                  ~~~~~~~~~~~~~~^
  • include/geode/mesh/core/detail/facet_storage.hpp:276:48: error: [clang-diagnostic-error]

    no member named 'StdSmartPtr' in namespace 'bitsery::ext'

      276 |                                  bitsery::ext::StdSmartPtr{} );
          |                                  ~~~~~~~~~~~~~~^
  • include/geode/mesh/core/detail/facet_storage.hpp:304:51: error: [clang-diagnostic-error]

    no member named 'StdSmartPtr' in namespace 'bitsery::ext'

      304 |                                     bitsery::ext::StdSmartPtr{} );
          |                                     ~~~~~~~~~~~~~~^
  • include/geode/mesh/core/detail/facet_storage.hpp:306:51: error: [clang-diagnostic-error]

    no member named 'StdSmartPtr' in namespace 'bitsery::ext'

      306 |                                     bitsery::ext::StdSmartPtr{} );
          |                                     ~~~~~~~~~~~~~~^
  • include/geode/mesh/core/edged_curve.hpp:45:11: warning: [cppcoreguidelines-special-member-functions]

    class 'EdgedCurve' defines a destructor, a move constructor and a move assignment operator but does not define a copy constructor or a copy assignment operator

       45 |     class EdgedCurve : public Graph,
          |           ^
  • include/geode/mesh/core/edged_curve.hpp:54:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       54 |         EdgedCurve( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/edged_curve.hpp:56:9: warning: [cppcoreguidelines-explicit-virtual-functions]

    annotate this function with 'override' or (rarely) 'final'

       56 |         ~EdgedCurve();
          |         ^            
          |                       override
  • include/geode/mesh/core/geode/geode_edged_curve.hpp:53:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       53 |         OpenGeodeEdgedCurve( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/geode/geode_graph.hpp:40:30: warning: [cppcoreguidelines-special-member-functions]

    class 'OpenGeodeGraph' defines a destructor, a move constructor and a move assignment operator but does not define a copy constructor or a copy assignment operator

       40 |     class opengeode_mesh_api OpenGeodeGraph : public Graph
          |                              ^
  • include/geode/mesh/core/geode/geode_graph.hpp:48:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       48 |         OpenGeodeGraph( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/geode/geode_graph.hpp:51:9: warning: [cppcoreguidelines-explicit-virtual-functions]

    annotate this function with 'override' or (rarely) 'final'

       51 |         ~OpenGeodeGraph();
          |         ^                
          |                           override
  • include/geode/mesh/core/geode/geode_graph.hpp:70:20: warning: [llvm-qualified-auto]

    'const auto extension' can be declared as 'const auto *const extension'

       70 |             static const auto extension = "og_grp";
          |                    ^~~~~~~~~~
          |                    const auto *const 
  • include/geode/mesh/core/geode/geode_hybrid_solid.hpp:55:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       55 |         OpenGeodeHybridSolid( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/geode/geode_hybrid_solid.hpp:101:57: warning: [cppcoreguidelines-avoid-magic-numbers]

    8 is a magic number; consider replacing it with a named constant

      101 |         void add_hexahedron( const std::array< index_t, 8 >& vertices,
          |                                                         ^
  • include/geode/mesh/core/geode/geode_hybrid_solid.hpp:104:52: warning: [cppcoreguidelines-avoid-magic-numbers]

    6 is a magic number; consider replacing it with a named constant

      104 |         void add_prism( const std::array< index_t, 6 >& vertices,
          |                                                    ^
  • include/geode/mesh/core/geode/geode_hybrid_solid.hpp:107:54: warning: [cppcoreguidelines-avoid-magic-numbers]

    5 is a magic number; consider replacing it with a named constant

      107 |         void add_pyramid( const std::array< index_t, 5 >& vertices,
          |                                                      ^
  • include/geode/mesh/core/geode/geode_point_set.hpp:54:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       54 |         OpenGeodePointSet( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/geode/geode_polygonal_surface.hpp:53:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       53 |         OpenGeodePolygonalSurface( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/geode/geode_polyhedral_solid.hpp:53:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       53 |         OpenGeodePolyhedralSolid( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/geode/geode_polyhedral_solid.hpp:115:9: warning: [modernize-use-nodiscard]

    function 'get_polyhedron_vertex' should be marked [[nodiscard]]

      115 |         index_t get_polyhedron_vertex(
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_polyhedral_solid.hpp:118:9: warning: [modernize-use-nodiscard]

    function 'get_nb_polyhedron_vertices' should be marked [[nodiscard]]

      118 |         local_index_t get_nb_polyhedron_vertices(
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_polyhedral_solid.hpp:121:9: warning: [modernize-use-nodiscard]

    function 'get_nb_polyhedron_facets' should be marked [[nodiscard]]

      121 |         local_index_t get_nb_polyhedron_facets(
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_polyhedral_solid.hpp:124:9: warning: [modernize-use-nodiscard]

    function 'get_nb_polyhedron_facet_vertices' should be marked [[nodiscard]]

      124 |         local_index_t get_nb_polyhedron_facet_vertices(
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_polyhedral_solid.hpp:127:9: warning: [modernize-use-nodiscard]

    function 'get_polyhedron_facet_vertex_id' should be marked [[nodiscard]]

      127 |         PolyhedronVertex get_polyhedron_facet_vertex_id(
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_polyhedral_solid.hpp:131:9: warning: [modernize-use-nodiscard]

    function 'get_polyhedron_adjacent' should be marked [[nodiscard]]

      131 |         std::optional< index_t > get_polyhedron_adjacent(
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_regular_grid_solid.hpp:56:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       56 |         OpenGeodeRegularGrid( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/geode/geode_regular_grid_solid.hpp:60:9: warning: [cppcoreguidelines-explicit-virtual-functions]

    annotate this function with 'override' or (rarely) 'final'

       60 |         ~OpenGeodeRegularGrid();
          |         ^                      
          |                                 override
  • include/geode/mesh/core/geode/geode_regular_grid_solid.hpp:79:20: warning: [llvm-qualified-auto]

    'const auto extension' can be declared as 'const auto *const extension'

       79 |             static const auto extension = "og_rgd3d";
          |                    ^~~~~~~~~~
          |                    const auto *const 
  • include/geode/mesh/core/geode/geode_regular_grid_solid.hpp:100:9: warning: [modernize-use-nodiscard]

    function 'get_polyhedron_vertex' should be marked [[nodiscard]]

      100 |         index_t get_polyhedron_vertex(
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_regular_grid_solid.hpp:103:9: warning: [modernize-use-nodiscard]

    function 'get_polyhedron_facet_vertex_id' should be marked [[nodiscard]]

      103 |         PolyhedronVertex get_polyhedron_facet_vertex_id(
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_regular_grid_solid.hpp:107:9: warning: [modernize-use-nodiscard]

    function 'get_polyhedron_adjacent' should be marked [[nodiscard]]

      107 |         std::optional< index_t > get_polyhedron_adjacent(
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_regular_grid_solid.hpp:110:9: warning: [modernize-use-nodiscard]

    function 'cell_index' should be marked [[nodiscard]]

      110 |         index_t cell_index( const Grid3D::CellIndices& index ) const override;
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_regular_grid_solid.hpp:112:9: warning: [modernize-use-nodiscard]

    function 'cell_indices' should be marked [[nodiscard]]

      112 |         Grid3D::CellIndices cell_indices( index_t index ) const override;
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_regular_grid_solid.hpp:114:9: warning: [modernize-use-nodiscard]

    function 'vertex_index' should be marked [[nodiscard]]

      114 |         index_t vertex_index(
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_regular_grid_solid.hpp:117:9: warning: [modernize-use-nodiscard]

    function 'vertex_indices' should be marked [[nodiscard]]

      117 |         Grid3D::VertexIndices vertex_indices( index_t index ) const override;
          |         ^
          |         [[nodiscard]] 
  • include/geode/mesh/core/geode/geode_regular_grid_surface.hpp:56:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       56 |         OpenGeodeRegularGrid( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/geode/geode_regular_grid_surface.hpp:60:9: warning: [cppcoreguidelines-explicit-virtual-functions]

    annotate this function with 'override' or (rarely) 'final'

       60 |         ~OpenGeodeRegularGrid();
          |         ^                      
          |                                 override
  • include/geode/mesh/core/geode/geode_regular_grid_surface.hpp:79:20: warning: [llvm-qualified-auto]

    'const auto extension' can be declared as 'const auto *const extension'

       79 |             static const auto extension = "og_rgd2d";
          |                    ^~~~~~~~~~
          |                    const auto *const 
  • include/geode/mesh/core/geode/geode_tetrahedral_solid.hpp:55:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       55 |         OpenGeodeTetrahedralSolid( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/geode/geode_triangulated_surface.hpp:55:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       55 |         OpenGeodeTriangulatedSurface( BITSERY bitsery );
          |         ^
          |         explicit 
  • include/geode/mesh/core/geode/geode_vertex_set.hpp:37:1: warning: [llvm-namespace-comment]

    namespace 'geode' not terminated with a closing comment

       37 | }
          | ^
          |   // namespace geode
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/geode/geode_vertex_set.hpp:34:11: note: namespace 'geode' starts here
       34 | namespace geode
          |           ^
  • include/geode/mesh/core/geode/geode_vertex_set.hpp:47:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       47 |         OpenGeodeVertexSet( BITSERY ) {};
          |         ^
          |         explicit 
  • include/geode/mesh/core/geode/geode_vertex_set.hpp:47:37: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       47 |         OpenGeodeVertexSet( BITSERY ) {};
          |                                     ^
          |                                      /*unused*/
  • include/geode/mesh/core/geode/geode_vertex_set.hpp:66:20: warning: [llvm-qualified-auto]

    'const auto extension' can be declared as 'const auto *const extension'

       66 |             static const auto extension = "og_vts";
          |                    ^~~~~~~~~~
          |                    const auto *const 
  • include/geode/mesh/core/graph.hpp:52:21: warning: [bugprone-easily-swappable-parameters]

    2 adjacent parameters of 'EdgeVertex' of convertible types are easily swapped by mistake

       52 |         EdgeVertex( index_t edge_id_in, local_index_t vertex_id_in )
          |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/graph.hpp:52:29: note: the first parameter in the range is 'edge_id_in'
       52 |         EdgeVertex( index_t edge_id_in, local_index_t vertex_id_in )
          |                             ^~~~~~~~~~
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/graph.hpp:52:55: note: the last parameter in the range is 'vertex_id_in'
       52 |         EdgeVertex( index_t edge_id_in, local_index_t vertex_id_in )
          |                                                       ^~~~~~~~~~~~
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/graph.hpp:52:21: note: 
       52 |         EdgeVertex( index_t edge_id_in, local_index_t vertex_id_in )
          |                     ^
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/graph.hpp:52:41: note: 'index_t' and 'local_index_t' may be implicitly converted: 'index_t' (as 'unsigned int') -> 'local_index_t' (as 'unsigned char'), 'local_index_t' (as 'unsigned char') -> 'index_t' (as 'unsigned int')
       52 |         EdgeVertex( index_t edge_id_in, local_index_t vertex_id_in )
          |                                         ^
  • include/geode/mesh/core/graph.hpp:85:18: warning: [readability-identifier-naming]

    invalid case style for global function 'AbslHashValue'

       85 |         friend H AbslHashValue( H h, const EdgeVertex& value )
          |                  ^~~~~~~~~~~~~
          |                  absl_hash_value
  • include/geode/mesh/core/graph.hpp:85:35: warning: [readability-identifier-length]

    parameter name 'h' is too short, expected at least 3 characters

       85 |         friend H AbslHashValue( H h, const EdgeVertex& value )
          |                                   ^
  • include/geode/mesh/core/graph.hpp:108:30: warning: [cppcoreguidelines-special-member-functions]

    class 'Graph' defines a destructor, a move constructor and a move assignment operator but does not define a copy constructor or a copy assignment operator

      108 |     class opengeode_mesh_api Graph : public VertexSet
          |                              ^
  • include/geode/mesh/core/graph.hpp:115:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

      115 |         Graph( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/graph.hpp:117:9: warning: [cppcoreguidelines-explicit-virtual-functions]

    annotate this function with 'override' or (rarely) 'final'

      117 |         ~Graph();
          |         ^       
          |                  override
  • include/geode/mesh/core/graph.hpp:172:21: warning: [readability-identifier-length]

    parameter name 'v0' is too short, expected at least 3 characters

      172 |             index_t v0, index_t v1 ) const;
          |                     ^
  • include/geode/mesh/core/graph.hpp:172:33: warning: [readability-identifier-length]

    parameter name 'v1' is too short, expected at least 3 characters

      172 |             index_t v0, index_t v1 ) const;
          |                                 ^
  • include/geode/mesh/core/hybrid_solid.hpp:39:11: warning: [cppcoreguidelines-special-member-functions]

    class 'HybridSolid' defines a copy constructor, a copy assignment operator, a move constructor and a move assignment operator but does not define a destructor

       39 |     class HybridSolid : public SolidMesh< dimension >
          |           ^
  • include/geode/mesh/core/hybrid_solid.hpp:48:21: warning: [performance-enum-size]

    enum 'TYPE' uses a larger base type ('int', size: 4 bytes) than necessary for its value set, consider using 'std::uint8_t' (1 byte) as the base type to reduce its size

       48 |         enum struct TYPE
          |                     ^
  • include/geode/mesh/core/hybrid_solid.hpp:56:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       56 |         HybridSolid( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/internal/edges_impl.hpp:33:1: warning: [modernize-concat-nested-namespaces]

    nested namespaces can be concatenated

       33 | namespace geode
          | ^~~~~~~~~~~~~~~
       34 | {
          | ~
       35 |     namespace internal
          |     ~~~~~~~~~~~~~~~~~~
          |     namespace geode::internal
  • include/geode/mesh/core/internal/edges_impl.hpp:37:15: warning: [cppcoreguidelines-pro-type-member-init]

    constructor does not initialize these fields: edges_

       37 |         class EdgesImpl
          |               ^
  • include/geode/mesh/core/internal/edges_impl.hpp:42:13: warning: [cppcoreguidelines-pro-type-member-init]

    constructor does not initialize these fields: edges_

       42 |             explicit EdgesImpl( Graph& graph ) : edges_()
          |             ^
  • include/geode/mesh/core/internal/edges_impl.hpp:46:53: error: [clang-diagnostic-error]

    use of undeclared identifier 'VariableAttribute'

       46 |                         .template create_attribute< VariableAttribute,
          |                                                     ^
  • include/geode/mesh/core/internal/edges_impl.hpp:47:57: warning: [clang-diagnostic-unused-value]

    left operand of comma operator has no effect

       47 |                             std::array< index_t, 2 > >( "edges",
          |                                                         ^~~~~~~
  • include/geode/mesh/core/internal/edges_impl.hpp:48:69: error: [clang-diagnostic-error]

    expected ')'

       48 |                             std::array< index_t, 2 >{ NO_ID, NO_ID },
          |                                                                     ^
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/internal/edges_impl.hpp:47:55: note: to match this '('
       47 |                             std::array< index_t, 2 > >( "edges",
          |                                                       ^
  • include/geode/mesh/core/internal/edges_impl.hpp:52:51: error: [clang-diagnostic-error]

    use of undeclared identifier 'VariableAttribute'

       52 |                         .template find_attribute< VariableAttribute,
          |                                                   ^
  • include/geode/mesh/core/internal/edges_impl.hpp:90:61: error: [clang-diagnostic-error]

    no member named 'StdSmartPtr' in namespace 'bitsery::ext'

       90 |                                  impl.edges_, bitsery::ext::StdSmartPtr{} );
          |                                               ~~~~~~~~~~~~~~^
  • include/geode/mesh/core/internal/edges_impl.hpp:100:64: error: [clang-diagnostic-error]

    no member named 'StdSmartPtr' in namespace 'bitsery::ext'

      100 |                                     impl.edges_, bitsery::ext::StdSmartPtr{} );
          |                                                  ~~~~~~~~~~~~~~^
  • include/geode/mesh/core/internal/edges_impl.hpp:105:30: error: [clang-diagnostic-error]

    use of undeclared identifier 'VariableAttribute'

      105 |             std::shared_ptr< VariableAttribute< std::array< index_t, 2 > > >
          |                              ^
  • include/geode/mesh/core/internal/edges_impl.hpp:106:17: warning: [clang-diagnostic-unused-private-field]

    private field 'edges_' is not used

      106 |                 edges_;
          |                 ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:33:1: warning: [modernize-concat-nested-namespaces]

    nested namespaces can be concatenated

       33 | namespace geode
          | ^~~~~~~~~~~~~~~
       34 | {
          | ~
       35 |     namespace internal
          |     ~~~~~~~~~~~~~~~~~~
          |     namespace geode::internal
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:47:13: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       47 |             FacetEdgesImpl( BITSERY bitsery )
          |             ^
          |             explicit 
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:47:29: error: [clang-diagnostic-error]

    unknown type name 'BITSERY'

       47 |             FacetEdgesImpl( BITSERY bitsery )
          |                             ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:55:30: error: [clang-diagnostic-error]

    no member named 'find_facet' in 'FacetEdgesImpl'

       55 |                 return this->find_facet( EdgesVertexCycle{ edge_vertices } );
          |                        ~~~~  ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:61:30: error: [clang-diagnostic-error]

    no member named 'add_facet' in 'FacetEdgesImpl'

       61 |                 return this->add_facet(
          |                        ~~~~  ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:62:39: warning: [hicpp-move-const-arg]

    std::move of the variable 'edge_vertices' of the trivially-copyable type 'std::array<index_t, 2>' (aka 'array<unsigned int, 2>') has no effect; remove std::move()

       62 |                     EdgesVertexCycle{ std::move( edge_vertices ) } );
          |                                       ^~~~~~~~~~               ~
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:68:30: error: [clang-diagnostic-error]

    no member named 'get_facet_vertices' in 'FacetEdgesImpl'

       68 |                 return this->get_facet_vertices( edge_id );
          |                        ~~~~  ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:76:30: error: [clang-diagnostic-error]

    no member named 'update_facet_vertex' in 'FacetEdgesImpl'; did you mean 'update_edge_vertex'?

       76 |                 return this->update_facet_vertex(
          |                              ^~~~~~~~~~~~~~~~~~~
          |                              update_edge_vertex
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/internal/facet_edges_impl.hpp:71:41: note: 'update_edge_vertex' declared here
       71 |             BijectiveMapping< index_t > update_edge_vertex(
          |                                         ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:83:30: error: [clang-diagnostic-error]

    no member named 'update_facet_vertices' in 'FacetEdgesImpl'; did you mean 'update_edge_vertices'?

       83 |                 return this->update_facet_vertices( old2new );
          |                              ^~~~~~~~~~~~~~~~~~~~~
          |                              update_edge_vertices
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/internal/facet_edges_impl.hpp:80:36: note: 'update_edge_vertices' declared here
       80 |             std::vector< index_t > update_edge_vertices(
          |                                    ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:88:23: error: [clang-diagnostic-error]

    no member named 'remove_facet' in 'FacetEdgesImpl'; did you mean 'remove_edge'?

       88 |                 this->remove_facet(
          |                       ^~~~~~~~~~~~
          |                       remove_edge
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/internal/facet_edges_impl.hpp:86:18: note: 'remove_edge' declared here
       86 |             void remove_edge( std::array< index_t, 2 > edge_vertices )
          |                  ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:89:39: warning: [hicpp-move-const-arg]

    std::move of the variable 'edge_vertices' of the trivially-copyable type 'std::array<index_t, 2>' (aka 'array<unsigned int, 2>') has no effect; remove std::move()

       89 |                     EdgesVertexCycle{ std::move( edge_vertices ) } );
          |                                       ^~~~~~~~~~               ~
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:95:30: error: [clang-diagnostic-error]

    no member named 'delete_facets' in 'FacetEdgesImpl'; did you mean 'delete_edges'?

       95 |                 return this->delete_facets( to_delete );
          |                              ^~~~~~~~~~~~~
          |                              delete_edges
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/internal/facet_edges_impl.hpp:92:36: note: 'delete_edges' declared here
       92 |             std::vector< index_t > delete_edges(
          |                                    ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:100:30: error: [clang-diagnostic-error]

    no member named 'clean_facets' in 'FacetEdgesImpl'

      100 |                 return this->clean_facets();
          |                        ~~~~  ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:105:30: error: [clang-diagnostic-error]

    no member named 'get_counter' in 'FacetEdgesImpl'

      105 |                 return this->get_counter( edge_id ) == 0;
          |                        ~~~~  ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:110:24: error: [clang-diagnostic-error]

    use of undeclared identifier 'facet_attribute_manager'; did you mean 'edge_attribute_manager'?

      110 |                 return facet_attribute_manager();
          |                        ^~~~~~~~~~~~~~~~~~~~~~~
          |                        edge_attribute_manager
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/internal/facet_edges_impl.hpp:108:45: note: 'edge_attribute_manager' declared here
      108 |             [[nodiscard]] AttributeManager& edge_attribute_manager() const
          |                                             ^
  • include/geode/mesh/core/internal/facet_edges_impl.hpp:116:23: error: [clang-diagnostic-error]

    no member named 'overwrite' in 'FacetEdgesImpl'

      116 |                 this->overwrite( from );
          |                 ~~~~  ^
  • include/geode/mesh/core/internal/points_impl.hpp:39:1: warning: [modernize-concat-nested-namespaces]

    nested namespaces can be concatenated

       39 | namespace geode
          | ^~~~~~~~~~~~~~~
       40 | {
          | ~
       41 |     namespace internal
          |     ~~~~~~~~~~~~~~~~~~
          |     namespace geode::internal
  • include/geode/mesh/core/internal/points_impl.hpp:71:17: warning: [cppcoreguidelines-prefer-member-initializer]

    'points_' should be initialized in a member initializer of the constructor

       69 |                 AttributeManager& manager, const geode::uuid& attribute_id )
          |                                                                             
       70 |             {
       71 |                 points_ = manager.template find_attribute< VariableAttribute,
          |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       72 |                     Point< dimension > >( attribute_id );
          |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • include/geode/mesh/core/internal/texture_impl.hpp:36:1: warning: [modernize-concat-nested-namespaces]

    nested namespaces can be concatenated

       36 | namespace geode
          | ^~~~~~~~~~~~~~~
       37 | {
          | ~
       38 |     namespace internal
          |     ~~~~~~~~~~~~~~~~~~
          |     namespace geode::internal
  • include/geode/mesh/core/internal/texture_impl.hpp:47:38: warning: [readability-identifier-naming]

    invalid case style for private member 'DEFAULT_COORD'

       47 |             const Point< dimension > DEFAULT_COORD;
          |                                      ^~~~~~~~~~~~~
          |                                      DEFAULT_COORD_
  • include/geode/mesh/core/internal/texture_impl.hpp:67:17: warning: [bugprone-easily-swappable-parameters]

    2 adjacent parameters of 'texture_coordinates_impl' of convertible types are easily swapped by mistake

       67 |                 index_t element, local_index_t vertex ) const
          |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/internal/texture_impl.hpp:67:25: note: the first parameter in the range is 'element'
       67 |                 index_t element, local_index_t vertex ) const
          |                         ^~~~~~~
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/internal/texture_impl.hpp:67:48: note: the last parameter in the range is 'vertex'
       67 |                 index_t element, local_index_t vertex ) const
          |                                                ^~~~~~
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/internal/texture_impl.hpp:67:17: note: 
       67 |                 index_t element, local_index_t vertex ) const
          |                 ^
    /__w/OpenGeode/OpenGeode/include/geode/mesh/core/internal/texture_impl.hpp:67:34: note: 'index_t' and 'local_index_t' may be implicitly converted: 'index_t' (as 'unsigned int') -> 'local_index_t' (as 'unsigned char'), 'local_index_t' (as 'unsigned char') -> 'index_t' (as 'unsigned int')
       67 |                 index_t element, local_index_t vertex ) const
          |                                  ^
  • include/geode/mesh/core/polygonal_surface.hpp:44:11: warning: [cppcoreguidelines-special-member-functions]

    class 'PolygonalSurface' defines a move constructor and a move assignment operator but does not define a destructor, a copy constructor or a copy assignment operator

       44 |     class PolygonalSurface : public SurfaceMesh< dimension >
          |           ^
  • include/geode/mesh/core/polygonal_surface.hpp:50:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       50 |         PolygonalSurface( BITSERY );
          |         ^
          |         explicit 
  • include/geode/mesh/core/solid_mesh.hpp:93:35: warning: [readability-identifier-length]

    parameter name 'h' is too short, expected at least 3 characters

       93 |         friend H AbslHashValue( H h, const PolyhedronVertex& value )
          |                                   ^

Have any feedback or feature suggestions? Share it here.

Comment thread include/geode/basic/attribute.hpp Outdated
Comment thread include/geode/basic/attribute_manager.hpp Outdated
Comment thread include/geode/basic/attribute_manager.hpp Outdated
Comment thread include/geode/basic/attribute_manager.hpp Outdated
Comment thread include/geode/basic/attribute_manager.hpp Outdated
Comment thread include/geode/basic/attribute_manager.hpp Outdated
Comment thread include/geode/basic/attribute_manager.hpp Outdated
Comment thread include/geode/basic/constant_attribute.hpp
Comment thread include/geode/basic/constant_attribute.hpp
Comment thread include/geode/basic/attribute_manager.hpp Outdated
Comment thread include/geode/basic/attribute_manager.hpp Outdated
Comment thread include/geode/basic/attribute_manager.hpp Outdated
Comment thread include/geode/basic/attribute_manager.hpp Outdated
Comment thread include/geode/basic/attribute_manager.hpp Outdated
BenPinet added 9 commits June 19, 2026 16:16
BREAKING CHANGE: attribute are now identified with uuid instead of strings which changes a lot of input parameters for attribute mananger methods. Also find_or_create_attribute was divided into two differents methods find_attribute and create_attribute
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.

3 participants