A lightweight library for converting complex objects to and from simple Python datatypes.
This report summarizes scanner evidence for marshmallow-code/marshmallow, a Python project with 7,243 GitHub stars. SynthScan examined 16,151 lines of code across 51 source files, recording 547 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 30.1 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 499 finding(s).
Are imports declared and package/API names verified? 40 finding(s).
Are wrappers, guards, and repeated structures necessary? 497 finding(s).
Which changes need focused human review? 547 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 547 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_deserialization.py | 51 | def test_fields_allow_none_deserialize_to_none(self, FieldClass): | CODE |
| LOW⚡ | tests/test_deserialization.py | 57 | def test_fields_dont_allow_none_by_default(self, FieldClass): | CODE |
| LOW⚡ | tests/test_deserialization.py | 62 | def test_allow_none_is_true_if_missing_is_true(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 67 | def test_list_field_deserialize_none_to_none(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 71 | def test_tuple_field_deserialize_none_to_none(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 75 | def test_list_of_nested_allow_none_deserialize_none_to_none(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 79 | def test_list_of_nested_non_allow_none_deserialize_none_to_validation_error(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 86 | def test_float_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 92 | def test_invalid_float_field_deserialization(self, in_val): | CODE |
| LOW⚡ | tests/test_deserialization.py | 98 | def test_float_field_overflow(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 104 | def test_integer_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 401 | def test_boolean_field_deserialization_with_empty_truthy(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 407 | def test_boolean_field_deserialization_with_custom_falsy_values(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 412 | def test_field_toggle_show_invalid_value_in_error_message(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 595 | def test_boolean_timestamp_field_deserialization(self, fmt, in_value): | CODE |
| LOW⚡ | tests/test_deserialization.py | 605 | def test_invalid_timestamp_field_deserialization(self, fmt, in_value): | CODE |
| LOW⚡ | tests/test_deserialization.py | 615 | def test_oversized_timestamp_field_deserialization(self, fmt, mock_fromtimestamp): | CODE |
| LOW⚡ | tests/test_deserialization.py | 657 | def test_naive_datetime_with_timezone(self, fmt, timezone, value, expected): | CODE |
| LOW⚡ | tests/test_deserialization.py | 666 | def test_aware_datetime_default_timezone(self, fmt, timezone, value): | CODE |
| LOW⚡ | tests/test_deserialization.py | 672 | def test_time_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 717 | def test_iso_time_field_deserialization(self, fmt, value, expected): | CODE |
| LOW⚡ | tests/test_deserialization.py | 724 | def test_invalid_timedelta_precision(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 728 | def test_timedelta_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 975 | def test_url_field_non_list_validators(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 980 | def test_relative_url_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 984 | def test_url_field_schemes_argument(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 992 | def test_email_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1005 | def test_email_field_non_list_validators(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1010 | def test_function_field_deserialization_is_noop_by_default(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1016 | def test_function_field_deserialization_with_callable(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1020 | def test_function_field_deserialization_missing_with_length_validator(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1027 | def test_function_field_passed_deserialize_only_is_load_only(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1031 | def test_function_field_passed_deserialize_and_serialize_is_not_load_only(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1037 | def test_uuid_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1200 | def test_enum_field_by_symbol_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1204 | def test_enum_field_by_symbol_invalid_value(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1212 | def test_enum_field_by_symbol_rejects_non_member_attributes(self, non_member): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1219 | def test_enum_field_by_symbol_not_string(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1224 | def test_enum_field_by_value_true_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1230 | def test_enum_field_by_value_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1238 | def test_enum_field_by_value_true_invalid_value(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1287 | def test_enum_by_value_allow_none_default(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1291 | def test_deserialization_function_must_be_callable(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1295 | def test_method_field_deserialization_is_noop_by_default(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1305 | def test_deserialization_method(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1318 | def test_deserialization_method_must_be_a_method(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1325 | def test_method_field_deserialize_only(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1334 | def test_datetime_list_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1343 | def test_list_field_deserialize_invalid_item(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1415 | def test_tuple_field_deserialize_value_that_is_not_a_collection(self, value): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1421 | def test_tuple_field_deserialize_invalid_length(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1427 | def test_constant_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1431 | def test_constant_is_always_included_in_deserialized_data(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1439 | def test_constant_none_allows_none_value(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1448 | def test_constant_with_required(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1456 | def test_field_deserialization_with_user_validator_function(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1464 | def test_field_deserialization_with_user_validator_that_raises_error_with_list( | CODE |
| LOW⚡ | tests/test_deserialization.py | 1703 | def test_nested_none_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1713 | def test_deserialize_with_attribute_param(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1724 | def test_deserialize_with_attribute_param_symmetry(self): | CODE |
| 427 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_registry.py | 192 | CODE | |
| LOW | tests/test_registry.py | 207 | CODE | |
| LOW | tests/test_registry.py | 214 | CODE | |
| LOW | tests/test_utils.py | 1 | CODE | |
| LOW | tests/mypy_test_cases/test_validation_error.py | 1 | CODE | |
| LOW | examples/flask_example.py | 10 | CODE | |
| LOW | src/marshmallow/fields.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 1 | CODE | |
| LOW | src/marshmallow/__init__.py | 1 | CODE | |
| LOW | src/marshmallow/__init__.py | 1 | CODE | |
| LOW | src/marshmallow/__init__.py | 1 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 10 | CODE | |
| LOW | src/marshmallow/__init__.py | 11 | CODE | |
| LOW | src/marshmallow/__init__.py | 11 | CODE | |
| LOW | src/marshmallow/__init__.py | 13 | CODE | |
| LOW | src/marshmallow/types.py | 8 | CODE | |
| LOW | src/marshmallow/validate.py | 3 | CODE | |
| LOW | src/marshmallow/class_registry.py | 12 | CODE | |
| LOW | src/marshmallow/utils.py | 3 | CODE | |
| LOW | src/marshmallow/exceptions.py | 3 | CODE | |
| LOW | src/marshmallow/schema.py | 4 | CODE | |
| LOW | src/marshmallow/decorators.py | 68 | CODE | |
| LOW | src/marshmallow/experimental/context.py | 31 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/marshmallow/fields.py | 26 | except ImportError: | CODE |
| HIGH | src/marshmallow/validate.py | 583 | except TypeError: | CODE |
| HIGH | src/marshmallow/schema.py | 189 | except AttributeError: | CODE |
| HIGH | src/marshmallow/schema.py | 1162 | except KeyError: | CODE |
| HIGH | src/marshmallow/schema.py | 1147 | except KeyError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_deserialization.py | 994 | assert field.deserialize("foo@bar.com") == "foo@bar.com" | CODE |
| LOW⚡ | tests/test_deserialization.py | 1001 | field.deserialize("foo@bar.com") | CODE |
| LOW⚡ | tests/test_deserialization.py | 1718 | data = {"username": "foo@bar.com", "years": "42"} | CODE |
| LOW⚡ | tests/test_deserialization.py | 1720 | assert result["email"] == "foo@bar.com" | CODE |
| LOW⚡ | tests/test_deserialization.py | 1769 | data = {"Name": "Mick", "UserName": "foo@bar.com", "years": "42"} | CODE |
| LOW⚡ | tests/test_deserialization.py | 1772 | assert result["email"] == "foo@bar.com" | CODE |
| LOW⚡ | tests/test_deserialization.py | 1857 | {"email": "foo@bar.com", "colors": "red", "age": 18}, | CODE |
| LOW⚡ | tests/test_schema.py | 574 | "email": "foo@bar.com", | CODE |
| LOW | tests/test_validate.py | 337 | "!#$%&'*+-/=?^_`{}|~@example.org", | CODE |
| LOW | tests/test_validate.py | 360 | '" "@example.org', | CODE |
| LOW⚡ | tests/test_serialization.py | 42 | return User("Foo", email="foo@bar.com", age=42) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_fields.py | 313 | CODE | |
| LOW | src/marshmallow/fields.py | 567 | CODE | |
| LOW | src/marshmallow/fields.py | 1688 | CODE | |
| LOW | src/marshmallow/error_store.py | 37 | CODE | |
| LOW | src/marshmallow/schema.py | 597 | CODE | |
| LOW | src/marshmallow/schema.py | 773 | CODE | |
| LOW | src/marshmallow/schema.py | 1124 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | examples/inflection_example.py | 24 | # ----------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | examples/flask_example.py | 144 | # Create a new author | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/base.py | 104 | CODE | |
| LOW | src/marshmallow/fields.py | 192 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/marshmallow/fields.py | 44 | __all__ = [ | CODE |
| LOW | src/marshmallow/__init__.py | 15 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/marshmallow/orderedset.py | 1 | # OrderedSet | COMMENT |
| LOW | src/marshmallow/class_registry.py | 41 | register("MyClass", MyClass) | COMMENT |