kdl 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []