{"results":{"result":{"added-files":{"code-health":9.792623515479452,"old-code-health":0.0,"files":[{"file":"lib/open_api_typesense/operations/nl_search_models.ex","loc":132,"code-health":9.096655465156704},{"file":"lib/open_api_typesense/schemas/nl_search_model_create_schema.ex","loc":74,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/nl_search_model_delete_schema.ex","loc":14,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/nl_search_model_schema.ex","loc":14,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_request_params.ex","loc":24,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_request_params_voice_query.ex","loc":14,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_result_hit_hybrid_search_info.ex","loc":14,"code-health":10.0},{"file":"test/operations/nl_search_models_test.exs","loc":10,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/analytics_event.ex","loc":18,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/analytics_event_data.ex","loc":20,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/analytics_events_response.ex","loc":45,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/analytics_events_response_events.ex","loc":32,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/analytics_rule.ex","loc":28,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/analytics_rule_create.ex","loc":28,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/analytics_rule_update.ex","loc":18,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/analytics_rule_update_params.ex","loc":38,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/analytics_status.ex","loc":38,"code-health":10.0},{"file":"lib/open_api_typesense/schemas/drop_tokens_mode.ex","loc":14,"code-health":10.0}]},"external-review-url":"https://github.com/jaeyson/open_api_typesense/pull/35","old-code-health":9.650959099312871,"modified-files":{"code-health":9.63365961146436,"old-code-health":9.650959099312871,"files":[{"file":"lib/open_api_typesense/client.ex","loc":177,"old-loc":142,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/operations/conversations.ex","loc":129,"old-loc":133,"code-health":9.096655465156704,"old-code-health":9.096655465156704},{"file":"lib/open_api_typesense/operations/curation.ex","loc":87,"old-loc":88,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/collection_response.ex","loc":81,"old-loc":75,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/collection_schema.ex","loc":75,"old-loc":69,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/collection_update_schema.ex","loc":49,"old-loc":45,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/multi_search_result_item.ex","loc":93,"old-loc":87,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/multi_search_searches_parameter.ex","loc":48,"old-loc":48,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_parameters.ex","loc":230,"old-loc":218,"code-health":9.581652546385712,"old-code-health":9.603465296750686},{"file":"lib/open_api_typesense/schemas/search_result.ex","loc":87,"old-loc":81,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_result_hit.ex","loc":75,"old-loc":69,"code-health":10.0,"old-code-health":10.0},{"file":"mix.exs","loc":101,"old-loc":107,"code-health":10.0,"old-code-health":10.0},{"file":"test/operations/stemming_test.exs","loc":92,"old-loc":90,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/operations/analytics.ex","loc":229,"old-loc":158,"code-health":8.816158827775617,"old-code-health":9.096655465156704},{"file":"lib/open_api_typesense/operations/operations.ex","loc":175,"old-loc":182,"code-health":9.096655465156704,"old-code-health":9.096655465156704},{"file":"lib/open_api_typesense/schemas/multi_search_collection_parameters.ex","loc":218,"old-loc":215,"code-health":9.603465296750686,"old-code-health":9.608927141875917},{"file":"lib/open_api_typesense/schemas/voice_query_model_collection_config.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"test/operations/analytics_test.exs","loc":203,"old-loc":208,"code-health":10.0,"old-code-health":10.0},{"file":"test/operations/collections_test.exs","loc":165,"old-loc":150,"code-health":8.545379580978913,"old-code-health":8.816158827775617},{"file":"test/operations/operations_test.exs","loc":86,"old-loc":76,"code-health":8.816158827775617,"old-code-health":9.096655465156704},{"file":"test/operations/override_test.exs","loc":27,"old-loc":19,"code-health":10.0,"old-code-health":10.0},{"file":"test/connection_test.exs","loc":100,"old-loc":100,"code-health":10.0,"old-code-health":10.0},{"file":"test/custom_client_test.exs","loc":95,"old-loc":95,"code-health":10.0,"old-code-health":10.0},{"file":"test/default_client_test.exs","loc":42,"old-loc":42,"code-health":10.0,"old-code-health":10.0},{"file":"test/operations/conversations_test.exs","loc":102,"old-loc":103,"code-health":10.0,"old-code-health":10.0},{"file":"test/operations/debug_test.exs","loc":22,"old-loc":22,"code-health":10.0,"old-code-health":10.0},{"file":"test/operations/documents_test.exs","loc":449,"old-loc":448,"code-health":9.387218218812514,"old-code-health":9.387218218812514},{"file":"test/operations/health_test.exs","loc":58,"old-loc":58,"code-health":10.0,"old-code-health":10.0},{"file":"test/operations/join_test.exs","loc":620,"old-loc":621,"code-health":10.0,"old-code-health":10.0},{"file":"test/operations/keys_test.exs","loc":77,"old-loc":78,"code-health":10.0,"old-code-health":10.0},{"file":"test/operations/presets_test.exs","loc":77,"old-loc":77,"code-health":10.0,"old-code-health":10.0},{"file":"test/operations/stopwords_test.exs","loc":75,"old-loc":76,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/plugins/renderer.ex","loc":348,"old-loc":348,"code-health":9.54361322135008,"old-code-health":9.473415538276296},{"file":"lib/open_api_typesense/operations/collections.ex","loc":229,"old-loc":243,"code-health":8.816158827775617,"old-code-health":8.816158827775617},{"file":"lib/open_api_typesense/operations/debug.ex","loc":33,"old-loc":34,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/operations/documents.ex","loc":421,"old-loc":441,"code-health":8.283981080161325,"old-code-health":8.283981080161325},{"file":"lib/open_api_typesense/operations/health.ex","loc":22,"old-loc":24,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/operations/keys.ex","loc":90,"old-loc":93,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/operations/override.ex","loc":31,"old-loc":33,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/operations/presets.ex","loc":98,"old-loc":101,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/operations/stemming.ex","loc":83,"old-loc":91,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/operations/stopwords.ex","loc":107,"old-loc":110,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/operations/synonyms.ex","loc":112,"old-loc":115,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/api_key.ex","loc":30,"old-loc":30,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/api_key_delete_response.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/api_key_schema.ex","loc":26,"old-loc":26,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/api_response.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/api_stats_response.ex","loc":56,"old-loc":56,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/collection_alias.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/collection_alias_schema.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/conversation_model_create_schema.ex","loc":44,"old-loc":44,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/conversation_model_schema.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/conversation_model_update_schema.ex","loc":44,"old-loc":44,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/facet_counts.ex","loc":53,"old-loc":53,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/facet_counts_counts.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/facet_counts_stats.ex","loc":26,"old-loc":20,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/field.ex","loc":74,"old-loc":74,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/field_embed.ex","loc":17,"old-loc":17,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/field_embed_model_config.ex","loc":47,"old-loc":47,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/multi_search_result.ex","loc":51,"old-loc":51,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/preset_delete_schema.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/preset_schema.ex","loc":27,"old-loc":27,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/schema_change_status.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_highlight.ex","loc":30,"old-loc":30,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_override.ex","loc":87,"old-loc":87,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_override_delete_response.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_override_exclude.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_override_include.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_override_rule.ex","loc":19,"old-loc":24,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_override_schema.ex","loc":84,"old-loc":84,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_result_conversation.ex","loc":19,"old-loc":24,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_result_hit_text_match_info.ex","loc":38,"old-loc":38,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_synonym.ex","loc":26,"old-loc":26,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_synonym_delete_response.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/search_synonym_schema.ex","loc":19,"old-loc":24,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/stemming_dictionary.ex","loc":45,"old-loc":45,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/stemming_dictionary_words.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/stopwords_set_retrieve_schema.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/stopwords_set_schema.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0},{"file":"lib/open_api_typesense/schemas/stopwords_set_upsert_schema.ex","loc":14,"old-loc":14,"code-health":10.0,"old-code-health":10.0}]},"removed-files":{"code-health":0.0,"old-code-health":0.0,"files":[]},"external-review-id":"35","analysis-time":"2026-04-05T15:37:23Z","negative-impact-count":0,"suppressions":{"number-of-types":2,"number-of-files-touched":3,"findings":[{"why-it-occurs":"Duplicated code often leads to code that's harder to change since the same logical change has to be done in multiple functions. More duplication gives lower code health.","name":"Code Duplication","file":"lib/open_api_typesense/operations/analytics.ex","change-level":"warning","is-hotspot?":true,"reason":"I just followed the original open api spec from another repo, and it has no duplications or redundancy when it comes to function definitions","suppressed-by":"jaeyson","line":122,"what-changed":"introduced similar code in: flush_analytics,get_analytics_events,get_analytics_status","how-to-fix":"A certain degree of duplicated code might be acceptable. The problems start when it is the same behavior that is duplicated across the functions in the module, ie. a violation of the Don't Repeat Yourself (DRY) principle. DRY violations lead to code that is changed together in predictable patterns, which is both expensive and risky. DRY violations can be identified using CodeScene's X-Ray analysis to detect clusters of change coupled functions with high code similarity. [Read More](https://codescene.com/blog/software-revolution-part3/)\n\nOnce you have identified the similarities across functions, look to extract and encapsulate the concept that varies into its own function(s). These shared abstractions can then be re-used, which minimizes the amount of duplication and simplifies change.","change-type":"degraded","suppressed-date":"2025-10-01T05:33:14.000Z","suppression":{"updated-at":"2025-10-01T05:33:14Z","fn-name":null,"biomarker":"Code Duplication","reason":"I just followed the original open api spec from another repo, and it has no duplications or redundancy when it comes to function definitions","suppressed-by":"jaeyson","line":null,"id":34023,"file-name":"lib/open_api_typesense/operations/analytics.ex"}},{"why-it-occurs":"Measures the number of lines with consecutive assert statements in a unit test. The more consecutive assert statements, the lower the code health. The threshold for the Elixir language is 4 consecutive lines of assert statements.","name":"Large Assertion Blocks","file":"test/operations/collections_test.exs","change-level":"warning","is-hotspot?":true,"reason":"Large test blocks has nothing to do with this warning","suppressed-by":"jaeyson","line":60,"what-changed":"The number of large assertion blocks increases from 4 to 5, threshold = 4","how-to-fix":"Consider to encapsulate the assertions (i.e. test criteria) in a custom assert statement. This simplifies the test by letting you communicate the test criteria in the language of your domain.  We also recommend to consider the granularity of the tests; sometimes a single test tests too many things; extracting smaller tests often help to simplify the test criteria. Finally, large assertion blocks can also signal missing functionality in the code under test: instead of fetching and comparing individual properties of an object, maybe that class should encapsulate what equality means in an Equals() method?","change-type":"degraded","suppressed-date":"2025-12-15T02:43:10.000Z","suppression":{"updated-at":"2025-12-15T02:43:10Z","fn-name":null,"biomarker":"Large Assertion Blocks","reason":"Large test blocks has nothing to do with this warning","suppressed-by":"jaeyson","line":null,"id":41943,"file-name":"test/operations/collections_test.exs"}},{"why-it-occurs":"Measures the number of lines with consecutive assert statements in a unit test. The more consecutive assert statements, the lower the code health. The threshold for the Elixir language is 4 consecutive lines of assert statements.","name":"Large Assertion Blocks","file":"test/operations/operations_test.exs","change-level":"warning","is-hotspot?":true,"reason":"Not really large blocks for assert as we only separate them by each lines","suppressed-by":"jaeyson","line":20,"what-changed":"The number of large assertion blocks increases from 6 to 7, threshold = 4","how-to-fix":"Consider to encapsulate the assertions (i.e. test criteria) in a custom assert statement. This simplifies the test by letting you communicate the test criteria in the language of your domain.  We also recommend to consider the granularity of the tests; sometimes a single test tests too many things; extracting smaller tests often help to simplify the test criteria. Finally, large assertion blocks can also signal missing functionality in the code under test: instead of fetching and comparing individual properties of an object, maybe that class should encapsulate what equality means in an Equals() method?","change-type":"degraded","suppressed-date":"2026-03-08T14:14:30.000Z","suppression":{"updated-at":"2026-03-08T14:14:30Z","fn-name":null,"biomarker":"Large Assertion Blocks","reason":"Not really large blocks for assert as we only separate them by each lines","suppressed-by":"jaeyson","line":null,"id":48432,"file-name":"test/operations/operations_test.exs"}}]},"affected-hotspots":29,"commits":["17550c1a7d61b33eeb7fe3f20c42c3d288ee89c1","9413686df0137473e5b1b902ad02539eca1b50ad","fd8530ad930831f8bf1e8975d0432f84258b9cf2","d8293712f0a777fa5051015650a47e460329f236","f6c915ef2ce2fea3fefe0649064399c788e53bde","d7645d2a8033d6717c3a90d759f909450e42df7e","3de11a35906902355668e5a183e7b77cd92e1758","db9e9bca623d0f533de748554886ab732be5cafe","ec61d5c2115a56b28f736a96b678b02b6c3da2d4","486446f3b26674873e15fe09b15a0271c951bc20","21e83a12960acfc5a1ef2d548b0fb6b6516aed2d"],"is-negative-review":false,"negative-findings":{"number-of-types":0,"number-of-files-touched":0,"findings":[]},"positive-impact-count":3,"repo":"open_api_typesense","code-health":9.646023231754997,"version":"3.0","authors":["jaeyson"],"directives":{"added":[],"removed":[]},"positive-findings":{"number-of-types":2,"number-of-files-touched":3,"findings":[{"method":"create_analytics_rule","why-it-occurs":"Duplicated code often leads to code that's harder to change since the same logical change has to be done in multiple functions. More duplication gives lower code health.","name":"Code Duplication","file":"lib/open_api_typesense/operations/analytics.ex","change-level":"improvement","is-hotspot?":true,"what-changed":"reduced similar code in: create_analytics_rule","how-to-fix":"A certain degree of duplicated code might be acceptable. The problems start when it is the same behavior that is duplicated across the functions in the module, ie. a violation of the Don't Repeat Yourself (DRY) principle. DRY violations lead to code that is changed together in predictable patterns, which is both expensive and risky. DRY violations can be identified using CodeScene's X-Ray analysis to detect clusters of change coupled functions with high code similarity. [Read More](https://codescene.com/blog/software-revolution-part3/)\n\nOnce you have identified the similarities across functions, look to extract and encapsulate the concept that varies into its own function(s). These shared abstractions can then be re-used, which minimizes the amount of duplication and simplifies change.","change-type":"improved","suppression":{"updated-at":"2025-10-01T05:33:14Z","fn-name":null,"biomarker":"Code Duplication","reason":"I just followed the original open api spec from another repo, and it has no duplications or redundancy when it comes to function definitions","suppressed-by":"jaeyson","line":null,"id":34023,"file-name":"lib/open_api_typesense/operations/analytics.ex"}},{"method":"compact","why-it-occurs":"Duplicated code often leads to code that's harder to change since the same logical change has to be done in multiple functions. More duplication gives lower code health.","name":"Code Duplication","file":"lib/open_api_typesense/operations/operations.ex","change-level":"improvement","is-hotspot?":true,"what-changed":"reduced similar code in: compact","how-to-fix":"A certain degree of duplicated code might be acceptable. The problems start when it is the same behavior that is duplicated across the functions in the module, ie. a violation of the Don't Repeat Yourself (DRY) principle. DRY violations lead to code that is changed together in predictable patterns, which is both expensive and risky. DRY violations can be identified using CodeScene's X-Ray analysis to detect clusters of change coupled functions with high code similarity. [Read More](https://codescene.com/blog/software-revolution-part3/)\n\nOnce you have identified the similarities across functions, look to extract and encapsulate the concept that varies into its own function(s). These shared abstractions can then be re-used, which minimizes the amount of duplication and simplifies change.","change-type":"improved"},{"method":"render_call","why-it-occurs":"Overly long functions make the code harder to read. The recommended maximum function length for the Elixir language is 70 lines of code. Severity: Brain Method - Complex Method - Long Method.","name":"Large Method","file":"lib/open_api_typesense/plugins/renderer.ex","change-level":"improvement","is-hotspot?":false,"line":51,"what-changed":"render_call decreases from 95 to 82 lines of code, threshold = 70","how-to-fix":"We recommend to be careful here -- just splitting long functions don't necessarily make the code easier to read. Instead, look for natural chunks inside the functions that expresses a specific task or concern. Often, such concerns are indicated by a Code Comment followed by an if-statement. Use the [EXTRACT FUNCTION](https://refactoring.com/catalog/extractFunction.html) refactoring to encapsulate that concern.","change-type":"improved"}]},"notices":{"number-of-types":0,"number-of-files-touched":0,"findings":[]},"external-review-provider":"GitHub"},"analysistime":"2026-04-05T15:37:23.000Z","project-name":"open_api_typesense","repository":"https://github.com/jaeyson/open_api_typesense.git"}}