Module: MetzScan::Analyzers::NamespaceLeakPressure::SharedNamespaceTriage

Defined in:
lib/metz_scan/analyzers/namespace_leak_pressure/shared_namespace_triage.rb,
lib/metz_scan/analyzers/namespace_leak_pressure/shared_namespace_triage/exception_declaration.rb

Defined Under Namespace

Classes: ExceptionDeclaration

Constant Summary collapse

CATEGORY =
"shared_namespace"
CONFIDENCE =
"low"
TRIAGE_SEVERITY =
"shared namespace"
TRIAGE_SUMMARY =
"Shared namespace signal; review public constants and extension points only when " \
"they make app code depend on namespace internals."
WHY =
"Public constants, error families, and framework extension namespaces are often intentional APIs."
SUGGESTED_NEXT_MOVES =
[
  "Leave stable public constants alone when the namespace is the intended API.",
  "Introduce a narrower public object only when callers repeat namespace-specific knowledge."
].freeze

Class Method Summary collapse

Class Method Details

.attributes(status) ⇒ Object



36
37
38
39
# File 'lib/metz_scan/analyzers/namespace_leak_pressure/shared_namespace_triage.rb', line 36

def attributes(status)
  { project_analyzer_status: status, confidence: CONFIDENCE,
    triage_severity: TRIAGE_SEVERITY, triage_summary: TRIAGE_SUMMARY }
end

.constant_like_tail?(segment) ⇒ Boolean

Returns:

  • (Boolean)


55
56
57
# File 'lib/metz_scan/analyzers/namespace_leak_pressure/shared_namespace_triage.rb', line 55

def constant_like_tail?(segment)
  segment.to_s.match?(/\A[A-Z][A-Z0-9_]*\z/)
end

.error_like_tail?(segment) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/metz_scan/analyzers/namespace_leak_pressure/shared_namespace_triage.rb', line 59

def error_like_tail?(segment)
  segment.to_s.match?(ERROR_SUFFIX_PATTERN)
end

.exception_family_segment?(segment) ⇒ Boolean

Returns:

  • (Boolean)


63
64
65
# File 'lib/metz_scan/analyzers/namespace_leak_pressure/shared_namespace_triage.rb', line 63

def exception_family_segment?(segment)
  segment.to_s.match?(EXCEPTION_FAMILY_SEGMENT_PATTERN)
end

.framework_namespace?(name) ⇒ Boolean

Returns:

  • (Boolean)


47
48
49
# File 'lib/metz_scan/analyzers/namespace_leak_pressure/shared_namespace_triage.rb', line 47

def framework_namespace?(name)
  name.to_s.match?(FRAMEWORK_NAMESPACE_PATTERN)
end

.shared?(declaration) ⇒ Boolean

Returns:

  • (Boolean)


30
31
32
33
34
# File 'lib/metz_scan/analyzers/namespace_leak_pressure/shared_namespace_triage.rb', line 30

def shared?(declaration)
  shared_name?(declaration.name) ||
    ExceptionDeclaration.exception?(declaration) ||
    framework_namespace?(declaration.name)
end

.shared_name?(name) ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
44
45
# File 'lib/metz_scan/analyzers/namespace_leak_pressure/shared_namespace_triage.rb', line 41

def shared_name?(name)
  segments = name.to_s.split("::")
  segments.any? { |segment| shared_segment?(segment) } ||
    constant_like_tail?(segments.last) || error_like_tail?(segments.last)
end

.shared_segment?(segment) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/metz_scan/analyzers/namespace_leak_pressure/shared_namespace_triage.rb', line 51

def shared_segment?(segment)
  segment.to_s.match?(SHARED_SEGMENT_PATTERN) || exception_family_segment?(segment)
end