kdl 2.0.0 → 2.0.1

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +2 -1
  3. data/README.md +17 -1
  4. data/lib/kdl/document.rb +2 -0
  5. data/lib/kdl/error.rb +24 -0
  6. data/lib/kdl/kdl.tab.rb +128 -129
  7. data/lib/kdl/kdl.yy +7 -7
  8. data/lib/kdl/node.rb +7 -5
  9. data/lib/kdl/parser_common.rb +3 -1
  10. data/lib/kdl/string_dumper.rb +2 -0
  11. data/lib/kdl/tokenizer.rb +79 -65
  12. data/lib/kdl/types/base64.rb +2 -0
  13. data/lib/kdl/types/country/iso3166_countries.rb +2 -0
  14. data/lib/kdl/types/country/iso3166_subdivisions.rb +2 -0
  15. data/lib/kdl/types/country.rb +2 -0
  16. data/lib/kdl/types/currency/iso4217_currencies.rb +2 -0
  17. data/lib/kdl/types/currency.rb +2 -0
  18. data/lib/kdl/types/date_time.rb +2 -0
  19. data/lib/kdl/types/decimal.rb +2 -0
  20. data/lib/kdl/types/duration/iso8601_parser.rb +2 -0
  21. data/lib/kdl/types/duration.rb +2 -0
  22. data/lib/kdl/types/email/parser.rb +9 -7
  23. data/lib/kdl/types/email.rb +2 -0
  24. data/lib/kdl/types/hostname/validator.rb +2 -0
  25. data/lib/kdl/types/hostname.rb +2 -0
  26. data/lib/kdl/types/ip.rb +2 -0
  27. data/lib/kdl/types/irl/parser.rb +9 -7
  28. data/lib/kdl/types/irl.rb +2 -0
  29. data/lib/kdl/types/regex.rb +2 -0
  30. data/lib/kdl/types/url.rb +2 -0
  31. data/lib/kdl/types/url_template.rb +5 -3
  32. data/lib/kdl/types/uuid.rb +2 -0
  33. data/lib/kdl/types.rb +2 -0
  34. data/lib/kdl/v1/document.rb +2 -0
  35. data/lib/kdl/v1/node.rb +2 -0
  36. data/lib/kdl/v1/string_dumper.rb +2 -0
  37. data/lib/kdl/v1/tokenizer.rb +33 -31
  38. data/lib/kdl/v1/value.rb +2 -0
  39. data/lib/kdl/v1.rb +2 -0
  40. data/lib/kdl/value.rb +6 -3
  41. data/lib/kdl/version.rb +3 -1
  42. data/lib/kdl.rb +9 -2
  43. metadata +4 -6
data/lib/kdl/tokenizer.rb CHANGED
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bigdecimal'
2
4
 
3
5
  module KDL
4
6
  class Tokenizer
5
- class Error < StandardError
7
+ class Error < ::KDL::Error
6
8
  def initialize(message, line, column)
7
9
  super("#{message} (#{line}:#{column})")
8
10
  end
@@ -40,16 +42,16 @@ module KDL
40
42
  '=' => :EQUALS
41
43
  }
42
44
 
43
- WHITESPACE = ["\u0009", "\u000B", "\u0020", "\u00A0",
44
- "\u1680", "\u2000", "\u2001", "\u2002",
45
- "\u2003", "\u2004", "\u2005", "\u2006",
46
- "\u2007", "\u2008", "\u2009", "\u200A",
47
- "\u202F", "\u205F", "\u3000" ]
45
+ WHITESPACE = ["\u0009", "\u0020", "\u00A0", "\u1680",
46
+ "\u2000", "\u2001", "\u2002", "\u2003",
47
+ "\u2004", "\u2005", "\u2006", "\u2007",
48
+ "\u2008", "\u2009", "\u200A", "\u202F",
49
+ "\u205F", "\u3000"]
48
50
  WS = "[#{Regexp.escape(WHITESPACE.join)}]"
49
51
  WS_STAR = /\A#{WS}*\z/
50
52
  WS_PLUS = /\A#{WS}+\z/
51
53
 
52
- NEWLINES = ["\u000A", "\u0085", "\u000C", "\u2028", "\u2029"]
54
+ NEWLINES = ["\u000A", "\u0085", "\u000B", "\u000C", "\u2028", "\u2029"]
53
55
  NEWLINES_PATTERN = Regexp.new("(#{NEWLINES.map{Regexp.escape(_1)}.join('|')}|\r\n?)", Regexp::MULTILINE)
54
56
 
55
57
  OTHER_NON_IDENTIFIER_CHARS = ("\x0".."\x20").to_a - WHITESPACE
@@ -68,13 +70,15 @@ module KDL
68
70
  "\uFEFF"
69
71
  ]
70
72
 
73
+ VERSION_PATTERN = /\A\/-[#{WHITESPACE.join}]*kdl-version[#{WHITESPACE.join}]+(\d+)[#{WHITESPACE.join}]*[#{NEWLINES.join}]/
74
+
71
75
  def initialize(str, start = 0)
72
76
  @str = debom(str)
73
77
  @context = nil
74
78
  @rawstring_hashes = nil
75
79
  @start = start
76
80
  @index = start
77
- @buffer = ""
81
+ @buffer = +""
78
82
  @done = false
79
83
  @previous_context = nil
80
84
  @line = 1
@@ -84,7 +88,7 @@ module KDL
84
88
  end
85
89
 
86
90
  def version_directive
87
- if m = @str.match(/\A\/-[#{WHITESPACE.join}]*kdl-version[#{WHITESPACE.join}]+(\d+)\s*[#{NEWLINES.join}]/)
91
+ if m = @str.match(VERSION_PATTERN)
88
92
  m[1].to_i
89
93
  end
90
94
  end
@@ -121,11 +125,11 @@ module KDL
121
125
  if self[@index + 1] == '"' && self[@index + 2] == '"'
122
126
  nl = expect_newline(@index + 3)
123
127
  self.context = :multiline_string
124
- @buffer = ''
128
+ @buffer = +''
125
129
  traverse(3 + nl.length)
126
130
  else
127
131
  self.context = :string
128
- @buffer = ''
132
+ @buffer = +''
129
133
  traverse(1)
130
134
  end
131
135
  when '#'
@@ -134,14 +138,14 @@ module KDL
134
138
  nl = expect_newline(@index + 4)
135
139
  self.context = :multiline_rawstring
136
140
  @rawstring_hashes = 1
137
- @buffer = ''
141
+ @buffer = +''
138
142
  traverse(4 + nl.length)
139
143
  next
140
144
  else
141
145
  self.context = :rawstring
142
146
  traverse(2)
143
147
  @rawstring_hashes = 1
144
- @buffer = ''
148
+ @buffer = +''
145
149
  next
146
150
  end
147
151
  elsif self[@index + 1] == '#'
@@ -156,18 +160,18 @@ module KDL
156
160
  nl = expect_newline(i + 3)
157
161
  self.context = :multiline_rawstring
158
162
  traverse(@rawstring_hashes + 3 + nl.length)
159
- @buffer = ''
163
+ @buffer = +''
160
164
  next
161
165
  else
162
166
  self.context = :rawstring
163
167
  traverse(@rawstring_hashes + 1)
164
- @buffer = ''
168
+ @buffer = +''
165
169
  next
166
170
  end
167
171
  end
168
172
  end
169
173
  self.context = :keyword
170
- @buffer = c
174
+ @buffer = +c
171
175
  traverse(1)
172
176
  when '-'
173
177
  n = self[@index + 1]
@@ -184,16 +188,16 @@ module KDL
184
188
  self.context = :ident
185
189
  traverse(1)
186
190
  end
187
- @buffer = c
191
+ @buffer = +c
188
192
  when /[0-9+]/
189
193
  n = self[@index + 1]
190
194
  if c == '0' && n =~ /[box]/
191
195
  traverse(2)
192
- @buffer = ''
196
+ @buffer = +''
193
197
  self.context = integer_context(n)
194
198
  else
195
199
  self.context = :decimal
196
- @buffer = c
200
+ @buffer = +c
197
201
  traverse(1)
198
202
  end
199
203
  when '\\'
@@ -202,20 +206,20 @@ module KDL
202
206
  if la[0] == :NEWLINE || la[0] == :EOF || (la[0] == :WS && (lan = t.next_token[0]) == :NEWLINE || lan == :EOF)
203
207
  traverse_to(t.index)
204
208
  @buffer = "#{c}#{la[1].value}"
205
- @buffer += "\n" if lan == :NEWLINE
209
+ @buffer << "\n" if lan == :NEWLINE
206
210
  self.context = :whitespace
207
211
  else
208
212
  raise_error "Unexpected '\\' (#{la[0]})"
209
213
  end
210
214
  when '='
211
215
  self.context = :equals
212
- @buffer = c
216
+ @buffer = +c
213
217
  traverse(1)
214
218
  when *SYMBOLS.keys
215
- return token(SYMBOLS[c], c).tap { traverse(1) }
219
+ return token(SYMBOLS[c], -c).tap { traverse(1) }
216
220
  when *NEWLINES, "\r"
217
221
  nl = expect_newline
218
- return token(:NEWLINE, nl).tap do
222
+ return token(:NEWLINE, -nl).tap do
219
223
  traverse(nl.length)
220
224
  end
221
225
  when "/"
@@ -230,12 +234,12 @@ module KDL
230
234
  return token(:SLASHDASH, '/-').tap { traverse(2) }
231
235
  else
232
236
  self.context = :ident
233
- @buffer = c
237
+ @buffer = +c
234
238
  traverse(1)
235
239
  end
236
240
  when *WHITESPACE
237
241
  self.context = :whitespace
238
- @buffer = c
242
+ @buffer = +c
239
243
  traverse(1)
240
244
  when nil
241
245
  return [false, token(:EOF, :EOF)[1]] if @done
@@ -244,14 +248,14 @@ module KDL
244
248
  return token(:EOF, :EOF)
245
249
  when INITIAL_IDENTIFIER_CHARS
246
250
  self.context = :ident
247
- @buffer = c
251
+ @buffer = +c
248
252
  traverse(1)
249
253
  when '('
250
254
  @type_context = true
251
- return token(:LPAREN, c).tap { traverse(1) }
255
+ return token(:LPAREN, -c).tap { traverse(1) }
252
256
  when ')'
253
257
  @type_context = false
254
- return token(:RPAREN, c).tap { traverse(1) }
258
+ return token(:RPAREN, -c).tap { traverse(1) }
255
259
  else
256
260
  raise_error "Unexpected character #{c.inspect}"
257
261
  end
@@ -259,7 +263,7 @@ module KDL
259
263
  case c
260
264
  when IDENTIFIER_CHARS
261
265
  traverse(1)
262
- @buffer += c
266
+ @buffer << c
263
267
  else
264
268
  case @buffer
265
269
  when 'true', 'false', 'null', 'inf', '-inf', 'nan'
@@ -267,14 +271,14 @@ module KDL
267
271
  when /\A\.\d/
268
272
  raise_error "Identifier cannot look like an illegal float"
269
273
  else
270
- return token(:IDENT, @buffer)
274
+ return token(:IDENT, -@buffer)
271
275
  end
272
276
  end
273
277
  when :keyword
274
278
  case c
275
279
  when /[a-z\-]/
276
280
  traverse(1)
277
- @buffer += c
281
+ @buffer << c
278
282
  else
279
283
  case @buffer
280
284
  when '#true' then return token(:TRUE, true)
@@ -289,13 +293,13 @@ module KDL
289
293
  when :string
290
294
  case c
291
295
  when '\\'
292
- @buffer += c
296
+ @buffer << c
293
297
  c2 = self[@index + 1]
294
- @buffer += c2
298
+ @buffer << c2
295
299
  if c2.match?(NEWLINES_PATTERN)
296
300
  i = 2
297
301
  while self[@index + i]&.match?(NEWLINES_PATTERN)
298
- @buffer += self[@index + i]
302
+ @buffer << self[@index + i]
299
303
  i+=1
300
304
  end
301
305
  traverse(i)
@@ -303,31 +307,31 @@ module KDL
303
307
  traverse(2)
304
308
  end
305
309
  when '"'
306
- return token(:STRING, unescape(@buffer)).tap { traverse(1) }
310
+ return token(:STRING, -unescape(@buffer)).tap { traverse(1) }
307
311
  when *NEWLINES, "\r"
308
312
  raise_error "Unexpected NEWLINE in string literal"
309
313
  when nil
310
314
  raise_error "Unterminated string literal"
311
315
  else
312
- @buffer += c
316
+ @buffer << c
313
317
  traverse(1)
314
318
  end
315
319
  when :multiline_string
316
320
  case c
317
321
  when '\\'
318
- @buffer += c
319
- @buffer += self[@index + 1]
322
+ @buffer << c
323
+ @buffer << self[@index + 1]
320
324
  traverse(2)
321
325
  when '"'
322
326
  if self[@index + 1] == '"' && self[@index + 2] == '"'
323
- return token(:STRING, unescape_non_ws(dedent(unescape_ws(@buffer)))).tap { traverse(3) }
327
+ return token(:STRING, -unescape_non_ws(dedent(unescape_ws(@buffer)))).tap { traverse(3) }
324
328
  end
325
- @buffer += c
329
+ @buffer << c
326
330
  traverse(1)
327
331
  when nil
328
332
  raise_error "Unterminated multi-line string literal"
329
333
  else
330
- @buffer += c
334
+ @buffer << c
331
335
  traverse(1)
332
336
  end
333
337
  when :rawstring
@@ -338,13 +342,13 @@ module KDL
338
342
  h = 0
339
343
  h += 1 while self[@index + 1 + h] == '#' && h < @rawstring_hashes
340
344
  if h == @rawstring_hashes
341
- return token(:RAWSTRING, @buffer).tap { traverse(1 + h) }
345
+ return token(:RAWSTRING, -@buffer).tap { traverse(1 + h) }
342
346
  end
343
347
  when *NEWLINES, "\r"
344
348
  raise_error "Unexpected NEWLINE in rawstring literal"
345
349
  end
346
350
 
347
- @buffer += c
351
+ @buffer << c
348
352
  traverse(1)
349
353
  when :multiline_rawstring
350
354
  raise_error "Unterminated multi-line rawstring literal" if c.nil?
@@ -353,17 +357,17 @@ module KDL
353
357
  h = 1
354
358
  h += 1 while self[@index + 3 + h] == '#' && h < @rawstring_hashes
355
359
  if h == @rawstring_hashes
356
- return token(:RAWSTRING, dedent(@buffer)).tap { traverse(3 + h) }
360
+ return token(:RAWSTRING, -dedent(@buffer)).tap { traverse(3 + h) }
357
361
  end
358
362
  end
359
363
 
360
- @buffer += c
364
+ @buffer << c
361
365
  traverse(1)
362
366
  when :decimal
363
367
  case c
364
368
  when /[0-9.\-+_eE]/
365
369
  traverse(1)
366
- @buffer += c
370
+ @buffer << c
367
371
  else
368
372
  return parse_decimal(@buffer)
369
373
  end
@@ -371,7 +375,7 @@ module KDL
371
375
  case c
372
376
  when /[0-9a-fA-F_]/
373
377
  traverse(1)
374
- @buffer += c
378
+ @buffer << c
375
379
  else
376
380
  return parse_hexadecimal(@buffer)
377
381
  end
@@ -379,7 +383,7 @@ module KDL
379
383
  case c
380
384
  when /[0-7_]/
381
385
  traverse(1)
382
- @buffer += c
386
+ @buffer << c
383
387
  else
384
388
  return parse_octal(@buffer)
385
389
  end
@@ -387,7 +391,7 @@ module KDL
387
391
  case c
388
392
  when /[01_]/
389
393
  traverse(1)
390
- @buffer += c
394
+ @buffer << c
391
395
  else
392
396
  return parse_binary(@buffer)
393
397
  end
@@ -419,10 +423,10 @@ module KDL
419
423
  when :whitespace
420
424
  if WHITESPACE.include?(c)
421
425
  traverse(1)
422
- @buffer += c
426
+ @buffer << c
423
427
  elsif c == '='
424
428
  self.context = :equals
425
- @buffer += c
429
+ @buffer << c
426
430
  traverse(1)
427
431
  elsif c == "/" && self[@index + 1] == '*'
428
432
  self.context = :multi_line_comment
@@ -433,22 +437,22 @@ module KDL
433
437
  la = t.next_token
434
438
  if la[0] == :NEWLINE || la[0] == :EOF || (la[0] == :WS && (lan = t.next_token[0]) == :NEWLINE || lan == :EOF)
435
439
  traverse_to(t.index)
436
- @buffer += "#{c}#{la[1].value}"
437
- @buffer += "\n" if lan == :NEWLINE
440
+ @buffer << "#{c}#{la[1].value}"
441
+ @buffer << "\n" if lan == :NEWLINE
438
442
  else
439
443
  raise_error "Unexpected '\\' (#{la[0]})"
440
444
  end
441
445
  else
442
- return token(:WS, @buffer)
446
+ return token(:WS, -@buffer)
443
447
  end
444
448
  when :equals
445
449
  t = Tokenizer.new(@str, @index)
446
450
  la = t.next_token
447
451
  if la[0] == :WS
448
- @buffer += la[1].value
452
+ @buffer << la[1].value
449
453
  traverse_to(t.index)
450
454
  end
451
- return token(:EQUALS, @buffer)
455
+ return token(:EQUALS, -@buffer)
452
456
  else
453
457
  # :nocov:
454
458
  raise_error "Unknown context `#{@context}'"
@@ -482,8 +486,12 @@ module KDL
482
486
  traverse(i - @index)
483
487
  end
484
488
 
485
- def raise_error(message)
486
- raise Error.new(message, @line, @column)
489
+ def raise_error(error)
490
+ case error
491
+ when String then raise Error.new(error, @line, @column)
492
+ when Error then raise error
493
+ else raise Error.new(error.message, @line, @column)
494
+ end
487
495
  end
488
496
 
489
497
  def context=(val)
@@ -538,11 +546,11 @@ module KDL
538
546
  return parse_float(s) if s =~ /[.E]/i
539
547
 
540
548
  token(:INTEGER, Integer(munch_underscores(s), 10), format: '%d')
541
- rescue
549
+ rescue => e
542
550
  if s[0] =~ INITIAL_IDENTIFIER_CHARS && s[1..-1].each_char.all? { |c| c =~ IDENTIFIER_CHARS }
543
- token(:IDENT, s)
551
+ token(:IDENT, -s)
544
552
  else
545
- raise
553
+ raise_error(e)
546
554
  end
547
555
  end
548
556
 
@@ -564,14 +572,20 @@ module KDL
564
572
 
565
573
  def parse_hexadecimal(s)
566
574
  token(:INTEGER, Integer(munch_underscores(s), 16))
575
+ rescue ArgumentError => e
576
+ raise_error(e)
567
577
  end
568
578
 
569
579
  def parse_octal(s)
570
580
  token(:INTEGER, Integer(munch_underscores(s), 8))
581
+ rescue ArgumentError => e
582
+ raise_error(e)
571
583
  end
572
584
 
573
585
  def parse_binary(s)
574
586
  token(:INTEGER, Integer(munch_underscores(s), 2))
587
+ rescue ArgumentError => e
588
+ raise_error(e)
575
589
  end
576
590
 
577
591
  def munch_underscores(s)
@@ -599,8 +613,8 @@ module KDL
599
613
  .gsub(rgx) { |m| replace_esc(m) }
600
614
  .gsub(/\\u\{[0-9a-fA-F]{0,6}\}/) do |m|
601
615
  i = Integer(m[3..-2], 16)
602
- if i < 0 || i > 0x10FFFF
603
- raise_error "Invalid code point #{u}"
616
+ if i < 0 || i > 0x10FFFF || (0xD800..0xDFFF).include?(i)
617
+ raise_error "Invalid code point #{m}"
604
618
  end
605
619
  i.chr(Encoding::UTF_8)
606
620
  end
@@ -631,9 +645,9 @@ module KDL
631
645
  end
632
646
  return "" if lines.empty?
633
647
  raise_error "Invalid multiline string final line" unless indent.match?(WS_STAR)
634
- valid = /\A(?:#{Regexp.escape(indent)})(.*)/
648
+ valid = /\A#{Regexp.escape(indent)}(.*)/
635
649
 
636
- lines.map! do |line|
650
+ lines.map do |line|
637
651
  case line
638
652
  when WS_STAR then ""
639
653
  when valid then $1
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'base64'
2
4
 
3
5
  module KDL
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module Types
3
5
  class Country < Value::Custom
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module Types
3
5
  class CountrySubdivision < Value::Custom
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'kdl/types/country/iso3166_countries'
2
4
  require 'kdl/types/country/iso3166_subdivisions'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module Types
3
5
  class Currency < Value::Custom
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'kdl/types/currency/iso4217_currencies'
2
4
 
3
5
  module KDL
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'time'
2
4
 
3
5
  module KDL
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module Types
3
5
  class Decimal < Value::Custom
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Shamelessly borrowed from https://github.com/rails/rails/tree/main/activesupport
2
4
  #
3
5
  # Copyright (c) 2005-2021 David Heinemeier Hansson
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'kdl/types/duration/iso8601_parser'
2
4
 
3
5
  module KDL
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../hostname/validator'
2
4
 
3
5
  module KDL
@@ -11,7 +13,7 @@ module KDL
11
13
  end
12
14
 
13
15
  def parse
14
- local = ''
16
+ local = +''
15
17
  unicode_domain = nil
16
18
  domain = nil
17
19
  context = :start
@@ -23,7 +25,7 @@ module KDL
23
25
  when :part
24
26
  case context
25
27
  when :start, :after_dot
26
- local += value
28
+ local << value
27
29
  context = :after_part
28
30
  else
29
31
  raise ArgumentError, "invalid email #{@string} (unexpected part #{value} at #{context})"
@@ -31,7 +33,7 @@ module KDL
31
33
  when :dot
32
34
  case context
33
35
  when :after_part
34
- local += value
36
+ local << value
35
37
  context = :after_dot
36
38
  else
37
39
  raise ArgumentError, "invalid email #{@string} (unexpected dot at #{context})"
@@ -91,7 +93,7 @@ module KDL
91
93
  end
92
94
  end
93
95
  @context = nil
94
- @buffer = ''
96
+ @buffer = +''
95
97
  loop do
96
98
  c = @string[@index]
97
99
  return [:end, nil] if c.nil?
@@ -111,7 +113,7 @@ module KDL
111
113
  @index += 1
112
114
  when local_part_chars
113
115
  @context = :part
114
- @buffer += c
116
+ @buffer << c
115
117
  @index += 1
116
118
  else
117
119
  raise ArgumentError, "invalid email #{@string} (unexpected #{c})"
@@ -119,7 +121,7 @@ module KDL
119
121
  when :part
120
122
  case c
121
123
  when local_part_chars
122
- @buffer += c
124
+ @buffer << c
123
125
  @index += 1
124
126
  when '.', '@'
125
127
  return [:part, @buffer]
@@ -135,7 +137,7 @@ module KDL
135
137
  @index += 1
136
138
  return [:part, @buffer]
137
139
  else
138
- @buffer += c
140
+ @buffer << c
139
141
  @index += 1
140
142
  end
141
143
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative './email/parser'
2
4
 
3
5
  module KDL
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'simpleidn'
2
4
 
3
5
  module KDL
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative './hostname/validator'
2
4
 
3
5
  module KDL
data/lib/kdl/types/ip.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module Types
3
5
  class IP < Value::Custom
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module Types
3
5
  class IRLReference < Value::Custom
@@ -96,13 +98,13 @@ module KDL
96
98
  end
97
99
 
98
100
  def self.build_uri_string(scheme, auth, domain, path, search, hash)
99
- string = ''
100
- string += "#{scheme}://" if scheme
101
- string += auth if auth
102
- string += domain if domain
103
- string += path if path
104
- string += "?#{search}" if search
105
- string += "##{hash}" if hash
101
+ string = +''
102
+ string << "#{scheme}://" if scheme
103
+ string << auth if auth
104
+ string << domain if domain
105
+ string << path if path
106
+ string << "?#{search}" if search
107
+ string << "##{hash}" if hash
106
108
  string
107
109
  end
108
110
  end
data/lib/kdl/types/irl.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative './irl/parser'
2
4
 
3
5
  module KDL
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module Types
3
5
  class Regex < Value::Custom
data/lib/kdl/types/url.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module Types
3
5
  class URLReference < Value::Custom