Class: Json::Merge::Provider
- Inherits:
-
Object
- Object
- Json::Merge::Provider
- Defined in:
- lib/json/merge/provider.rb,
sig/json/merge.rbs
Overview
Portable JSON-family provider for Ast::Merge dispatch. rubocop:disable Metrics/AbcSize, Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/ParameterLists, Metrics/PerceivedComplexity -- provider operations keep request, rendering, and result-envelope logic together
Constant Summary collapse
- DIALECTS =
%i[json jsonc json5].freeze
- DEFAULT_PROFILE =
:source_preserving
Instance Method Summary collapse
- #analyze(request) ⇒ Ast::Merge::provider_result
- #capabilities ⇒ Ast::Merge::provider_capabilities
- #diff2(request) ⇒ Ast::Merge::provider_result
- #family ⇒ String
- #merge2(request) ⇒ Ast::Merge::provider_result
- #merge3(request) ⇒ Ast::Merge::provider_result
- #provider_id ⇒ String
Instance Method Details
#analyze(request) ⇒ Ast::Merge::provider_result
30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/json/merge/provider.rb', line 30 def analyze(request) dialect = dialect_for(request) parsed = Json::Merge.parse_json(request.fetch(:source), dialect, backend: request[:backend]) return parse_failure(:analyze, :source, parsed, request) unless parsed[:ok] result( :analyze, request, analysis: parsed.fetch(:analysis), verification: { source_parsed: true } ) end |
#capabilities ⇒ Ast::Merge::provider_capabilities
19 20 21 22 23 24 25 26 27 28 |
# File 'lib/json/merge/provider.rb', line 19 def capabilities { operations: Ast::Merge::ProviderContract::OPERATIONS, dialects: DIALECTS, backends: [Json::Merge::TREE_SITTER_BACKEND.id.to_sym], profiles: [DEFAULT_PROFILE], role: :workflow, source_preservation: %i[exact_source family_synthesis line_provenance reparse] }.freeze end |
#diff2(request) ⇒ Ast::Merge::provider_result
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/json/merge/provider.rb', line 43 def diff2(request) before = parse_role!(:diff2, request, :before) return before if provider_failure?(before) after = parse_role!(:diff2, request, :after) return after if provider_failure?(after) changes = diff_values(before, after, path: '') result( :diff2, request, diff: { changes: changes, before: before, after: after }, changes: changes, verification: { before_parsed: true, after_parsed: true } ) end |
#family ⇒ String
15 16 17 |
# File 'lib/json/merge/provider.rb', line 15 def family 'json' end |
#merge2(request) ⇒ Ast::Merge::provider_result
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/json/merge/provider.rb', line 60 def merge2(request) dialect = dialect_for(request) merged = Json::Merge.merge_json( request.fetch(:incoming_source), request.fetch(:current_source), dialect, backend: request[:backend] ) return merge2_failure(merged, request) unless merged[:ok] output = merged.fetch(:output) verified = parse_output(output, request) result( :merge2, request, output: output, changes: [], render_report: { strategy: :json_smart_merger, synthesis: :family_emission }, verification: { output_reparsed: true, semantic_value: verified } ) rescue Json::Merge::ParseError => e failure( :merge2, request, category: :render_failure, message: "JSON family emitter produced invalid output: #{e.}" ) end |
#merge3(request) ⇒ Ast::Merge::provider_result
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/json/merge/provider.rb', line 89 def merge3(request) values = parse_merge3_roles(request) return values if provider_failure?(values) decision = ThreeWayDecision.new.call(**values) rendered = render_merge3(decision, request, values) return rendered if provider_failure?(rendered) result( :merge3, request, **rendered, changes: decision.changes, conflicts: decision.conflicts, verification: rendered.fetch(:verification).merge(base_participated: true) ) end |
#provider_id ⇒ String
11 12 13 |
# File 'lib/json/merge/provider.rb', line 11 def provider_id 'ruby.json' end |