Class: Html::Merge::Provider

Inherits:
Object
  • Object
show all
Defined in:
lib/html/merge/provider.rb,
sig/html/merge.rbs

Overview

Conservative, base-aware HTML provider. Only parser-proven unique IDs and singleton head semantics become independently editable source owners. rubocop:disable Metrics/AbcSize, Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/ParameterLists, Metrics/PerceivedComplexity -- ownership, rendering, and verification are one safety boundary

Defined Under Namespace

Classes: Decision, Document, ExactDocument, Owner

Constant Summary collapse

DEFAULT_PROFILE =

Returns:

  • (Symbol)
:source_preserving
VOID_ELEMENTS =
%w[area base br col embed hr img input link meta param source track wbr].freeze

Instance Method Summary collapse

Instance Method Details

#analyze(request) ⇒ Hash[Symbol, untyped]

Parameters:

  • request (Hash[Symbol, untyped])

Returns:

  • (Hash[Symbol, untyped])


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/html/merge/provider.rb', line 37

def analyze(request)
  document = parse_document(:analyze, request, :source)
  return document if provider_failure?(document)

  result(
    :analyze,
    request,
    analysis: {
      backend: BACKEND_REFERENCE.id,
      valid: true,
      owners: document.owners.map { |owner| owner_description(owner) }
    },
    diagnostics: nonblocking_issues(document.analysis, :source),
    verification: { source_parsed: true, ast_attributes_verified: true }
  )
end

#capabilitiesHash[Symbol, untyped]

Returns:

  • (Hash[Symbol, untyped])


25
26
27
28
29
30
31
32
33
34
35
# File 'lib/html/merge/provider.rb', line 25

def capabilities
  {
    operations: Ast::Merge::ProviderContract::OPERATIONS,
    dialects: %i[html],
    backends: [BACKEND_REFERENCE.id.to_sym],
    profiles: [DEFAULT_PROFILE],
    role: :workflow,
    ast_ownership: :unique_explicit_ids_and_safe_singletons,
    source_preservation: %i[exact_source exact_fragments byte_provenance reparse semantic_verification]
  }.freeze
end

#diff2(request) ⇒ Hash[Symbol, untyped]

Parameters:

  • request (Hash[Symbol, untyped])

Returns:

  • (Hash[Symbol, untyped])


54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/html/merge/provider.rb', line 54

def diff2(request)
  before = parse_document(:diff2, request, :before)
  return before if provider_failure?(before)

  after = parse_document(:diff2, request, :after)
  return after if provider_failure?(after)

  changes = diff_documents(before, after)
  result(
    :diff2,
    request,
    diff: { changes: changes },
    changes: changes,
    verification: { before_parsed: true, after_parsed: true, ast_attributes_verified: true }
  )
end

#familyString

Returns:

  • (String)


23
# File 'lib/html/merge/provider.rb', line 23

def family = "html"

#merge2(request) ⇒ Hash[Symbol, untyped]

Parameters:

  • request (Hash[Symbol, untyped])

Returns:

  • (Hash[Symbol, untyped])


71
72
73
74
75
76
77
78
79
80
# File 'lib/html/merge/provider.rb', line 71

def merge2(request)
  merged = merge3(
    request.merge(
      base_source: request.fetch(:current_source),
      ours_source: request.fetch(:current_source),
      theirs_source: request.fetch(:incoming_source)
    )
  )
  merged.merge(operation: :merge2, verification: merged.fetch(:verification).except(:base_participated))
end

#merge3(request) ⇒ Hash[Symbol, untyped]

Parameters:

  • request (Hash[Symbol, untyped])

Returns:

  • (Hash[Symbol, untyped])


82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/html/merge/provider.rb', line 82

def merge3(request)
  exact_role = exact_revision_role(request)
  return merge3_exact(request, exact_role) if exact_role

  documents = parse_merge3_documents(request)
  return documents if provider_failure?(documents)

  decision = decide(documents)
  return render_conflicts(request, documents, decision) unless decision.conflicts.empty?

  render_composite(request, documents, decision)
end

#provider_idString

Returns:

  • (String)


22
# File 'lib/html/merge/provider.rb', line 22

def provider_id = "ruby.html"