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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'uri'
2
4
 
3
5
  module KDL
@@ -39,7 +41,7 @@ module KDL
39
41
  end
40
42
 
41
43
  def next_token
42
- buffer = ''
44
+ buffer = +''
43
45
  context = nil
44
46
  expansion_type = nil
45
47
  loop do
@@ -49,7 +51,7 @@ module KDL
49
51
  case c
50
52
  when '{'
51
53
  context = :expansion
52
- buffer = ''
54
+ buffer = +''
53
55
  n = @string[@index + 1]
54
56
  expansion_type = case n
55
57
  when '+' then ReservedExpansion
@@ -64,7 +66,7 @@ module KDL
64
66
  @index += (expansion_type == StringExpansion ? 1 : 2)
65
67
  when nil then return nil
66
68
  else
67
- buffer = c
69
+ buffer = +c
68
70
  @index += 1
69
71
  context = :literal
70
72
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module Types
3
5
  class UUID < Value::Custom
data/lib/kdl/types.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module Types
3
5
  MAPPING = {}
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module V1
3
5
  class Document < ::KDL::Document
data/lib/kdl/v1/node.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module V1
3
5
  class Node < ::KDL::Node
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module V1
3
5
  module StringDumper
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module V1
3
5
  class Tokenizer < KDL::Tokenizer
@@ -17,14 +19,14 @@ module KDL
17
19
  case c
18
20
  when '"'
19
21
  self.context = :string
20
- @buffer = ''
22
+ @buffer = +''
21
23
  traverse(1)
22
24
  when 'r'
23
25
  if @str[@index + 1] == '"'
24
26
  self.context = :rawstring
25
27
  traverse(2)
26
28
  @rawstring_hashes = 0
27
- @buffer = ''
29
+ @buffer = +''
28
30
  next
29
31
  elsif @str[@index + 1] == '#'
30
32
  i = @index + 1
@@ -36,12 +38,12 @@ module KDL
36
38
  if @str[i] == '"'
37
39
  self.context = :rawstring
38
40
  @index = i + 1
39
- @buffer = ''
41
+ @buffer = +''
40
42
  next
41
43
  end
42
44
  end
43
45
  self.context = :ident
44
- @buffer = c
46
+ @buffer = +c
45
47
  traverse(1)
46
48
  when '-'
47
49
  n = self[@index + 1]
@@ -58,16 +60,16 @@ module KDL
58
60
  self.context = :ident
59
61
  traverse(1)
60
62
  end
61
- @buffer = c
63
+ @buffer = +c
62
64
  when /[0-9+]/
63
65
  n = self[@index + 1]
64
66
  if c == '0' && n =~ /[box]/
65
67
  traverse(2)
66
- @buffer = ''
68
+ @buffer = +''
67
69
  self.context = integer_context(n)
68
70
  else
69
71
  self.context = :decimal
70
- @buffer = c
72
+ @buffer = +c
71
73
  traverse(1)
72
74
  end
73
75
  when '\\'
@@ -76,16 +78,16 @@ module KDL
76
78
  if la[0] == :NEWLINE || la[0] == :EOF || (la[0] == :WS && (lan = t.next_token[0]) == :NEWLINE || lan == :EOF)
77
79
  traverse_to(t.index)
78
80
  @buffer = "#{c}#{la[1].value}"
79
- @buffer += "\n" if lan == :NEWLINE
81
+ @buffer << "\n" if lan == :NEWLINE
80
82
  self.context = :whitespace
81
83
  else
82
84
  raise_error "Unexpected '\\' (#{la[0]})"
83
85
  end
84
86
  when *SYMBOLS.keys
85
- return token(SYMBOLS[c], c).tap { traverse(1) }
87
+ return token(SYMBOLS[c], -c).tap { traverse(1) }
86
88
  when *NEWLINES, "\r"
87
89
  nl = expect_newline
88
- return token(:NEWLINE, nl).tap do
90
+ return token(:NEWLINE, -nl).tap do
89
91
  traverse(nl.length)
90
92
  end
91
93
  when "/"
@@ -100,12 +102,12 @@ module KDL
100
102
  return token(:SLASHDASH, '/-').tap { traverse(2) }
101
103
  else
102
104
  self.context = :ident
103
- @buffer = c
105
+ @buffer = +c
104
106
  traverse(1)
105
107
  end
106
108
  when *WHITESPACE
107
109
  self.context = :whitespace
108
- @buffer = c
110
+ @buffer = +c
109
111
  traverse(1)
110
112
  when nil
111
113
  return [false, token(:EOF, :EOF)[1]] if @done
@@ -114,14 +116,14 @@ module KDL
114
116
  return token(:EOF, :EOF)
115
117
  when INITIAL_IDENTIFIER_CHARS
116
118
  self.context = :ident
117
- @buffer = c
119
+ @buffer = +c
118
120
  traverse(1)
119
121
  when '('
120
122
  @type_context = true
121
- return token(:LPAREN, c).tap { traverse(1) }
123
+ return token(:LPAREN, -c).tap { traverse(1) }
122
124
  when ')'
123
125
  @type_context = false
124
- return token(:RPAREN, c).tap { traverse(1) }
126
+ return token(:RPAREN, -c).tap { traverse(1) }
125
127
  else
126
128
  raise_error "Unexpected character #{c.inspect}"
127
129
  end
@@ -129,13 +131,13 @@ module KDL
129
131
  case c
130
132
  when IDENTIFIER_CHARS
131
133
  traverse(1)
132
- @buffer += c
134
+ @buffer << c
133
135
  else
134
136
  case @buffer
135
137
  when 'true' then return token(:TRUE, true)
136
138
  when 'false' then return token(:FALSE, false)
137
139
  when 'null' then return token(:NULL, nil)
138
- else return token(:IDENT, @buffer)
140
+ else return token(:IDENT, -@buffer)
139
141
  end
140
142
  end
141
143
  when :string
@@ -149,16 +151,16 @@ module KDL
149
151
  end
150
152
  traverse(i)
151
153
  else
152
- @buffer += c
153
- @buffer += c2
154
+ @buffer << c
155
+ @buffer << c2
154
156
  traverse(2)
155
157
  end
156
158
  when '"'
157
- return token(:STRING, unescape(@buffer)).tap { traverse(1) }
159
+ return token(:STRING, -unescape(@buffer)).tap { traverse(1) }
158
160
  when nil
159
161
  raise_error "Unterminated string literal"
160
162
  else
161
- @buffer += c
163
+ @buffer << c
162
164
  traverse(1)
163
165
  end
164
166
  when :rawstring
@@ -168,17 +170,17 @@ module KDL
168
170
  h = 0
169
171
  h += 1 while self[@index + 1 + h] == '#' && h < @rawstring_hashes
170
172
  if h == @rawstring_hashes
171
- return token(:RAWSTRING, @buffer).tap { traverse(1 + h) }
173
+ return token(:RAWSTRING, -@buffer).tap { traverse(1 + h) }
172
174
  end
173
175
  end
174
176
 
175
- @buffer += c
177
+ @buffer << c
176
178
  traverse(1)
177
179
  when :decimal
178
180
  case c
179
181
  when /[0-9.\-+_eE]/
180
182
  traverse(1)
181
- @buffer += c
183
+ @buffer << c
182
184
  else
183
185
  return parse_decimal(@buffer)
184
186
  end
@@ -186,7 +188,7 @@ module KDL
186
188
  case c
187
189
  when /[0-9a-fA-F_]/
188
190
  traverse(1)
189
- @buffer += c
191
+ @buffer << c
190
192
  else
191
193
  return parse_hexadecimal(@buffer)
192
194
  end
@@ -194,7 +196,7 @@ module KDL
194
196
  case c
195
197
  when /[0-7_]/
196
198
  traverse(1)
197
- @buffer += c
199
+ @buffer << c
198
200
  else
199
201
  return parse_octal(@buffer)
200
202
  end
@@ -202,7 +204,7 @@ module KDL
202
204
  case c
203
205
  when /[01_]/
204
206
  traverse(1)
205
- @buffer += c
207
+ @buffer << c
206
208
  else
207
209
  return parse_binary(@buffer)
208
210
  end
@@ -234,7 +236,7 @@ module KDL
234
236
  when :whitespace
235
237
  if WHITESPACE.include?(c)
236
238
  traverse(1)
237
- @buffer += c
239
+ @buffer << c
238
240
  elsif c == "/" && self[@index + 1] == '*'
239
241
  self.context = :multi_line_comment
240
242
  @comment_nesting = 1
@@ -244,13 +246,13 @@ module KDL
244
246
  la = t.next_token
245
247
  if la[0] == :NEWLINE || la[0] == :EOF || (la[0] == :WS && (lan = t.next_token[0]) == :NEWLINE || lan == :EOF)
246
248
  traverse_to(t.index)
247
- @buffer += "#{c}#{la[1].value}"
248
- @buffer += "\n" if lan == :NEWLINE
249
+ @buffer << "#{c}#{la[1].value}"
250
+ @buffer << "\n" if lan == :NEWLINE
249
251
  else
250
252
  raise_error "Unexpected '\\' (#{la[0]})"
251
253
  end
252
254
  else
253
- return token(:WS, @buffer)
255
+ return token(:WS, -@buffer)
254
256
  end
255
257
  else
256
258
  # :nocov:
data/lib/kdl/v1/value.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  module V1
3
5
  class Value < ::KDL::Value
data/lib/kdl/v1.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "kdl/v1/tokenizer"
2
4
  require "kdl/v1/document"
3
5
  require "kdl/v1/value"
data/lib/kdl/value.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
4
  class Value
3
5
  attr_reader :value, :format, :type
@@ -84,9 +86,10 @@ module KDL
84
86
  return super.upcase unless value.is_a?(BigDecimal)
85
87
 
86
88
  sign, digits, _, exponent = value.split
87
- s = sign.negative? ? '-' : ''
88
- s += "#{digits[0]}.#{digits[1..-1]}"
89
- s += "E#{exponent.negative? ? '' : '+'}#{exponent - 1}"
89
+ s = +''
90
+ s << '-' if sign.negative?
91
+ s << "#{digits[0]}.#{digits[1..-1]}"
92
+ s << "E#{exponent.negative? ? '' : '+'}#{exponent - 1}"
90
93
  s
91
94
  end
92
95
 
data/lib/kdl/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module KDL
2
- VERSION = "2.0.0"
4
+ VERSION = "2.0.1"
3
5
  end
data/lib/kdl.rb CHANGED
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "kdl/version"
4
+ require "kdl/error"
2
5
  require "kdl/tokenizer"
3
6
  require "kdl/document"
4
7
  require "kdl/value"
@@ -26,8 +29,10 @@ module KDL
26
29
  Parser.new(output_module: output_module(output_version || 2), **options).parse(input)
27
30
  when 1
28
31
  V1::Parser.new.parse(input, output_module: output_module(output_version || 1), **options)
29
- else
32
+ when nil
30
33
  auto_parse(input, output_version:, **options)
34
+ else
35
+ raise UnsupportedVersionError.new("Unsupported version '#{version}'", version)
31
36
  end
32
37
  end
33
38
 
@@ -37,7 +42,9 @@ module KDL
37
42
 
38
43
  def self.auto_parse(input, output_version: default_output_version, **options)
39
44
  parse(input, version: 2, output_version: output_version || 2, **options)
40
- rescue => e
45
+ rescue VersionMismatchError => e
46
+ parse(input, version: e.version, output_version: output_version || e.version, **options)
47
+ rescue Tokenizer::Error, Racc::ParseError => e
41
48
  parse(input, version: 1, output_version: output_version || 1, **options) rescue raise e
42
49
  end
43
50
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kdl
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danielle Smith
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-12-24 00:00:00.000000000 Z
10
+ date: 2025-01-15 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: racc
@@ -89,6 +88,7 @@ files:
89
88
  - kdl.gemspec
90
89
  - lib/kdl.rb
91
90
  - lib/kdl/document.rb
91
+ - lib/kdl/error.rb
92
92
  - lib/kdl/kdl.tab.rb
93
93
  - lib/kdl/kdl.yy
94
94
  - lib/kdl/node.rb
@@ -134,7 +134,6 @@ metadata:
134
134
  homepage_uri: https://kdl.dev
135
135
  source_code_uri: https://github.com/danini-the-panini/kdl-rb
136
136
  changelog_uri: https://github.com/danini-the-panini/kdl-rb/releases
137
- post_install_message:
138
137
  rdoc_options: []
139
138
  require_paths:
140
139
  - lib
@@ -149,8 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
148
  - !ruby/object:Gem::Version
150
149
  version: '0'
151
150
  requirements: []
152
- rubygems_version: 3.5.22
153
- signing_key:
151
+ rubygems_version: 3.6.2
154
152
  specification_version: 4
155
153
  summary: KDL Document Language
156
154
  test_files: []