markdown-merge 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +251 -0
  4. data/CITATION.cff +20 -0
  5. data/CODE_OF_CONDUCT.md +134 -0
  6. data/CONTRIBUTING.md +227 -0
  7. data/FUNDING.md +74 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +1087 -0
  10. data/REEK +0 -0
  11. data/RUBOCOP.md +71 -0
  12. data/SECURITY.md +21 -0
  13. data/lib/markdown/merge/cleanse/block_spacing.rb +253 -0
  14. data/lib/markdown/merge/cleanse/code_fence_spacing.rb +294 -0
  15. data/lib/markdown/merge/cleanse/condensed_link_refs.rb +405 -0
  16. data/lib/markdown/merge/cleanse.rb +42 -0
  17. data/lib/markdown/merge/code_block_merger.rb +300 -0
  18. data/lib/markdown/merge/conflict_resolver.rb +128 -0
  19. data/lib/markdown/merge/debug_logger.rb +26 -0
  20. data/lib/markdown/merge/document_problems.rb +190 -0
  21. data/lib/markdown/merge/file_aligner.rb +196 -0
  22. data/lib/markdown/merge/file_analysis.rb +353 -0
  23. data/lib/markdown/merge/file_analysis_base.rb +629 -0
  24. data/lib/markdown/merge/freeze_node.rb +93 -0
  25. data/lib/markdown/merge/gap_line_node.rb +136 -0
  26. data/lib/markdown/merge/link_definition_formatter.rb +49 -0
  27. data/lib/markdown/merge/link_definition_node.rb +157 -0
  28. data/lib/markdown/merge/link_parser.rb +421 -0
  29. data/lib/markdown/merge/link_reference_rehydrator.rb +320 -0
  30. data/lib/markdown/merge/markdown_structure.rb +123 -0
  31. data/lib/markdown/merge/merge_result.rb +166 -0
  32. data/lib/markdown/merge/node_type_normalizer.rb +126 -0
  33. data/lib/markdown/merge/output_builder.rb +166 -0
  34. data/lib/markdown/merge/partial_template_merger.rb +334 -0
  35. data/lib/markdown/merge/smart_merger.rb +221 -0
  36. data/lib/markdown/merge/smart_merger_base.rb +621 -0
  37. data/lib/markdown/merge/table_match_algorithm.rb +504 -0
  38. data/lib/markdown/merge/table_match_refiner.rb +136 -0
  39. data/lib/markdown/merge/version.rb +12 -0
  40. data/lib/markdown/merge/whitespace_normalizer.rb +251 -0
  41. data/lib/markdown/merge.rb +149 -0
  42. data/lib/markdown-merge.rb +4 -0
  43. data/sig/markdown/merge.rbs +341 -0
  44. data.tar.gz.sig +0 -0
  45. metadata +365 -0
  46. metadata.gz.sig +0 -0
@@ -0,0 +1,341 @@
1
+ module Markdown
2
+ module Merge
3
+ VERSION: String
4
+
5
+ # Base error class for Markdown::Merge
6
+ class Error < Ast::Merge::Error
7
+ end
8
+
9
+ # Raised when a Markdown file has parsing errors
10
+ class ParseError < Ast::Merge::ParseError
11
+ def initialize: (?String? message, ?content: String?, ?errors: Array[untyped]) -> void
12
+ end
13
+
14
+ # Raised when the template file has syntax errors
15
+ class TemplateParseError < ParseError
16
+ end
17
+
18
+ # Raised when the destination file has syntax errors
19
+ class DestinationParseError < ParseError
20
+ end
21
+
22
+ # Debug logging utility for Markdown::Merge operations
23
+ module DebugLogger
24
+ extend Ast::Merge::DebugLogger
25
+
26
+ def self.env_var_name: () -> String
27
+ def self.env_var_name=: (String name) -> String
28
+ def self.log_prefix: () -> String
29
+ def self.log_prefix=: (String prefix) -> String
30
+ def self.enabled?: () -> bool
31
+ def self.debug: (*untyped args) -> void
32
+ def self.info: (*untyped args) -> void
33
+ def self.warning: (*untyped args) -> void
34
+ def self.time: [T] (String label) { () -> T } -> T
35
+ def self.log_node: (untyped node, ?label: String) -> void
36
+ end
37
+
38
+ # Represents a frozen block of Markdown content
39
+ class FreezeNode < Ast::Merge::FreezeNodeBase
40
+ def initialize: (
41
+ start_line: Integer,
42
+ end_line: Integer,
43
+ content: String,
44
+ start_marker: String,
45
+ end_marker: String,
46
+ ?nodes: Array[untyped],
47
+ ?reason: String?
48
+ ) -> void
49
+
50
+ def signature: () -> Array[Symbol | String]
51
+ def full_text: () -> String
52
+ def line_count: () -> Integer
53
+ def contains_type?: (Symbol type_symbol) -> bool
54
+ def inspect: () -> String
55
+ end
56
+
57
+ # Base class for file analysis for Markdown files
58
+ class FileAnalysisBase
59
+ include Ast::Merge::FileAnalyzable
60
+
61
+ DEFAULT_FREEZE_TOKEN: String
62
+
63
+ attr_reader document: untyped
64
+ attr_reader statements: Array[untyped]
65
+
66
+ def initialize: (
67
+ String source,
68
+ ?freeze_token: String,
69
+ ?signature_generator: (^(untyped) -> (Array[untyped] | untyped | nil))?,
70
+ **untyped parser_options
71
+ ) -> void
72
+
73
+ # Abstract methods - subclasses must implement
74
+ def parse_document: (String source) -> untyped
75
+ def next_sibling: (untyped node) -> untyped?
76
+
77
+ def valid?: () -> bool
78
+ def compute_node_signature: (untyped node) -> Array[untyped]?
79
+ def fallthrough_node?: (untyped value) -> bool
80
+ def parser_node?: (untyped value) -> bool
81
+ def compute_parser_signature: (untyped node) -> Array[untyped]?
82
+ def safe_string_content: (untyped node) -> String
83
+ def extract_text_content: (untyped node) -> String
84
+ def extract_table_header_content: (untyped node) -> String
85
+ def source_range: (Integer start_line, Integer end_line) -> String
86
+ def count_children: (untyped node) -> Integer
87
+
88
+ private
89
+
90
+ def extract_and_integrate_all_nodes: () -> Array[untyped]
91
+ def collect_top_level_nodes: () -> Array[untyped]
92
+ def build_freeze_blocks: (Array[untyped] nodes) -> Array[FreezeNode]
93
+ def integrate_freeze_blocks: (Array[untyped] nodes, Array[FreezeNode] freeze_blocks) -> Array[untyped]
94
+ end
95
+
96
+ # Aligns Markdown block elements between template and destination files
97
+ class FileAligner
98
+ attr_reader template_analysis: FileAnalysisBase
99
+ attr_reader dest_analysis: FileAnalysisBase
100
+ attr_reader match_refiner: (^(Array[untyped], Array[untyped], Hash[Symbol, untyped]) -> Array[MatchResult])?
101
+
102
+ def initialize: (
103
+ FileAnalysisBase template_analysis,
104
+ FileAnalysisBase dest_analysis,
105
+ ?match_refiner: (^(Array[untyped], Array[untyped], Hash[Symbol, untyped]) -> Array[MatchResult])?
106
+ ) -> void
107
+
108
+ def align: () -> Array[Hash[Symbol, untyped]]
109
+
110
+ private
111
+
112
+ def build_signature_map: (Array[untyped] statements, FileAnalysisBase analysis) -> Hash[Array[untyped], Array[Integer]]
113
+ end
114
+
115
+ # Match result from refiners
116
+ class MatchResult
117
+ attr_reader template_node: untyped
118
+ attr_reader dest_node: untyped
119
+ attr_reader score: Float
120
+
121
+ def initialize: (
122
+ template_node: untyped,
123
+ dest_node: untyped,
124
+ score: Float
125
+ ) -> void
126
+ end
127
+
128
+ # Resolves conflicts between matching Markdown elements
129
+ class ConflictResolver < Ast::Merge::ConflictResolverBase
130
+ def initialize: (
131
+ preference: Symbol,
132
+ template_analysis: FileAnalysisBase,
133
+ dest_analysis: FileAnalysisBase
134
+ ) -> void
135
+
136
+ private
137
+
138
+ def resolve_node_pair: (
139
+ untyped template_node,
140
+ untyped dest_node,
141
+ template_index: Integer,
142
+ dest_index: Integer
143
+ ) -> Hash[Symbol, untyped]
144
+
145
+ def content_identical?: (untyped template_node, untyped dest_node) -> bool
146
+ def node_to_text: (untyped node, FileAnalysisBase analysis) -> String
147
+ end
148
+
149
+ # Represents the result of a Markdown merge operation
150
+ class MergeResult < Ast::Merge::MergeResultBase
151
+ def initialize: (
152
+ content: String?,
153
+ ?conflicts: Array[Hash[Symbol, untyped]],
154
+ ?frozen_blocks: Array[Hash[Symbol, untyped]],
155
+ ?stats: Hash[Symbol, untyped]
156
+ ) -> void
157
+
158
+ def content: () -> String?
159
+ def content?: () -> bool
160
+ def content_string: () -> String?
161
+ def success?: () -> bool
162
+ def conflicts?: () -> bool
163
+ def has_frozen_blocks?: () -> bool
164
+ def nodes_added: () -> Integer
165
+ def nodes_removed: () -> Integer
166
+ def nodes_modified: () -> Integer
167
+ def merge_time_ms: () -> Float?
168
+ def frozen_count: () -> Integer
169
+ def inspect: () -> String
170
+ def to_s: () -> String
171
+
172
+ private
173
+
174
+ def default_stats: () -> Hash[Symbol, untyped]
175
+ end
176
+
177
+ # Algorithm for computing match scores between two Markdown tables
178
+ class TableMatchAlgorithm
179
+ DEFAULT_WEIGHTS: Hash[Symbol, Float]
180
+ FIRST_COLUMN_SIMILARITY_THRESHOLD: Float
181
+
182
+ attr_reader position_a: Integer?
183
+ attr_reader position_b: Integer?
184
+ attr_reader total_tables_a: Integer
185
+ attr_reader total_tables_b: Integer
186
+ attr_reader weights: Hash[Symbol, Float]
187
+
188
+ def initialize: (
189
+ ?position_a: Integer?,
190
+ ?position_b: Integer?,
191
+ ?total_tables_a: Integer,
192
+ ?total_tables_b: Integer,
193
+ ?weights: Hash[Symbol, Float]
194
+ ) -> void
195
+
196
+ def call: (untyped table_a, untyped table_b) -> Float
197
+
198
+ private
199
+
200
+ def levenshtein_distance: (String a, String b) -> Integer
201
+ def levenshtein_similarity: (String a, String b) -> Float
202
+ def extract_rows: (untyped table) -> Array[Array[String]]
203
+ def extract_cell_text: (untyped cell) -> String
204
+ def compute_header_match: (Array[Array[String]] rows_a, Array[Array[String]] rows_b) -> Float
205
+ def compute_first_column_match: (Array[Array[String]] rows_a, Array[Array[String]] rows_b) -> Float
206
+ def compute_row_content_match: (Array[Array[String]] rows_a, Array[Array[String]] rows_b) -> Float
207
+ def compute_total_cells_match: (Array[Array[String]] rows_a, Array[Array[String]] rows_b) -> Float
208
+ def compute_position_score: () -> Float
209
+ def weighted_average: (Hash[Symbol, Float] scores) -> Float
210
+ end
211
+
212
+ # Match refiner for Markdown tables that didn't match by exact signature
213
+ class TableMatchRefiner < Ast::Merge::MatchRefinerBase
214
+ attr_reader algorithm_options: Hash[Symbol, untyped]
215
+
216
+ def initialize: (
217
+ ?threshold: Float,
218
+ ?algorithm_options: Hash[Symbol, untyped],
219
+ **untyped options
220
+ ) -> void
221
+
222
+ def call: (
223
+ Array[untyped] template_nodes,
224
+ Array[untyped] dest_nodes,
225
+ ?Hash[Symbol, untyped] context
226
+ ) -> Array[MatchResult]
227
+
228
+ private
229
+
230
+ def extract_tables: (Array[untyped] nodes) -> Array[untyped]
231
+ def table_node?: (untyped node) -> bool
232
+ def compute_table_similarity: (
233
+ untyped t_table,
234
+ untyped d_table,
235
+ Integer t_idx,
236
+ Integer d_idx,
237
+ Integer total_t,
238
+ Integer total_d
239
+ ) -> Float
240
+ end
241
+
242
+ # Merges fenced code blocks using language-specific *-merge gems
243
+ class CodeBlockMerger
244
+ DEFAULT_MERGERS: Hash[String, ^(String, String, Symbol, **untyped) -> Hash[Symbol, untyped]]
245
+
246
+ attr_reader mergers: Hash[String, ^(String, String, Symbol, **untyped) -> Hash[Symbol, untyped]]
247
+ attr_reader enabled: bool
248
+
249
+ def initialize: (
250
+ ?mergers: Hash[String, ^(String, String, Symbol, **untyped) -> Hash[Symbol, untyped]],
251
+ ?enabled: bool
252
+ ) -> void
253
+
254
+ def supports_language?: (String? language) -> bool
255
+ def merge_code_blocks: (
256
+ untyped template_node,
257
+ untyped dest_node,
258
+ preference: Symbol,
259
+ **untyped opts
260
+ ) -> Hash[Symbol, untyped]
261
+
262
+ # Class methods for specific mergers
263
+ def self.merge_with_prism: (String template, String dest, Symbol preference, **untyped opts) -> Hash[Symbol, untyped]
264
+ def self.merge_with_psych: (String template, String dest, Symbol preference, **untyped opts) -> Hash[Symbol, untyped]
265
+ def self.merge_with_json: (String template, String dest, Symbol preference, **untyped opts) -> Hash[Symbol, untyped]
266
+ def self.merge_with_toml: (String template, String dest, Symbol preference, **untyped opts) -> Hash[Symbol, untyped]
267
+
268
+ private
269
+
270
+ def extract_language: (untyped node) -> String?
271
+ def extract_content: (untyped node) -> String
272
+ def rebuild_code_block: (String language, String content, untyped reference_node) -> String
273
+ def not_merged: (String reason) -> Hash[Symbol, untyped]
274
+ end
275
+
276
+ # Builds markdown output from merge operations
277
+ class OutputBuilder
278
+ @parts: Array[String]
279
+ @preserve_formatting: bool
280
+
281
+ def initialize: (?preserve_formatting: bool) -> void
282
+ def add_node_source: (untyped node, FileAnalysisBase analysis) -> void
283
+ def add_link_definition: (LinkDefinitionNode node) -> void
284
+ def add_gap_line: (?count: Integer) -> void
285
+ def add_raw: (String text) -> void
286
+ def to_s: () -> String
287
+ def empty?: () -> bool
288
+ def clear: () -> void
289
+
290
+ private
291
+
292
+ def extract_source: (untyped node, FileAnalysisBase analysis) -> String?
293
+ def extract_parser_node_source: (untyped node, FileAnalysisBase analysis) -> String?
294
+ end
295
+
296
+ # Formats link reference definitions for output
297
+ module LinkDefinitionFormatter
298
+ def self.format: (LinkDefinitionNode node) -> String
299
+ def self.format_all: (Array[LinkDefinitionNode] nodes, ?separator: String) -> String
300
+ end
301
+
302
+ # Base class for smart Markdown file merging
303
+ class SmartMergerBase
304
+ attr_reader template_analysis: FileAnalysisBase
305
+ attr_reader dest_analysis: FileAnalysisBase
306
+ attr_reader aligner: FileAligner
307
+ attr_reader resolver: ConflictResolver
308
+ attr_reader code_block_merger: CodeBlockMerger?
309
+
310
+ def initialize: (
311
+ String template_content,
312
+ String dest_content,
313
+ ?signature_generator: (^(untyped) -> (Array[untyped] | untyped | nil))?,
314
+ ?preference: Symbol,
315
+ ?add_template_only_nodes: bool,
316
+ ?inner_merge_code_blocks: (bool | CodeBlockMerger),
317
+ ?freeze_token: String,
318
+ ?match_refiner: (^(Array[untyped], Array[untyped], Hash[Symbol, untyped]) -> Array[MatchResult])?,
319
+ **untyped parser_options
320
+ ) -> void
321
+
322
+ # Abstract methods - subclasses must implement
323
+ def create_file_analysis: (String content, **untyped options) -> FileAnalysisBase
324
+ def node_to_source: (untyped node, FileAnalysisBase analysis) -> String
325
+
326
+ def template_parse_error_class: () -> Class
327
+ def destination_parse_error_class: () -> Class
328
+
329
+ def merge: () -> String
330
+ def merge_result: () -> MergeResult
331
+
332
+ private
333
+
334
+ def build_result_content: (Array[Hash[Symbol, untyped]] alignment) -> String
335
+ def process_alignment_entry: (Hash[Symbol, untyped] entry) -> String?
336
+ def handle_match: (Hash[Symbol, untyped] entry) -> String?
337
+ def handle_template_only: (Hash[Symbol, untyped] entry) -> String?
338
+ def handle_dest_only: (Hash[Symbol, untyped] entry) -> String?
339
+ end
340
+ end
341
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,365 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: markdown-merge
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Peter H. Boling
8
+ bindir: exe
9
+ cert_chain:
10
+ - |
11
+ -----BEGIN CERTIFICATE-----
12
+ MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
13
+ ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
14
+ A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
15
+ DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
16
+ LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
17
+ uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
18
+ LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
19
+ mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
20
+ coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
21
+ FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
22
+ yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
23
+ to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
24
+ qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
25
+ fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
26
+ HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
27
+ A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
28
+ ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
29
+ wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
30
+ L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
31
+ GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
32
+ kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
33
+ QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
34
+ 0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
35
+ DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
36
+ L9nRqA==
37
+ -----END CERTIFICATE-----
38
+ date: 1980-01-02 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: ast-merge
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '4.0'
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 4.0.2
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '4.0'
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 4.0.2
60
+ - !ruby/object:Gem::Dependency
61
+ name: tree_haver
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '5.0'
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 5.0.2
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '5.0'
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 5.0.2
80
+ - !ruby/object:Gem::Dependency
81
+ name: parslet
82
+ requirement: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: '2.0'
87
+ type: :runtime
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '2.0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: version_gem
96
+ requirement: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '1.1'
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 1.1.9
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.1'
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: 1.1.9
114
+ - !ruby/object:Gem::Dependency
115
+ name: kettle-dev
116
+ requirement: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '1.1'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '1.1'
128
+ - !ruby/object:Gem::Dependency
129
+ name: bundler-audit
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: 0.9.2
135
+ type: :development
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: 0.9.2
142
+ - !ruby/object:Gem::Dependency
143
+ name: rake
144
+ requirement: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: '13.0'
149
+ type: :development
150
+ prerelease: false
151
+ version_requirements: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: '13.0'
156
+ - !ruby/object:Gem::Dependency
157
+ name: require_bench
158
+ requirement: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - "~>"
161
+ - !ruby/object:Gem::Version
162
+ version: '1.0'
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: 1.0.4
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '1.0'
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: 1.0.4
176
+ - !ruby/object:Gem::Dependency
177
+ name: appraisal2
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: '3.0'
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: '3.0'
190
+ - !ruby/object:Gem::Dependency
191
+ name: kettle-test
192
+ requirement: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - "~>"
195
+ - !ruby/object:Gem::Version
196
+ version: '1.0'
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: 1.0.6
200
+ type: :development
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - "~>"
205
+ - !ruby/object:Gem::Version
206
+ version: '1.0'
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: 1.0.6
210
+ - !ruby/object:Gem::Dependency
211
+ name: ruby-progressbar
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - "~>"
215
+ - !ruby/object:Gem::Version
216
+ version: '1.13'
217
+ type: :development
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - "~>"
222
+ - !ruby/object:Gem::Version
223
+ version: '1.13'
224
+ - !ruby/object:Gem::Dependency
225
+ name: stone_checksums
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - "~>"
229
+ - !ruby/object:Gem::Version
230
+ version: '1.0'
231
+ - - ">="
232
+ - !ruby/object:Gem::Version
233
+ version: 1.0.2
234
+ type: :development
235
+ prerelease: false
236
+ version_requirements: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - "~>"
239
+ - !ruby/object:Gem::Version
240
+ version: '1.0'
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: 1.0.2
244
+ - !ruby/object:Gem::Dependency
245
+ name: gitmoji-regex
246
+ requirement: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: '1.0'
251
+ - - ">="
252
+ - !ruby/object:Gem::Version
253
+ version: 1.0.3
254
+ type: :development
255
+ prerelease: false
256
+ version_requirements: !ruby/object:Gem::Requirement
257
+ requirements:
258
+ - - "~>"
259
+ - !ruby/object:Gem::Version
260
+ version: '1.0'
261
+ - - ">="
262
+ - !ruby/object:Gem::Version
263
+ version: 1.0.3
264
+ description: "☯️ Ast::Merge-based structure for merging Markdown files with tools
265
+ like markly-merge and commonmarker-merge"
266
+ email:
267
+ - floss@galtzo.com
268
+ executables: []
269
+ extensions: []
270
+ extra_rdoc_files:
271
+ - CHANGELOG.md
272
+ - CITATION.cff
273
+ - CODE_OF_CONDUCT.md
274
+ - CONTRIBUTING.md
275
+ - FUNDING.md
276
+ - LICENSE.txt
277
+ - README.md
278
+ - REEK
279
+ - RUBOCOP.md
280
+ - SECURITY.md
281
+ files:
282
+ - CHANGELOG.md
283
+ - CITATION.cff
284
+ - CODE_OF_CONDUCT.md
285
+ - CONTRIBUTING.md
286
+ - FUNDING.md
287
+ - LICENSE.txt
288
+ - README.md
289
+ - REEK
290
+ - RUBOCOP.md
291
+ - SECURITY.md
292
+ - lib/markdown-merge.rb
293
+ - lib/markdown/merge.rb
294
+ - lib/markdown/merge/cleanse.rb
295
+ - lib/markdown/merge/cleanse/block_spacing.rb
296
+ - lib/markdown/merge/cleanse/code_fence_spacing.rb
297
+ - lib/markdown/merge/cleanse/condensed_link_refs.rb
298
+ - lib/markdown/merge/code_block_merger.rb
299
+ - lib/markdown/merge/conflict_resolver.rb
300
+ - lib/markdown/merge/debug_logger.rb
301
+ - lib/markdown/merge/document_problems.rb
302
+ - lib/markdown/merge/file_aligner.rb
303
+ - lib/markdown/merge/file_analysis.rb
304
+ - lib/markdown/merge/file_analysis_base.rb
305
+ - lib/markdown/merge/freeze_node.rb
306
+ - lib/markdown/merge/gap_line_node.rb
307
+ - lib/markdown/merge/link_definition_formatter.rb
308
+ - lib/markdown/merge/link_definition_node.rb
309
+ - lib/markdown/merge/link_parser.rb
310
+ - lib/markdown/merge/link_reference_rehydrator.rb
311
+ - lib/markdown/merge/markdown_structure.rb
312
+ - lib/markdown/merge/merge_result.rb
313
+ - lib/markdown/merge/node_type_normalizer.rb
314
+ - lib/markdown/merge/output_builder.rb
315
+ - lib/markdown/merge/partial_template_merger.rb
316
+ - lib/markdown/merge/smart_merger.rb
317
+ - lib/markdown/merge/smart_merger_base.rb
318
+ - lib/markdown/merge/table_match_algorithm.rb
319
+ - lib/markdown/merge/table_match_refiner.rb
320
+ - lib/markdown/merge/version.rb
321
+ - lib/markdown/merge/whitespace_normalizer.rb
322
+ - sig/markdown/merge.rbs
323
+ homepage: https://github.com/kettle-rb/markdown-merge
324
+ licenses:
325
+ - MIT
326
+ metadata:
327
+ homepage_uri: https://markdown-merge.galtzo.com/
328
+ source_code_uri: https://github.com/kettle-rb/markdown-merge/tree/v1.0.0
329
+ changelog_uri: https://github.com/kettle-rb/markdown-merge/blob/v1.0.0/CHANGELOG.md
330
+ bug_tracker_uri: https://github.com/kettle-rb/markdown-merge/issues
331
+ documentation_uri: https://www.rubydoc.info/gems/markdown-merge/1.0.0
332
+ funding_uri: https://github.com/sponsors/pboling
333
+ wiki_uri: https://github.com/kettle-rb/markdown-merge/wiki
334
+ news_uri: https://www.railsbling.com/tags/markdown-merge
335
+ discord_uri: https://discord.gg/3qme4XHNKN
336
+ rubygems_mfa_required: 'true'
337
+ rdoc_options:
338
+ - "--title"
339
+ - markdown-merge - ☯️ Ast::Merge-based structure for building Markdown merging tools
340
+ like markly-merge and commonmarker-merge
341
+ - "--main"
342
+ - README.md
343
+ - "--exclude"
344
+ - "^sig/"
345
+ - "--line-numbers"
346
+ - "--inline-source"
347
+ - "--quiet"
348
+ require_paths:
349
+ - lib
350
+ required_ruby_version: !ruby/object:Gem::Requirement
351
+ requirements:
352
+ - - ">="
353
+ - !ruby/object:Gem::Version
354
+ version: 3.2.0
355
+ required_rubygems_version: !ruby/object:Gem::Requirement
356
+ requirements:
357
+ - - ">="
358
+ - !ruby/object:Gem::Version
359
+ version: '0'
360
+ requirements: []
361
+ rubygems_version: 4.0.4
362
+ specification_version: 4
363
+ summary: "☯️ Ast::Merge-based structure for building Markdown merging tools like markly-merge
364
+ and commonmarker-merge"
365
+ test_files: []
metadata.gz.sig ADDED
Binary file