Module: ArchUnit::Metrics::Extraction

Defined in:
lib/archunit/metrics/extraction/metric_info.rb,
lib/archunit/metrics/extraction/distance_info.rb,
lib/archunit/metrics/extraction/extract_project_info.rb,
lib/archunit/metrics/extraction/extract_distance_info.rb,
lib/archunit/metrics/extraction/source_metrics_visitor.rb

Overview

Ruby-specific extraction enriched with dependency coupling.

Defined Under Namespace

Classes: ClassInfo, DistanceInfo, FieldInfo, FileInfo, MethodInfo, ProjectInfo

Class Method Summary collapse

Class Method Details

.extract_distance_infos(project_locator = nil, options: nil) ⇒ Object

Enriches static file facts with distinct internal incoming/outgoing dependencies.



14
15
16
17
18
19
# File 'lib/archunit/metrics/extraction/extract_distance_info.rb', line 14

def extract_distance_infos(project_locator = nil, options: nil)
  project = extract_project_info(project_locator)
  graph = ArchUnit::Extraction.extract_graph(project.project_root, options:)
  outgoing, incoming = coupling_indexes(graph, project.files.map(&:path))
  build_distance_infos(project, outgoing, incoming)
end

.extract_file_info(source_file, relative_path: nil) ⇒ Object



25
26
27
28
29
30
31
32
# File 'lib/archunit/metrics/extraction/extract_project_info.rb', line 25

def extract_file_info(source_file, relative_path: nil)
  path = source_path(source_file)
  identifier = (relative_path || path.basename.to_s).to_s.tr('\\', '/')
  source = path.read
  build_file_info(identifier, source)
rescue SystemCallError => e
  raise TechnicalError, "could not extract Ruby source metrics: #{e.message}"
end

.extract_project_info(project_locator = nil, exclude_patterns: nil) ⇒ Object



17
18
19
20
21
22
23
# File 'lib/archunit/metrics/extraction/extract_project_info.rb', line 17

def extract_project_info(project_locator = nil, exclude_patterns: nil)
  root = Pathname.new(ArchUnit::Extraction.locate_project(project_locator))
  files = ArchUnit::Extraction.enumerate_source_files(root, exclude_patterns:).map do |path|
    extract_file_info(root.join(path), relative_path: path)
  end
  ProjectInfo.new(project_root: root.to_s, files:)
end