Class: Ace::Compressor::Models::ContextPack

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/compressor/models/context_pack.rb

Constant Summary collapse

SCHEMA =
"ContextPack/3"

Class Method Summary collapse

Class Method Details

.cmd_line(command) ⇒ Object



84
85
86
# File 'lib/ace/compressor/models/context_pack.rb', line 84

def self.cmd_line(command)
  "CMD|#{escape(command)}"
end

.code_line(language, code) ⇒ Object



96
97
98
99
# File 'lib/ace/compressor/models/context_pack.rb', line 96

def self.code_line(language, code)
  language_value = language.to_s.strip.empty? ? "code" : language.to_s.strip
  "CODE|#{escape(language_value)}|#{escape(code)}"
end

.constraint_line(text) ⇒ Object



64
65
66
# File 'lib/ace/compressor/models/context_pack.rb', line 64

def self.constraint_line(text)
  "CONSTRAINT|#{escape(text)}"
end

.encode_table_data_rows(rows) ⇒ Object



157
158
159
# File 'lib/ace/compressor/models/context_pack.rb', line 157

def self.encode_table_data_rows(rows)
  Array(rows).map { |cells| Array(cells).map { |cell| escape_table_cell(cell) }.join(">") }.join(";")
end

.escape(value) ⇒ Object



9
10
11
# File 'lib/ace/compressor/models/context_pack.rb', line 9

def self.escape(value)
  value.to_s.gsub("|", "\\|").tr("\n", " ").strip
end

.escape_table_cell(value) ⇒ Object



161
162
163
# File 'lib/ace/compressor/models/context_pack.rb', line 161

def self.escape_table_cell(value)
  value.to_s.gsub("\\", "\\\\").gsub(">", "\\>").gsub(";", "\\;").strip
end

.example_line(tool) ⇒ Object



80
81
82
# File 'lib/ace/compressor/models/context_pack.rb', line 80

def self.example_line(tool)
  "EXAMPLE|#{escape("tool=#{tool}")}"
end

.example_ref_line(tool:, source:, original_source:, reason: "duplicate") ⇒ Object



134
135
136
# File 'lib/ace/compressor/models/context_pack.rb', line 134

def self.example_ref_line(tool:, source:, original_source:, reason: "duplicate")
  "EXAMPLE_REF|tool=#{escape(tool)}|source=#{escape(source)}|original_source=#{escape(original_source)}|reason=#{escape(reason)}"
end

.fact_line(text) ⇒ Object



56
57
58
# File 'lib/ace/compressor/models/context_pack.rb', line 56

def self.fact_line(text)
  "FACT|#{escape(text)}"
end

.fallback_line(source:, from:, to:, reason:, check: nil, details: nil) ⇒ Object



41
42
43
44
45
46
# File 'lib/ace/compressor/models/context_pack.rb', line 41

def self.fallback_line(source:, from:, to:, reason:, check: nil, details: nil)
  line = "FALLBACK|source=#{escape(source)}|from=#{escape(from)}|to=#{escape(to)}|reason=#{escape(reason)}"
  line += "|check=#{escape(check)}" unless check.to_s.strip.empty?
  line += "|details=#{escape(details)}" unless details.to_s.strip.empty?
  line
end

.fidelity_line(source:, status:, check:, details: nil) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/ace/compressor/models/context_pack.rb', line 25

def self.fidelity_line(source:, status:, check:, details: nil)
  line = "FIDELITY|source=#{escape(source)}|status=#{escape(status)}|check=#{escape(check)}"
  details_text = details.to_s.strip
  return line if details_text.empty?

  "#{line}|details=#{escape(details_text)}"
end

.file_line(source) ⇒ Object



17
18
19
# File 'lib/ace/compressor/models/context_pack.rb', line 17

def self.file_line(source)
  "FILE|#{escape(source)}"
end

.files_line(label, files) ⇒ Object



88
89
90
# File 'lib/ace/compressor/models/context_pack.rb', line 88

def self.files_line(label, files)
  "FILES|#{escape(label)}|[#{Array(files).map { |value| escape(value) }.join(",")}]"
end

.guidance_line(source:, retry_with:) ⇒ Object



37
38
39
# File 'lib/ace/compressor/models/context_pack.rb', line 37

def self.guidance_line(source:, retry_with:)
  "GUIDANCE|source=#{escape(source)}|retry_with=#{escape(retry_with)}"
end

.header(mode) ⇒ Object



13
14
15
# File 'lib/ace/compressor/models/context_pack.rb', line 13

def self.header(mode)
  "H|#{SCHEMA}|#{escape(mode)}"
end

.list_line(list_key, items) ⇒ Object



73
74
75
76
77
78
# File 'lib/ace/compressor/models/context_pack.rb', line 73

def self.list_line(list_key, items)
  values = Array(items).map { |item| escape(item) }.join(",")
  key = list_key.to_s.strip
  key = "items" if key.empty?
  "LIST|#{escape(key)}|[#{values}]"
end

.loss_line(kind:, target:, strategy:, original:, retained:, unit:, source: nil, details: nil) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/ace/compressor/models/context_pack.rb', line 111

def self.loss_line(kind:, target:, strategy:, original:, retained:, unit:, source: nil, details: nil)
  unit_key = unit.to_s.strip
  unit_key = "items" if unit_key.empty?
  unit_key = unit_key.gsub(/[^a-z0-9_]/i, "_")

  original_count = original.to_i
  retained_count = retained.to_i
  dropped_count = [original_count - retained_count, 0].max

  line = [
    "LOSS|kind=#{escape(kind)}",
    "target=#{escape(target)}",
    "strategy=#{escape(strategy)}",
    "original_#{unit_key}=#{escape(original_count)}",
    "retained_#{unit_key}=#{escape(retained_count)}",
    "dropped_#{unit_key}=#{escape(dropped_count)}"
  ].join("|")

  line += "|source=#{escape(source)}" unless source.to_s.strip.empty?
  line += "|details=#{escape(details)}" unless details.to_s.strip.empty?
  line
end

.normalize_table_rows(rows) ⇒ Object



142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/ace/compressor/models/context_pack.rb', line 142

def self.normalize_table_rows(rows)
  row_values = Array(rows)
  return [[], []] if row_values.empty?

  return [[], []] if row_values.all? { |row| row.to_s.strip.empty? }

  if row_values.length == 1 && !row_values.first.to_s.include?("|")
    return [[], [row_values.first.to_s]]
  end

  header_cells = parse_table_cells(row_values[0])
  data_rows = row_values[1..].to_a.reject { |row| table_separator_row?(row) }.map { |row| parse_table_cells(row) }
  [header_cells, data_rows]
end

.parse_table_cells(row) ⇒ Object



165
166
167
# File 'lib/ace/compressor/models/context_pack.rb', line 165

def self.parse_table_cells(row)
  row.to_s.split("|").map(&:strip).reject(&:empty?)
end

.policy_line(doc_class:, action:) ⇒ Object



21
22
23
# File 'lib/ace/compressor/models/context_pack.rb', line 21

def self.policy_line(doc_class:, action:)
  "POLICY|class=#{escape(doc_class)}|action=#{escape(action)}"
end

.problems_line(items) ⇒ Object



68
69
70
71
# File 'lib/ace/compressor/models/context_pack.rb', line 68

def self.problems_line(items)
  values = Array(items).map { |item| escape(item) }.join(",")
  "PROBLEMS|[#{values}]"
end

.refusal_line(source:, reason:, failed_check:) ⇒ Object



33
34
35
# File 'lib/ace/compressor/models/context_pack.rb', line 33

def self.refusal_line(source:, reason:, failed_check:)
  "REFUSAL|source=#{escape(source)}|reason=#{escape(reason)}|failed_check=#{escape(failed_check)}"
end

.rule_line(text) ⇒ Object



60
61
62
# File 'lib/ace/compressor/models/context_pack.rb', line 60

def self.rule_line(text)
  "RULE|#{escape(text)}"
end

.section_line(title) ⇒ Object



48
49
50
# File 'lib/ace/compressor/models/context_pack.rb', line 48

def self.section_line(title)
  "SEC|#{escape(title)}"
end

.summary_line(text) ⇒ Object



52
53
54
# File 'lib/ace/compressor/models/context_pack.rb', line 52

def self.summary_line(text)
  "SUMMARY|#{escape(text)}"
end

.table_line(rows, table_id: nil, strategy: nil) ⇒ Object



101
102
103
104
105
106
107
108
109
# File 'lib/ace/compressor/models/context_pack.rb', line 101

def self.table_line(rows, table_id: nil, strategy: nil)
  fields = []
  columns, data_rows = normalize_table_rows(rows)
  fields << "id=#{escape(table_id)}" unless table_id.to_s.strip.empty?
  fields << "strategy=#{escape(strategy)}" unless strategy.to_s.strip.empty?
  fields << "cols=#{escape(columns.join(","))}" unless columns.empty?
  fields << "rows=#{escape(encode_table_data_rows(data_rows))}"
  "TABLE|#{fields.join("|")}"
end

.table_separator_row?(row) ⇒ Boolean

Returns:

  • (Boolean)


169
170
171
# File 'lib/ace/compressor/models/context_pack.rb', line 169

def self.table_separator_row?(row)
  row.to_s.strip.match?(/\A\|?[-\s:|]+\|?\z/)
end

.tree_line(label, tree) ⇒ Object



92
93
94
# File 'lib/ace/compressor/models/context_pack.rb', line 92

def self.tree_line(label, tree)
  "TREE|#{escape(label)}|#{escape(tree)}"
end

.unresolved_line(kind, raw) ⇒ Object



138
139
140
# File 'lib/ace/compressor/models/context_pack.rb', line 138

def self.unresolved_line(kind, raw)
  "U|#{escape(kind)}|#{escape(raw)}"
end