{
  "project_name": "sec_interp",
  "timestamp": 1768781461.1118574,
  "metrics": {
    "total_size_kb": 584.46,
    "total_lines_code": 17148,
    "avg_module_size_kb": 5.41,
    "avg_lines_per_module": 158.78,
    "modules_with_docstrings": 103,
    "modules_with_main_guard": 0,
    "modules_with_syntax_errors": 0,
    "docstring_coverage": 94.07,
    "type_hint_coverage": 78.52,
    "i18n_coverage": 100.0,
    "entry_points_count": 0,
    "test_files_count": 62,
    "avg_complexity": 12.41,
    "max_complexity": 99,
    "quality_score": 83.2
  },
  "structure": {
    "tree": "./\n    .analyzer_state.json\n    .analyzerignore\n    .coverage\n    .dockerignore\n    .gitattributes\n    .gitignore\n    .pre-commit-config.yaml\n    ... (+33 more)\n    i18n/\n        SecInterp_de.qm\n        SecInterp_de.ts\n        SecInterp_es.qm\n        SecInterp_es.ts\n        SecInterp_fr.qm\n        SecInterp_fr.ts\n        SecInterp_pt_BR.qm\n        ... (+6 more)\n    help/\n        html/\n            .nojekyll\n            genindex.html\n            index.html\n            modules.html\n            objects.inv\n            search.html\n            searchindex.js\n            ... (+112 more)\n    scripts/\n        build_docs.sh\n        clean_imports.py\n        fix-ui-syntax.sh\n        inspect_qgs_api.py\n        package-for-qgis.sh\n        run_benchmarks.py\n        run_tests_in_qgis.py\n        ... (+2 more)\n    docs/\n        CHANGELOG.md\n        DEVELOPMENT_LOG.md\n        LOGGING_GUIDELINES.md\n        PLUGIN_ANALYSIS.md\n        release_process_ai.md\n        images/\n            ui_main_dialog.png\n            workflow_01_select_dem.png\n            workflow_02_select_dem.png\n            workflow_03_select_section_line.png\n            workflow_04_preview_generated.png\n            workflow_04_preview_panels_colapsed.png\n            workflow_05_geology_setup.png\n            ... (+3 more)\n        docsec/\n            ARCHITECTURE.md\n            ARCHITECTURE_EN.md\n            CHANGELOG.md\n            CHANGELOG_EN.md\n            COMMIT_GUIDELINES.md\n            DEVELOPMENT_GUIDE.md\n            DEVELOPMENT_GUIDE_EN.md\n            ... (+1 more)\n            archive/\n                20251223_multi_point_measure_plan.md\n                20251223_multi_point_measure_task.md\n                20251223_multi_point_measure_walkthrough.md\n                ANALYSIS_REPORT.md\n                API_REFERENCE.md\n                CHANGELOG_DRAFT_v1.1.md\n                CHANGELOG_DRAFT_v1.1_2025-12-09_2324.md\n                ... (+77 more)\n        source/\n            ARCHITECTURE.md\n            DEVELOPMENT_GUIDE.md\n            MAINTENANCE_LOG.md\n            TECHNICAL_COMPENDIUM.md\n            USER_GUIDE.md\n            conf.py\n            index.rst\n            ... (+113 more)\n            images/\n                dem_section_preview.png\n                geology_section_preview.png\n                guide_dem_setup.png\n                guide_drillhole_collars.png\n                guide_drillhole_intervals.png\n                guide_drillhole_survey.png\n                guide_geology_setup.png\n                ... (+23 more)\n        maintainer/\n            TECHNICAL_COMPENDIUM.md\n            TEST_TASK_LOG.md\n            debugging_crashes.md\n            ruff_remediation.md\n            uv_modernization_guide.md\n        plans/\n            implementation_plan_v2.6.0.md\n            implementation_plan_v2.7.0.md\n            interpretation_25d_plan.md\n            interpretation_2d_plan.md\n            task_v2.6.0.md\n            test_coverage_impl_plan.md\n            ui_persistence_impl_plan.md\n        research/\n            AI_INTERACTION_GUIDE.md\n            COMMERCIALIZATION_STRATEGY.md\n            QWEN.md\n            SIMILAR_PLUGINS_RESEARCH.md\n            TESTING_IN_QGIS.md\n            TESTING_STRATEGIES.md\n            investigacion_plugins_similares.md\n            ... (+2 more)\n        walkthroughs/\n            2d_interpretation_v1.md\n            test_coverage_chronicles.md\n        maintenance/\n            dev_container_setup_plan.md\n            dev_container_setup_task.md\n            docker_workshop_2026-01-04.md\n            phase_closure_2026-01-05.md\n            phase_closure_v2.6.0.md\n            phase_closure_walkthrough_2026-01-05.md\n            ruff_cleanup_2026-01-03_10-20.md\n            ... (+28 more)\n        adr/\n            0001-exporter-strategy-pattern.md\n            0002-conventional-commits.md\n            0003-core-gui-decoupling.md\n            0004-mock-first-testing-strategy.md\n            0005-centralized-logging.md\n            0006-concurrency-pattern.md\n            0007-consolidate-linting-and-dependencies.md\n            README.md\n        build/\n            html/\n                .buildinfo\n                .nojekyll\n                genindex.html\n                index.html\n                modules.html\n                objects.inv\n                search.html\n                ... (+113 more)\n            doctrees/\n                environment.pickle\n                index.doctree\n                modules.doctree\n                sec_interp.analyze_project_optfixed.doctree\n                sec_interp.core.algorithms.doctree\n                sec_interp.core.config.doctree\n                sec_interp.core.controller.doctree\n                ... (+108 more)\n    core/\n        __init__.py\n        algorithms.py\n        config.py\n        controller.py\n        data_cache.py\n        exceptions.py\n        performance_metrics.py\n        types.py\n        services/\n            __init__.py\n            access_control_service.py\n            drillhole_service.py\n            export_service.py\n            geology_service.py\n            preview_service.py\n            profile_service.py\n            structure_service.py\n        utils/\n            __init__.py\n            drillhole.py\n            geology.py\n            geometry.py\n            io.py\n            parsing.py\n            rendering.py\n            ... (+2 more)\n            geometry_utils/\n                __init__.py\n                extraction.py\n                filtering.py\n                measurement.py\n                optimization.py\n                processing.py\n        validation/\n            __init__.py\n            field_validator.py\n            layer_validator.py\n            path_validator.py\n            project_validator.py\n            validation_helpers.py\n            validators.py\n        interfaces/\n            __init__.py\n            cache_interface.py\n            drillhole_interface.py\n            geology_interface.py\n            preview_interface.py\n            profile_interface.py\n            structure_interface.py\n        models/\n            __init__.py\n            settings_model.py\n    resources/\n        __init__.py\n        resources.py\n        resources.qrc\n        icons/\n    tests/\n        README.md\n        TESTING_STATUS.md\n        __init__.py\n        base_test.py\n        test_translation_loading.py\n        core/\n            __init__.py\n            test_algorithms.py\n            test_async_drillhole.py\n            test_config.py\n            test_config_integration.py\n            test_data_cache_fix.py\n            test_drillhole_service.py\n            ... (+17 more)\n            validation/\n                test_service_validation.py\n                test_validation_helpers.py\n                test_validators.py\n        gui/\n            __init__.py\n            test_attribute_inheritance.py\n            test_cache_fix.py\n            test_geology_task.py\n            test_gui_utils.py\n            test_interpretation_tool.py\n            test_main_dialog_interpretation.py\n            ... (+7 more)\n        exporters/\n            __init__.py\n            test_drillhole_3d_exporter.py\n            test_dynamic_attrs.py\n            test_exporters.py\n            test_interpretation_3d_exporter.py\n        integration/\n            __init__.py\n            base_integration.py\n            test_export_workflow.py\n            test_integration.py\n            test_interpretation_workflow.py\n            test_measurement_workflow.py\n            test_qgis_smoke.py\n        benchmarks/\n            __init__.py\n            benchmark_utils.py\n            test_export_benchmarks.py\n            test_geometry_benchmarks.py\n    gui/\n        __init__.py\n        legend_widget.py\n        main_dialog.py\n        main_dialog_cache_handler.py\n        main_dialog_config.py\n        main_dialog_data.py\n        main_dialog_export.py\n        ... (+14 more)\n        ui/\n            __init__.py\n            main_window.py\n            sidebar.py\n            pages/\n                __init__.py\n                base_page.py\n                dem_page.py\n                drillhole_page.py\n                geology_page.py\n                interpretation_page.py\n                preview_page.py\n                ... (+2 more)\n        tools/\n            __init__.py\n            interpretation_tool.py\n            measure_tool.py\n        services/\n            __init__.py\n        dialogs/\n            interpretation_properties_dialog.py\n        tasks/\n            __init__.py\n            drillhole_task.py\n            geology_task.py\n    exporters/\n        __init__.py\n        base_exporter.py\n        csv_exporter.py\n        drillhole_3d_exporter.py\n        drillhole_exporters.py\n        image_exporter.py\n        interpretation_3d_exporter.py\n        ... (+4 more)\n    examples/\n        MURALLA_attachments.zip\n        README.md\n        sample_data/\n            DillLith.csv\n            DrillAltn.csv\n            DrillCollar.csv\n            DrillOx.csv\n            DrillsurveySummary.csv\n            MURALLA.qgs\n            MURALLA.qgs~\n            ... (+27 more)\n        tutorials/\n            README.md\n    logs/\n        README.md\n        sec_interp_debug.log\n        sec_interp_debug.log.1\n    final_analysis/\n        AI_CONTEXT.md\n        PROJECT_SUMMARY.md\n        analysis_errors.json\n        project_context.json\n    final_standard_analysis/\n        AI_CONTEXT.md\n        PROJECT_SUMMARY.md\n        analysis_errors.json\n        project_context.json\n    quality_report/\n        PROJECT_SUMMARY.md\n        project_context.json\n    tools/\n        qgis_plugin_analyzer/\n            README.md\n            RULES.md\n    analysis_results/\n        PROJECT_SUMMARY.html\n        PROJECT_SUMMARY.md\n        analyzer.log\n        project_context.json\n    dist/\n        .gitignore\n        sec_interp-2.5.0.tar.gz\n        sec_interp.2.4.0.zip.sha256\n        sec_interp.2.5.0.zip\n        sec_interp.2.5.0.zip.sha256\n        sec_interp.2.6.0.zip\n        sec_interp.2.6.0.zip.sha256\n        sec_interp_v2.4.0.zip\n    sec_interp.egg-info/\n        PKG-INFO\n        SOURCES.txt\n        dependency_links.txt\n        requires.txt\n        top_level.txt",
    "modules_count": 108,
    "file_types": {
      ".py": 2902,
      ".dat": 1068,
      ".pyc": 908,
      ".pyi": 787,
      ".sip": 786,
      ".qml": 701,
      ".so": 403,
      ".mo": 342,
      ".po": 342,
      ".png": 311,
      ".qm": 279,
      ".html": 274,
      ".txt": 245,
      ".md": 231,
      ".doctree": 230,
      ".js": 139,
      ".rst": 124,
      ".c": 60,
      ".qmltypes": 54,
      ".5": 50
    },
    "size_stats": {
      "total_files": 1663,
      "total_size_mb": 60.64,
      "python_files": 179,
      "python_size_mb": 0.91,
      "avg_file_size_kb": 37.34,
      "python_percentage": 1.5
    }
  },
  "complexity": {
    "total_modules": 108,
    "total_lines": 17148,
    "total_functions": 615,
    "total_classes": 115,
    "average_complexity": 12.41,
    "complexity_distribution": {
      "low (0-5)": 50,
      "medium (6-15)": 31,
      "high (16-30)": 12,
      "very_high (31+)": 15
    },
    "most_complex_modules": [
      [
        "core/services/drillhole_service.py",
        99
      ],
      [
        "gui/preview_layer_factory.py",
        58
      ],
      [
        "gui/main_dialog_preview.py",
        55
      ],
      [
        "gui/main_dialog_settings.py",
        55
      ],
      [
        "exporters/interpretation_3d_exporter.py",
        50
      ]
    ]
  },
  "dependencies": {
    "internal": [],
    "external": [
      "abc.ABC",
      "abc.abstractmethod",
      "collections.abc.Callable",
      "collections.abc.Generator",
      "collections.abc.Iterator",
      "csv",
      "datetime",
      "functools.wraps",
      "hashlib",
      "json",
      "logging",
      "logging.handlers.RotatingFileHandler",
      "math",
      "os",
      "pathlib.Path",
      "random",
      "re",
      "sys",
      "tempfile",
      "time",
      "traceback",
      "typing.Any",
      "typing.ClassVar",
      "typing.Protocol",
      "typing.TYPE_CHECKING",
      "typing.TypeVar",
      "typing.runtime_checkable"
    ],
    "third_party": [
      "PyQt5.QtCore",
      "__future__.annotations",
      "base_exporter.BaseExporter",
      "base_page.BasePage",
      "bisect",
      "contextlib",
      "contextlib.contextmanager",
      "csv_exporter.CSVExporter",
      "dataclasses",
      "dataclasses.dataclass",
      "dataclasses.field",
      "dialogs.interpretation_properties_dialog.InterpretationPropertiesDialog",
      "drillhole.calculate_drillhole_trajectory",
      "drillhole.interpolate_intervals_on_trajectory",
      "drillhole.project_trajectory_to_section",
      "drillhole_3d_exporter.DrillholeInterval3DExporter",
      "drillhole_3d_exporter.DrillholeTrace3DExporter",
      "drillhole_exporters.DrillholeIntervalShpExporter",
      "drillhole_exporters.DrillholeTraceShpExporter",
      "drillhole_service.DrillholeService",
      "enum.IntEnum",
      "field_validator.validate_angle_range",
      "field_validator.validate_field_exists",
      "field_validator.validate_field_type",
      "field_validator.validate_integer_input",
      "field_validator.validate_numeric_input",
      "geology.calculate_apparent_dip",
      "geology_service.GeologyService",
      "geometry.create_buffer_geometry",
      "geometry.create_memory_layer",
      "geometry.densify_line_by_interval",
      "geometry.filter_features_by_buffer",
      "geometry.get_line_vertices",
      "geometry_utils.extraction.extract_all_vertices",
      "geometry_utils.extraction.get_line_vertices",
      "geometry_utils.filtering.filter_features_by_buffer",
      "geometry_utils.processing.create_buffer_geometry",
      "geometry_utils.processing.create_memory_layer",
      "geometry_utils.processing.densify_line_by_interval",
      "geometry_utils.processing.run_geometry_operation",
      "image_exporter.ImageExporter",
      "interpretation_3d_exporter.Interpretation3DExporter",
      "interpretation_exporters.Interpretation2DExporter",
      "io.create_shapefile_writer",
      "layer_validator.validate_crs_compatibility",
      "layer_validator.validate_field_exists",
      "layer_validator.validate_layer_exists",
      "layer_validator.validate_layer_geometry",
      "layer_validator.validate_layer_has_features",
      "layer_validator.validate_raster_band",
      "layer_validator.validate_structural_requirements",
      "legend_widget.LegendWidget",
      "main_dialog.SecInterpDialog",
      "main_dialog_cache_handler.CacheHandler",
      "main_dialog_config.DialogConfig",
      "main_dialog_config.DialogDefaults",
      "main_dialog_data.DialogDataAggregator",
      "main_dialog_export.ExportManager",
      "main_dialog_interpretation.DialogInterpretationManager",
      "main_dialog_messages.MessageManager",
      "main_dialog_preview.PreviewManager",
      "main_dialog_settings.DialogSettingsManager",
      "main_dialog_signals.DialogSignalManager",
      "main_dialog_status.DialogStatusManager",
      "main_dialog_tools.DialogToolManager",
      "main_dialog_tools.NavigationManager",
      "main_dialog_utils.DialogEntityManager",
      "main_dialog_validation_manager.DialogValidationManager",
      "pages.dem_page.DemPage",
      "pages.drillhole_page.DrillholePage",
      "pages.geology_page.GeologyPage",
      "pages.interpretation_page.InterpretationPage",
      "pages.preview_page.PreviewWidget",
      "pages.section_page.SectionPage",
      "pages.settings_page.SettingsPage",
      "pages.structure_page.StructurePage",
      "parsing.cardinal_to_azimuth",
      "parsing.parse_dip",
      "parsing.parse_strike",
      "path_validator.validate_output_path",
      "path_validator.validate_safe_output_path",
      "pdf_exporter.PDFExporter",
      "preview_axes_manager.PreviewAxesManager",
      "preview_layer_factory.PreviewLayerFactory",
      "preview_legend_renderer.PreviewLegendRenderer",
      "preview_renderer.PreviewRenderer",
      "preview_reporter.PreviewReporter",
      "profile_exporters.AxesShpExporter",
      "profile_exporters.GeologyShpExporter",
      "profile_exporters.ProfileLineShpExporter",
      "profile_exporters.StructureShpExporter",
      "profile_service.ProfileService",
      "project_validator.ProjectValidator",
      "project_validator.ValidationParams",
      "project_validator.validate_reasonable_ranges",
      "psutil",
      "qgis.PyQt.QtCore",
      "qgis.PyQt.QtCore.QCoreApplication",
      "qgis.PyQt.QtCore.QEvent",
      "qgis.PyQt.QtCore.QMarginsF",
      "qgis.PyQt.QtCore.QMetaType",
      "qgis.PyQt.QtCore.QObject",
      "qgis.PyQt.QtCore.QPoint",
      "qgis.PyQt.QtCore.QRectF",
      "qgis.PyQt.QtCore.QSettings",
      "qgis.PyQt.QtCore.QSize",
      "qgis.PyQt.QtCore.QSizeF",
      "qgis.PyQt.QtCore.QThread",
      "qgis.PyQt.QtCore.QTimer",
      "qgis.PyQt.QtCore.QTranslator",
      "qgis.PyQt.QtCore.QUrl",
      "qgis.PyQt.QtCore.Qt",
      "qgis.PyQt.QtCore.pyqtSignal",
      "qgis.PyQt.QtGui.QColor",
      "qgis.PyQt.QtGui.QDesktopServices",
      "qgis.PyQt.QtGui.QFont",
      "qgis.PyQt.QtGui.QIcon",
      "qgis.PyQt.QtGui.QImage",
      "qgis.PyQt.QtGui.QPageSize",
      "qgis.PyQt.QtGui.QPainter",
      "qgis.PyQt.QtGui.QPdfWriter",
      "qgis.PyQt.QtGui.QPen",
      "qgis.PyQt.QtSvg.QSvgGenerator",
      "qgis.PyQt.QtWidgets.QAction",
      "qgis.PyQt.QtWidgets.QCheckBox",
      "qgis.PyQt.QtWidgets.QColorDialog",
      "qgis.PyQt.QtWidgets.QComboBox",
      "qgis.PyQt.QtWidgets.QDialog",
      "qgis.PyQt.QtWidgets.QDialogButtonBox",
      "qgis.PyQt.QtWidgets.QFileDialog",
      "qgis.PyQt.QtWidgets.QFormLayout",
      "qgis.PyQt.QtWidgets.QFrame",
      "qgis.PyQt.QtWidgets.QGridLayout",
      "qgis.PyQt.QtWidgets.QGroupBox",
      "qgis.PyQt.QtWidgets.QHBoxLayout",
      "qgis.PyQt.QtWidgets.QHeaderView",
      "qgis.PyQt.QtWidgets.QLabel",
      "qgis.PyQt.QtWidgets.QLineEdit",
      "qgis.PyQt.QtWidgets.QListWidget",
      "qgis.PyQt.QtWidgets.QListWidgetItem",
      "qgis.PyQt.QtWidgets.QMessageBox",
      "qgis.PyQt.QtWidgets.QPushButton",
      "qgis.PyQt.QtWidgets.QSpinBox",
      "qgis.PyQt.QtWidgets.QSplitter",
      "qgis.PyQt.QtWidgets.QStackedWidget",
      "qgis.PyQt.QtWidgets.QTabWidget",
      "qgis.PyQt.QtWidgets.QTableWidget",
      "qgis.PyQt.QtWidgets.QTableWidgetItem",
      "qgis.PyQt.QtWidgets.QTextEdit",
      "qgis.PyQt.QtWidgets.QVBoxLayout",
      "qgis.PyQt.QtWidgets.QWidget",
      "qgis._3d",
      "qgis._3d.QgsAbstractMaterialSettings",
      "qgis._3d.QgsPhongMaterialSettings",
      "qgis._3d.QgsPolygon3DSymbol",
      "qgis._3d.QgsVectorLayer3DRenderer",
      "qgis.core.Qgis",
      "qgis.core.QgsApplication",
      "qgis.core.QgsCategorizedSymbolRenderer",
      "qgis.core.QgsClassificationFixedInterval",
      "qgis.core.QgsCoordinateReferenceSystem",
      "qgis.core.QgsCoordinateTransform",
      "qgis.core.QgsDistanceArea",
      "qgis.core.QgsFeature",
      "qgis.core.QgsFeatureRequest",
      "qgis.core.QgsField",
      "qgis.core.QgsFields",
      "qgis.core.QgsFillSymbol",
      "qgis.core.QgsGeometry",
      "qgis.core.QgsGraduatedSymbolRenderer",
      "qgis.core.QgsLineString",
      "qgis.core.QgsLineSymbol",
      "qgis.core.QgsMapLayer",
      "qgis.core.QgsMapLayerProxyModel",
      "qgis.core.QgsMapRendererCustomPainterJob",
      "qgis.core.QgsMapSettings",
      "qgis.core.QgsMarkerSymbol",
      "qgis.core.QgsMessageLog",
      "qgis.core.QgsPalLayerSettings",
      "qgis.core.QgsPoint",
      "qgis.core.QgsPointLocator",
      "qgis.core.QgsPointXY",
      "qgis.core.QgsPolygon",
      "qgis.core.QgsProject",
      "qgis.core.QgsProperty",
      "qgis.core.QgsPropertyCollection",
      "qgis.core.QgsRaster",
      "qgis.core.QgsRasterLayer",
      "qgis.core.QgsRectangle",
      "qgis.core.QgsRendererCategory",
      "qgis.core.QgsSettings",
      "qgis.core.QgsSingleSymbolRenderer",
      "qgis.core.QgsStyle",
      "qgis.core.QgsTask",
      "qgis.core.QgsTextFormat",
      "qgis.core.QgsUnitTypes",
      "qgis.core.QgsVectorFileWriter",
      "qgis.core.QgsVectorLayer",
      "qgis.core.QgsVectorLayerSimpleLabeling",
      "qgis.core.QgsWkbTypes",
      "qgis.gui.QgsCollapsibleGroupBox",
      "qgis.gui.QgsDoubleSpinBox",
      "qgis.gui.QgsFieldComboBox",
      "qgis.gui.QgsFileWidget",
      "qgis.gui.QgsInterface",
      "qgis.gui.QgsMapCanvas",
      "qgis.gui.QgsMapLayerComboBox",
      "qgis.gui.QgsMapTool",
      "qgis.gui.QgsMapToolEmitPoint",
      "qgis.gui.QgsMapToolPan",
      "qgis.gui.QgsRasterBandComboBox",
      "qgis.gui.QgsRubberBand",
      "qgis.gui.QgsVertexMarker",
      "rendering.calculate_bounds",
      "rendering.calculate_interval",
      "rendering.create_coordinate_transform",
      "sampling.interpolate_elevation",
      "sampling.prepare_profile_context",
      "sampling.sample_elevation_along_line",
      "sec_interp.core.config.ConfigService",
      "sec_interp.core.controller.ProfileController",
      "sec_interp.core.data_cache.DataCache",
      "sec_interp.core.exceptions.DataMissingError",
      "sec_interp.core.exceptions.ExportError",
      "sec_interp.core.exceptions.GeometryError",
      "sec_interp.core.exceptions.ProcessingError",
      "sec_interp.core.exceptions.SecInterpError",
      "sec_interp.core.exceptions.ValidationError",
      "sec_interp.core.interfaces.cache_interface.ICacheService",
      "sec_interp.core.interfaces.drillhole_interface.IDrillholeService",
      "sec_interp.core.interfaces.geology_interface.IGeologyService",
      "sec_interp.core.interfaces.preview_interface.IPreviewService",
      "sec_interp.core.interfaces.profile_interface.IProfileService",
      "sec_interp.core.interfaces.structure_interface.IStructureService",
      "sec_interp.core.models.settings_model.PluginSettings",
      "sec_interp.core.performance_metrics.MetricsCollector",
      "sec_interp.core.performance_metrics.PerformanceTimer",
      "sec_interp.core.performance_metrics.format_duration",
      "sec_interp.core.performance_metrics.performance_monitor",
      "sec_interp.core.services.DrillholeService",
      "sec_interp.core.services.GeologyService",
      "sec_interp.core.services.ProfileService",
      "sec_interp.core.services.StructureService",
      "sec_interp.core.services.access_control_service.AccessControlService",
      "sec_interp.core.services.drillhole_service.DrillholeService",
      "sec_interp.core.services.export_service.ExportService",
      "sec_interp.core.services.geology_service.GeologyService",
      "sec_interp.core.services.preview_service.PreviewService",
      "sec_interp.core.types.DrillholeTaskInput",
      "sec_interp.core.types.FieldType",
      "sec_interp.core.types.GeologyData",
      "sec_interp.core.types.GeologySegment",
      "sec_interp.core.types.GeologyTaskInput",
      "sec_interp.core.types.InterpretationPolygon",
      "sec_interp.core.types.PreviewParams",
      "sec_interp.core.types.PreviewResult",
      "sec_interp.core.types.ProfileData",
      "sec_interp.core.types.StructureData",
      "sec_interp.core.types.StructureMeasurement",
      "sec_interp.core.utils",
      "sec_interp.core.utils.geometry_utils.measurement.calculate_polyline_metrics",
      "sec_interp.core.utils.geometry_utils.optimization.PreviewOptimizer",
      "sec_interp.core.utils.sampling.interpolate_elevation",
      "sec_interp.core.validation.project_validator.ProjectValidator",
      "sec_interp.core.validation.project_validator.ValidationParams",
      "sec_interp.core.validation.validate_safe_output_path",
      "sec_interp.core.validation.validation_helpers.DependencyRule",
      "sec_interp.core.validation.validation_helpers.validate_dependencies",
      "sec_interp.core.validation.validators.validate_and_clamp",
      "sec_interp.core.validation.validators.validate_positive",
      "sec_interp.core.validation.validators.validate_range",
      "sec_interp.exporters.AxesShpExporter",
      "sec_interp.exporters.CSVExporter",
      "sec_interp.exporters.DrillholeInterval3DExporter",
      "sec_interp.exporters.DrillholeIntervalShpExporter",
      "sec_interp.exporters.DrillholeTrace3DExporter",
      "sec_interp.exporters.DrillholeTraceShpExporter",
      "sec_interp.exporters.GeologyShpExporter",
      "sec_interp.exporters.Interpretation2DExporter",
      "sec_interp.exporters.Interpretation3DExporter",
      "sec_interp.exporters.ProfileLineShpExporter",
      "sec_interp.exporters.StructureShpExporter",
      "sec_interp.exporters.base_exporter.BaseExporter",
      "sec_interp.exporters.get_exporter",
      "sec_interp.gui.main_dialog.SecInterpDialog",
      "sec_interp.gui.main_dialog_config.DialogDefaults",
      "sec_interp.gui.preview_renderer.PreviewRenderer",
      "sec_interp.gui.utils.show_user_message",
      "sec_interp.logger_config.get_logger",
      "sec_interp.logger_config.log_critical_operation",
      "sec_interp.logger_config.setup_logging",
      "sec_interp_plugin.SecInterp",
      "settings_page.SettingsPage",
      "shp_exporter.ShapefileExporter",
      "sidebar.Sidebar",
      "spatial.calculate_line_azimuth",
      "spatial.calculate_step_size",
      "spatial.create_distance_area",
      "spatial.get_line_start_point",
      "structure_service.StructureService",
      "svg_exporter.SVGExporter",
      "tasks.drillhole_task.DrillholeGenerationTask",
      "tasks.geology_task.GeologyGenerationTask",
      "tools.interpretation_tool.ProfileInterpretationTool",
      "tools.measure_tool.ProfileMeasureTool",
      "tracemalloc",
      "types",
      "ui.main_window.SecInterpMainWindow",
      "unittest.mock.MagicMock",
      "uuid",
      "validation_helpers.ValidationContext",
      "validation_helpers.validate_reasonable_ranges"
    ],
    "files": {
      "requirements.txt": "# Runtime dependencies for development/testing of the plugin.\n#\n# IMPORTANT:\n# 1. QGIS Python bindings (qgis.core, qgis.gui) are provided by the QGIS application itself\n#    and are NOT installable via pip.\n# 2. PyQt5 is also provided by the QGIS runtime.\n#\n# We list PyQt5 here primarily for:\n# - CI/CD environments where QGIS is headless or mocked.\n# - Local development IDEs (VSCode/PyCharm) to provide autocompletion and type hinting.\n#\n# Version Constraint:\n# We pin to 5.15.x to recognize the version used by modern QGIS 3.28+ LTR releases.\n# Check your specific QGIS version's Help -> About to confirm the exact PyQt version.\n\nPyQt5>=5.15.0,<5.16.0\n",
      "pyproject.toml": "[project]\nname = \"sec-interp\"\nversion = \"2.6.0\"\ndescription = \"QGIS Plugin for geological interpretation and data extraction\"\nreadme = \"README.md\"\nrequires-python = \">=3.10\"\nlicense = { text = \"GPL-2.0-or-later\" }\n\n\nauthors = [\n    { name = \"Juan M Bernales\", email = \"juanbernales@gmail.com\" }\n]\ndependencies = [\n    \"PyQt5>=5.15.0,<5.16.0\",\n]\n\n[tool.setuptools]\npackages = [\"core\", \"gui\", \"resources\", \"exporters\", \"i18n\"]\n\n[dependency-groups]\ndev = [\n    \"ruff>=0.4.0\",\n    \"black==24.1.0\",\n    \"mypy>=1.10\",\n    \"networkx>=3.0\",\n    \"ai-context-core>=1.0.0\",\n    \"qgis-plugin-analyzer>=1.4.0\",\n    \"sphinx>=7.0\",\n    \"sphinx-rtd-theme>=2.0\",\n    \"qgis-plugin-analyzer @ git+https://github.com/geociencio/qgis-plugin-analyzer.git\",\n    \"sphinxcontrib-mermaid>=0.9.2\",\n    \"myst-parser>=2.0.0\",\n    \"linkify-it-py>=2.0.0\",\n    \"qgis-plugin-manager @ git+https://github.com/geociencio/qgis-plugin-manager\",\n    \"pre-commit>=4.5.1\",\n    \"dominate>=2.9.1\",\n    \"setuptools>=70.0.0\",\n]\n\n[tool.uv]\nmanaged = true\npackage = false\n\n[tool.ruff]\nline-length = 100\ntarget-version = \"py310\"\nexclude = [\n    \".git\",\n    \"__pycache__\",\n    \"*.pyc\",\n    \".venv\",\n    \"scripts\",\n    \"venv\",\n    \"env\",\n    \".env\",\n    \"dist\",\n    \"build\",\n    \".mypy_cache\",\n    \".ruff_cache\",\n    \".ruff_cache\",\n    \"*.egg-info\",\n    \"help\",\n    \"resources/resources.py\",\n    \"gui/ui/__init__.py\",\n    \"**/migrations/**\",\n    \"**/test*.py\",\n    \"**/*test.py\",\n    \"tests/\",\n    \"research/\",\n]\n\n[tool.ruff.lint]\nselect = [\n    \"F\",   # Pyflakes\n    \"E\",   # pycodestyle errors\n    \"W\",   # pycodestyle warnings\n    \"I\",   # isort\n    \"N\",   # pep8-naming\n    \"D\",   # pydocstyle\n    \"UP\",  # pyupgrade\n    \"B\",   # flake8-bugbear\n    \"C4\",  # flake8-comprehensions\n    \"T20\", # flake8-print\n    \"SIM\", # flake8-simplify\n    \"PTH\", # flake8-use-pathlib\n    \"ISC\", # flake8-implicit-str-concat\n    \"Q\",   # flake8-quotes\n    \"TID\", # flake8-tidy-imports\n    \"PL\",  # Pylint\n    \"TRY\", # tryceratops\n    \"RUF\", # Ruff-specific rules\n"
    },
    "import_graph": {
      "core/algorithms.py": [],
      "core/__init__.py": [],
      "__init__.py": [
        "sec_interp_plugin.py"
      ],
      "sec_interp_plugin.py": [
        "core/exceptions.py",
        "gui/main_dialog.py",
        "gui/preview_renderer.py",
        "core/services/export_service.py",
        "core/types.py",
        "logger_config.py",
        "core/controller.py"
      ],
      "core/interfaces/__init__.py": [],
      "core/interfaces/geology_interface.py": [],
      "core/interfaces/cache_interface.py": [],
      "core/exceptions.py": [],
      "core/interfaces/preview_interface.py": [],
      "core/interfaces/profile_interface.py": [],
      "core/interfaces/drillhole_interface.py": [],
      "core/interfaces/structure_interface.py": [],
      "core/services/__init__.py": [],
      "core/services/access_control_service.py": [
        "logger_config.py"
      ],
      "logger_config.py": [],
      "core/data_cache.py": [
        "logger_config.py",
        "core/interfaces/cache_interface.py"
      ],
      "core/config.py": [
        "logger_config.py",
        "core/models/settings_model.py"
      ],
      "core/models/settings_model.py": [
        "core/validation/validators.py"
      ],
      "core/validation/validators.py": [
        "core/exceptions.py"
      ],
      "core/services/profile_service.py": [
        "core/exceptions.py",
        "core/interfaces/profile_interface.py",
        "logger_config.py",
        "core/types.py"
      ],
      "core/types.py": [
        "core/exceptions.py",
        "core/performance_metrics.py"
      ],
      "core/services/preview_service.py": [
        "core/exceptions.py",
        "logger_config.py",
        "core/performance_metrics.py",
        "core/types.py"
      ],
      "core/performance_metrics.py": [
        "logger_config.py"
      ],
      "core/utils/__init__.py": [],
      "core/controller.py": [
        "core/exceptions.py",
        "core/config.py",
        "core/data_cache.py",
        "core/types.py",
        "logger_config.py"
      ],
      "core/services/structure_service.py": [
        "core/exceptions.py",
        "core/interfaces/structure_interface.py",
        "logger_config.py",
        "core/types.py"
      ],
      "core/utils/geometry.py": [],
      "core/utils/geometry_utils/__init__.py": [],
      "core/utils/geology.py": [],
      "core/services/export_service.py": [
        "core/exceptions.py",
        "logger_config.py",
        "core/types.py",
        "core/services/access_control_service.py"
      ],
      "core/utils/geometry_utils/extraction.py": [],
      "core/utils/geometry_utils/filtering.py": [
        "logger_config.py"
      ],
      "core/utils/io.py": [],
      "core/utils/geometry_utils/measurement.py": [],
      "core/services/geology_service.py": [
        "core/exceptions.py",
        "core/interfaces/geology_interface.py",
        "core/utils/sampling.py",
        "core/performance_metrics.py",
        "core/types.py",
        "logger_config.py",
        "core/validation/validators.py"
      ],
      "core/utils/sampling.py": [
        "logger_config.py"
      ],
      "core/utils/geometry_utils/processing.py": [
        "logger_config.py"
      ],
      "core/utils/drillhole.py": [],
      "core/utils/parsing.py": [],
      "core/validation/__init__.py": [],
      "core/utils/resource_manager.py": [
        "logger_config.py"
      ],
      "core/utils/geometry_utils/optimization.py": [
        "logger_config.py"
      ],
      "core/utils/spatial.py": [],
      "core/utils/rendering.py": [
        "core/types.py"
      ],
      "core/validation/path_validator.py": [],
      "core/validation/field_validator.py": [
        "core/types.py"
      ],
      "exporters/__init__.py": [],
      "core/validation/layer_validator.py": [
        "core/types.py"
      ],
      "exporters/base_exporter.py": [],
      "exporters/csv_exporter.py": [
        "logger_config.py"
      ],
      "core/validation/validation_helpers.py": [
        "core/exceptions.py"
      ],
      "exporters/image_exporter.py": [
        "logger_config.py"
      ],
      "core/services/drillhole_service.py": [
        "core/exceptions.py",
        "core/types.py",
        "logger_config.py",
        "core/interfaces/drillhole_interface.py",
        "core/validation/validators.py"
      ],
      "core/validation/project_validator.py": [
        "core/validation/validation_helpers.py"
      ],
      "exporters/drillhole_exporters.py": [
        "logger_config.py"
      ],
      "gui/__init__.py": [],
      "exporters/interpretation_exporters.py": [
        "logger_config.py",
        "exporters/base_exporter.py"
      ],
      "exporters/pdf_exporter.py": [
        "logger_config.py"
      ],
      "exporters/drillhole_3d_exporter.py": [
        "logger_config.py"
      ],
      "exporters/svg_exporter.py": [
        "logger_config.py"
      ],
      "gui/main_dialog_cache_handler.py": [
        "logger_config.py"
      ],
      "exporters/shp_exporter.py": [
        "logger_config.py"
      ],
      "gui/legend_widget.py": [
        "gui/main_dialog.py"
      ],
      "gui/main_dialog.py": [
        "logger_config.py",
        "core/services/preview_service.py",
        "gui/utils.py",
        "core/types.py"
      ],
      "gui/dialogs/interpretation_properties_dialog.py": [
        "core/types.py"
      ],
      "gui/main_dialog_config.py": [],
      "gui/main_dialog_messages.py": [
        "core/exceptions.py",
        "gui/utils.py",
        "logger_config.py"
      ],
      "gui/utils.py": [
        "logger_config.py"
      ],
      "gui/main_dialog_data.py": [
        "core/validation/project_validator.py"
      ],
      "exporters/profile_exporters.py": [
        "logger_config.py"
      ],
      "gui/main_dialog_export.py": [
        "core/exceptions.py",
        "core/services/export_service.py",
        "core/performance_metrics.py",
        "logger_config.py"
      ],
      "exporters/interpretation_3d_exporter.py": [
        "core/exceptions.py",
        "exporters/base_exporter.py",
        "core/types.py",
        "logger_config.py"
      ],
      "gui/main_dialog_status.py": [],
      "gui/main_dialog_interpretation.py": [
        "logger_config.py",
        "core/types.py"
      ],
      "gui/main_dialog_utils.py": [],
      "gui/main_dialog_signals.py": [
        "logger_config.py"
      ],
      "gui/main_dialog_tools.py": [],
      "gui/main_dialog_validation_manager.py": [
        "core/exceptions.py",
        "gui/main_dialog.py",
        "core/validation/project_validator.py"
      ],
      "gui/services/__init__.py": [],
      "gui/tasks/drillhole_task.py": [
        "logger_config.py",
        "core/services/drillhole_service.py",
        "core/types.py"
      ],
      "gui/preview_reporter.py": [
        "core/performance_metrics.py",
        "core/types.py"
      ],
      "gui/preview_axes_manager.py": [
        "logger_config.py"
      ],
      "gui/tools/__init__.py": [],
      "gui/preview_legend_renderer.py": [
        "logger_config.py"
      ],
      "gui/ui/__init__.py": [],
      "gui/tasks/geology_task.py": [
        "logger_config.py",
        "core/services/geology_service.py",
        "core/types.py"
      ],
      "gui/ui/pages/__init__.py": [],
      "gui/ui/pages/base_page.py": [],
      "gui/ui/main_window.py": [],
      "gui/preview_renderer.py": [
        "logger_config.py",
        "core/types.py"
      ],
      "gui/main_dialog_preview.py": [
        "core/exceptions.py",
        "core/services/preview_service.py",
        "core/performance_metrics.py",
        "core/types.py",
        "logger_config.py",
        "core/interfaces/preview_interface.py"
      ],
      "gui/ui/pages/dem_page.py": [
        "gui/main_dialog_config.py",
        "core/validation/project_validator.py"
      ],
      "gui/main_dialog_settings.py": [
        "logger_config.py"
      ],
      "gui/tools/measure_tool.py": [
        "logger_config.py",
        "core/utils/geometry.py"
      ],
      "gui/ui/pages/geology_page.py": [
        "core/validation/project_validator.py"
      ],
      "gui/tools/interpretation_tool.py": [
        "logger_config.py",
        "core/types.py"
      ],
      "gui/ui/pages/interpretation_page.py": [],
      "gui/ui/sidebar.py": [],
      "gui/ui/pages/section_page.py": [],
      "resources/__init__.py": [],
      "resources/resources.py": [],
      "reproduce_proxy.py": [],
      "gui/ui/pages/structure_page.py": [
        "gui/main_dialog_config.py",
        "core/validation/project_validator.py"
      ],
      "update_metadata_rule.py": [],
      "gui/preview_layer_factory.py": [
        "logger_config.py",
        "core/types.py",
        "core/utils/geometry.py"
      ],
      "gui/ui/pages/preview_page.py": [],
      "gui/ui/pages/settings_page.py": [],
      "gui/ui/pages/drillhole_page.py": [
        "logger_config.py",
        "core/validation/project_validator.py"
      ]
    },
    "circular_dependencies": [],
    "graph_metrics": {
      "nodes": 108,
      "edges": 130,
      "density": 0.01124956732433368,
      "is_dag": true,
      "weakly_connected_components": 36
    }
  },
  "debt": [
    {
      "module": "core/services/drillhole_service.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (99)",
          "value": 99
        },
        {
          "type": "very_long_file",
          "severity": "high",
          "message": "Very long file (858 lines)",
          "value": 858
        },
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "1 functions without docstring"
        }
      ],
      "total_issues": 3,
      "severity_score": 7
    },
    {
      "module": "core/services/geology_service.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (45)",
          "value": 45
        },
        {
          "type": "long_file",
          "severity": "medium",
          "message": "Long file (539 lines)",
          "value": 539
        }
      ],
      "total_issues": 2,
      "severity_score": 5
    },
    {
      "module": "gui/main_dialog_preview.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (55)",
          "value": 55
        },
        {
          "type": "long_file",
          "severity": "medium",
          "message": "Long file (678 lines)",
          "value": 678
        }
      ],
      "total_issues": 2,
      "severity_score": 5
    },
    {
      "module": "core/validation/project_validator.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (37)",
          "value": 37
        },
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "3 functions without docstring"
        }
      ],
      "total_issues": 2,
      "severity_score": 4
    },
    {
      "module": "exporters/interpretation_3d_exporter.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (50)",
          "value": 50
        },
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "5 functions without docstring"
        }
      ],
      "total_issues": 2,
      "severity_score": 4
    },
    {
      "module": "gui/tools/measure_tool.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (35)",
          "value": 35
        },
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "1 functions without docstring"
        }
      ],
      "total_issues": 2,
      "severity_score": 4
    },
    {
      "module": "gui/tools/interpretation_tool.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (41)",
          "value": 41
        },
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "1 functions without docstring"
        }
      ],
      "total_issues": 2,
      "severity_score": 4
    },
    {
      "module": "core/services/preview_service.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (22)",
          "value": 22
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "core/controller.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (22)",
          "value": 22
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "core/services/export_service.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (39)",
          "value": 39
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "core/types.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (39)",
          "value": 39
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "core/validation/path_validator.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (24)",
          "value": 24
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "core/validation/field_validator.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (30)",
          "value": 30
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "core/validation/layer_validator.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (29)",
          "value": 29
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "core/validation/validation_helpers.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (18)",
          "value": 18
        },
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "2 functions without docstring"
        }
      ],
      "total_issues": 2,
      "severity_score": 3
    },
    {
      "module": "core/validation/validators.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (14)",
          "value": 14
        },
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "1 functions without docstring"
        }
      ],
      "total_issues": 2,
      "severity_score": 3
    },
    {
      "module": "exporters/drillhole_exporters.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (24)",
          "value": 24
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "exporters/drillhole_3d_exporter.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (22)",
          "value": 22
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "exporters/profile_exporters.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (39)",
          "value": 39
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "gui/main_dialog_interpretation.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (36)",
          "value": 36
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "gui/preview_renderer.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (31)",
          "value": 31
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "gui/main_dialog_settings.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (55)",
          "value": 55
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "reproduce_proxy.py",
      "issues": [
        {
          "type": "missing_module_docstring",
          "severity": "low",
          "message": "Missing module-level docstring"
        },
        {
          "type": "classes_without_docstring",
          "severity": "low",
          "message": "2 classes without docstring"
        },
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "5 functions without docstring"
        }
      ],
      "total_issues": 3,
      "severity_score": 3
    },
    {
      "module": "gui/preview_layer_factory.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (58)",
          "value": 58
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "logger_config.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (22)",
          "value": 22
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "sec_interp_plugin.py",
      "issues": [
        {
          "type": "high_complexity",
          "severity": "high",
          "message": "Very high cyclomatic complexity (35)",
          "value": 35
        }
      ],
      "total_issues": 1,
      "severity_score": 3
    },
    {
      "module": "core/data_cache.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (19)",
          "value": 19
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "core/performance_metrics.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (13)",
          "value": 13
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "core/services/structure_service.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (20)",
          "value": 20
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "core/utils/drillhole.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (13)",
          "value": 13
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "core/utils/parsing.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (15)",
          "value": 15
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "core/utils/resource_manager.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (11)",
          "value": 11
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "core/utils/geometry_utils/optimization.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (13)",
          "value": 13
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "core/utils/spatial.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (11)",
          "value": 11
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "core/utils/sampling.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (14)",
          "value": 14
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "exporters/interpretation_exporters.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (13)",
          "value": 13
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "exporters/shp_exporter.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (13)",
          "value": 13
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "gui/main_dialog_export.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (16)",
          "value": 16
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "gui/preview_reporter.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (12)",
          "value": 12
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "gui/preview_axes_manager.py",
      "issues": [
        {
          "type": "moderate_complexity",
          "severity": "medium",
          "message": "High cyclomatic complexity (12)",
          "value": 12
        }
      ],
      "total_issues": 1,
      "severity_score": 2
    },
    {
      "module": "resources/resources.py",
      "issues": [
        {
          "type": "missing_module_docstring",
          "severity": "low",
          "message": "Missing module-level docstring"
        },
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "2 functions without docstring"
        }
      ],
      "total_issues": 2,
      "severity_score": 2
    },
    {
      "module": "core/config.py",
      "issues": [
        {
          "type": "missing_module_docstring",
          "severity": "low",
          "message": "Missing module-level docstring"
        }
      ],
      "total_issues": 1,
      "severity_score": 1
    },
    {
      "module": "gui/main_dialog_cache_handler.py",
      "issues": [
        {
          "type": "missing_module_docstring",
          "severity": "low",
          "message": "Missing module-level docstring"
        }
      ],
      "total_issues": 1,
      "severity_score": 1
    },
    {
      "module": "gui/legend_widget.py",
      "issues": [
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "1 functions without docstring"
        }
      ],
      "total_issues": 1,
      "severity_score": 1
    },
    {
      "module": "gui/main_dialog.py",
      "issues": [
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "1 functions without docstring"
        }
      ],
      "total_issues": 1,
      "severity_score": 1
    },
    {
      "module": "gui/ui/main_window.py",
      "issues": [
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "1 functions without docstring"
        }
      ],
      "total_issues": 1,
      "severity_score": 1
    },
    {
      "module": "gui/ui/pages/dem_page.py",
      "issues": [
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "1 functions without docstring"
        }
      ],
      "total_issues": 1,
      "severity_score": 1
    },
    {
      "module": "gui/ui/pages/geology_page.py",
      "issues": [
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "2 functions without docstring"
        }
      ],
      "total_issues": 1,
      "severity_score": 1
    },
    {
      "module": "gui/ui/pages/interpretation_page.py",
      "issues": [
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "2 functions without docstring"
        }
      ],
      "total_issues": 1,
      "severity_score": 1
    },
    {
      "module": "gui/ui/sidebar.py",
      "issues": [
        {
          "type": "functions_without_docstring",
          "severity": "low",
          "message": "1 functions without docstring"
        }
      ],
      "total_issues": 1,
      "severity_score": 1
    }
  ],
  "optimizations": [
    {
      "module": "core/exceptions.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 59.0 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "core/data_cache.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (19) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "core/services/profile_service.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 86.0 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "core/services/preview_service.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 63.8 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "core/controller.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (22) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "core/services/structure_service.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (20) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "core/services/export_service.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (39) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "core/utils/geometry_utils/filtering.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 61.0 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "core/utils/io.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 57.0 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "core/utils/geometry_utils/measurement.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 80.0 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "core/services/geology_service.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (45) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        },
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 53.9 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        },
        {
          "type": "module_too_large",
          "priority": "medium",
          "message": "Module is quite large (539 lines)",
          "suggestions": [
            "Split into multiple modules",
            "Extract classes to separate files"
          ]
        }
      ]
    },
    {
      "module": "core/utils/drillhole.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 78.7 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "core/types.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (39) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        },
        {
          "type": "module_too_large",
          "priority": "medium",
          "message": "Module is quite large (421 lines)",
          "suggestions": [
            "Split into multiple modules",
            "Extract classes to separate files"
          ]
        }
      ]
    },
    {
      "module": "core/utils/geometry_utils/optimization.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 56.3 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "core/utils/sampling.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 51.0 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "exporters/__init__.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 77.0 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "core/validation/layer_validator.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (29) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "core/validation/validation_helpers.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (18) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "core/services/drillhole_service.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (99) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        },
        {
          "type": "module_too_large",
          "priority": "medium",
          "message": "Module is quite large (858 lines)",
          "suggestions": [
            "Split into multiple modules",
            "Extract classes to separate files"
          ]
        }
      ]
    },
    {
      "module": "core/validation/project_validator.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (37) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "exporters/drillhole_exporters.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (24) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "exporters/drillhole_3d_exporter.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (22) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "exporters/profile_exporters.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (39) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "gui/main_dialog_export.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 76.7 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "exporters/interpretation_3d_exporter.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (50) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        },
        {
          "type": "excessive_imports",
          "priority": "medium",
          "message": "Too many imports (32)",
          "suggestions": [
            "Group related imports",
            "Group from imports",
            "Remove unused imports"
          ]
        },
        {
          "type": "module_too_large",
          "priority": "medium",
          "message": "Module is quite large (466 lines)",
          "suggestions": [
            "Split into multiple modules",
            "Extract classes to separate files"
          ]
        }
      ]
    },
    {
      "module": "gui/main_dialog.py",
      "suggestions": [
        {
          "type": "excessive_imports",
          "priority": "medium",
          "message": "Too many imports (28)",
          "suggestions": [
            "Group related imports",
            "Group from imports",
            "Remove unused imports"
          ]
        }
      ]
    },
    {
      "module": "gui/main_dialog_interpretation.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (36) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "gui/preview_axes_manager.py",
      "suggestions": [
        {
          "type": "functions_too_long",
          "priority": "medium",
          "message": "Very long functions (average 66.7 lines/function).",
          "suggestions": [
            "Refactor functions > 50 lines",
            "Extract common logic to helper functions",
            "Use comprehensions and generators"
          ]
        }
      ]
    },
    {
      "module": "gui/preview_renderer.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (31) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        }
      ]
    },
    {
      "module": "gui/main_dialog_preview.py",
      "suggestions": [
        {
          "type": "complexity_refactoring",
          "priority": "high",
          "message": "High complexity (55) with several functions. Consider breaking down large logic.",
          "suggestions": [
            "Extract methods from long functions",
            "Use polymorphism instead of long if/else chains",
            "Apply SOLID principles"
          ]
        },
        {
          "type": "module_too_large",
          "priority": "medium",
          "message": "Module is quite large (678 lines)",
          "suggestions": [
            "Split into multiple modules",
            "Extract classes to separate files"
          ]
        }
      ]
    }
  ],
  "security": [
    {
      "module": "core/controller.py",
      "issues": [
        {
          "pattern": "md5(",
          "description": "Insecure hash usage",
          "severity": "medium",
          "line": 115,
          "code": "hasher = hashlib.md5()"
        }
      ],
      "total_issues": 1,
      "max_severity": "medium"
    },
    {
      "module": "exporters/csv_exporter.py",
      "issues": [
        {
          "pattern": "open(",
          "description": "File opening without path validation",
          "severity": "medium",
          "line": 42,
          "code": "with output_path.open(\"w\", newline=\"\", encoding=\"utf-8\") as f:"
        }
      ],
      "total_issues": 1,
      "max_severity": "medium"
    },
    {
      "module": "update_metadata_rule.py",
      "issues": [
        {
          "pattern": "open(",
          "description": "File opening without path validation",
          "severity": "medium",
          "line": 26,
          "code": "with open(filepath) as f:"
        }
      ],
      "total_issues": 1,
      "max_severity": "medium"
    }
  ],
  "entry_points": [],
  "patterns": {}
}