tcepsni 0.3.1 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40d96c10a7e7729b0c37648bedd7b693dff04602d9bc3ef9794e695d48986864
4
- data.tar.gz: f6316e6ceba71e2a7cee7d99140357a08e52c598e31324016159d301ffb791e5
3
+ metadata.gz: 93737301f5ec57317f38a815c3f51d40c2227668290e3baa6b642ffd82fb2396
4
+ data.tar.gz: ede377edc499d3469a7fbf6d2c5bea2e2e88568821c71cd5c4de937d72b20d7d
5
5
  SHA512:
6
- metadata.gz: e3235426ddaeed30dd132dfc2f904259abe5da867aa4e17aa683d43d42112d8ded52575e4cb3e218c39fcc0f4f1a84175594279f5e07e221da08a5d03afe79f7
7
- data.tar.gz: 3e79b0c3e3f29d5044cdc7051e980db49d1a49fd54a7fa8299386056f38864887fe04238319177d5fa9f0bbe4bd07c773a9c4fe279b2875b80fdf7e9f5bcbac8
6
+ metadata.gz: f2b2779e7457a92b0678b695c17922e9e21960aa812d9ddf940697a80184541f318f457dae3a437be3bff93ead01cc95c08bd7e0cc3dd49fab8d954bdb518abd
7
+ data.tar.gz: 3ccb55ba0d3906d0722b0e39d7c69c5888749eb606cf671255aa7c7226dabddc8deaf6b09176fa6171d2e163da3574235b9d44f220bd9960a44b13890ec420cc
data/CHANGELOG.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.4.0 - 2024-08-04
6
+
7
+ ### Changed
8
+
9
+ * `parse_string` now parses leading double quote
10
+ * `parse_array` now parses leading bracket
11
+ * `parse_hash` now parses leading brace
12
+ * `parse_object` now consider vendors
13
+ * `parse_object`, `parse_integer`, `parse_expression`, and `parse_attributes` do not raise errors
14
+
15
+ ### Removed
16
+
17
+ * `Tcepsni::Class#encoding?`
18
+
19
+ ### Added
20
+
21
+ * Simple `Range` support and `parse_range`
22
+ * `parse_float`
23
+ * `parse_time`
24
+ * `parse_attribute`
25
+ * `parse_encoding`
26
+
5
27
  ## 0.3.1 - 2024-07-21
6
28
 
7
29
  Update gemspec fields etc.
@@ -3,6 +3,8 @@ require 'forwardable'
3
3
 
4
4
  module Tcepsni
5
5
  class Parser
6
+ FAIL = Data.define
7
+
6
8
  def initialize(source, vendors:)
7
9
  @scanner = ::StringScanner.new(source)
8
10
  @vendors = vendors.flat_map { |vendor| [*vendor.dependencies, vendor] }.uniq
@@ -10,156 +12,224 @@ module Tcepsni
10
12
 
11
13
  # If it returned nil when failed, it collides with normal nil value.
12
14
  def parse_expression
13
- if @scanner.skip(/nil\b/)
14
- nil
15
- elsif @scanner.skip(/true\b/)
16
- true
17
- elsif @scanner.skip(/false\b/)
18
- false
19
- elsif @scanner.skip(':')
20
- parse_identifier
21
- elsif @scanner.skip('"')
22
- parse_string
23
- elsif @scanner.skip('[')
24
- parse_array
25
- elsif @scanner.skip('{')
26
- parse_hash
27
- elsif @scanner.skip('#<')
28
- pos = @scanner.pos
29
- @vendors.select { |vendor| vendor.object? }.each do |vendor|
30
- @scanner.pos = pos
31
- return vendor.parse(self)
32
- rescue Error
33
- next
34
- end
35
- @scanner.pos = pos
36
- parse_object
37
- elsif (digits = @scanner.scan(/\d+/))
38
- int = Integer(digits)
39
- if @scanner.skip('.')
40
- int2 = parse_integer
41
- Float("#{int}.#{int2}")
42
- elsif digits.size == 4 && @scanner.skip(/-(?<month>[01]\d)-(?<day>\d\d) (?<hour>[012]\d):(?<minute>[0-5]\d):(?<second>[0-5]\d) (?<zone>[+-]\d\d\d\d)/)
43
- Time.new(Integer(int), @scanner[:month], @scanner[:day],
44
- @scanner[:hour], @scanner[:minute], @scanner[:second],
45
- @scanner[:zone])
46
- else
47
- int
48
- end
49
- else
50
- parse_class
51
- end
15
+ FAIL == (expr = parse_nil) or return expr
16
+ FAIL == (expr = parse_false) or return expr
17
+ (expr = (parse_true or
18
+ parse_symbol or
19
+ parse_string or
20
+ parse_array or
21
+ parse_hash or
22
+ parse_encoding or
23
+ parse_object or
24
+ parse_range or
25
+ parse_float or
26
+ parse_time or
27
+ parse_integer or
28
+ parse_class)) and return expr
29
+ FAIL
52
30
  end
53
31
 
54
32
  alias parse parse_expression
55
33
 
34
+ def parse_nil
35
+ @scanner.skip(/nil\b/) or return FAIL
36
+ nil
37
+ end
38
+
39
+ def parse_true
40
+ @scanner.skip(/true\b/) and true
41
+ end
42
+
43
+ def parse_false
44
+ @scanner.skip(/false\b/) or return FAIL
45
+ false
46
+ end
47
+
56
48
  def parse_integer
57
- int = @scanner.scan(/\d+/) or raise Error, 'no digits'
58
- Integer(int)
49
+ @scanner.scan(/\d+/)&.to_i
59
50
  end
60
51
 
61
52
  def parse_identifier
62
- id = @scanner.scan(/[A-Za-z_][A-Za-z0-9_]*/) or raise Error, 'no identifier'
63
- id.intern
53
+ @scanner.scan(/[A-Za-z_][A-Za-z0-9_]*/)&.intern
64
54
  end
65
55
 
66
- def parse_string
67
- result = ''
68
- until @scanner.eos?
69
- if @scanner.skip('"')
70
- return result
71
- elsif @scanner.skip('\\"')
72
- result << '"'
73
- else
74
- result << @scanner.getch
56
+ def parse_symbol
57
+ pos = @scanner.pos
58
+ @scanner.skip(':') and
59
+ begin
60
+ (id = parse_identifier) and return id
61
+ @scanner.skip('[]') and return :[]
62
+ @scanner.pos = pos
63
+ return
75
64
  end
76
- end
77
- result
65
+ end
66
+
67
+ def parse_string
68
+ pos = @scanner.pos
69
+ @scanner.skip('"') or return
70
+ result = +''
71
+ result <<
72
+ if @scanner.skip('"') then return result
73
+ elsif @scanner.skip('\\"') then '"'
74
+ else @scanner.getch
75
+ end until @scanner.eos?
76
+ @scanner.pos = pos
77
+ nil
78
78
  end
79
79
 
80
80
  def parse_array
81
+ pos = @scanner.pos
82
+ @scanner.skip('[') or return
81
83
  result = []
82
84
  until @scanner.eos?
83
- begin
84
- result << parse_expression
85
- rescue StandardError
86
- break
87
- end
85
+ FAIL == (expr = parse_expression) and break
86
+ result << expr
88
87
  @scanner.skip(', ') or break
89
88
  end
90
- @scanner.skip(']') or raise Error, "no array closer: #{@scanner.inspect}"
91
- result
89
+ if @scanner.skip(']')
90
+ result
91
+ else
92
+ @scanner.pos = pos
93
+ nil
94
+ end
92
95
  end
93
96
 
94
97
  def parse_hash
98
+ pos = @scanner.pos
99
+ @scanner.skip('{') or return
95
100
  result = {}
96
101
  until @scanner.eos?
97
- key = begin
98
- parse_expression
99
- rescue StandardError
100
- break
101
- end
102
- @scanner.skip('=>') or raise Error, 'no hash arrow'
103
- value = parse_expression
102
+ FAIL == (key = parse_expression) and break
103
+ @scanner.skip('=>') and
104
+ FAIL != (value = parse_expression) or
105
+ begin
106
+ @scanner.pos = pos
107
+ return
108
+ end
104
109
  result[key] = value
105
110
  @scanner.skip(', ') or break
106
111
  end
107
- @scanner.skip('}') or raise Error, 'no hash closer'
108
- result
112
+ if @scanner.skip('}')
113
+ result
114
+ else
115
+ @scanner.pos = pos
116
+ return
117
+ end
109
118
  end
110
119
 
111
120
  def parse_class
112
- namespaces = [parse_capitalized_identifier]
113
- until @scanner.eos?
114
- @scanner.skip('::') or break
115
- @scanner.eos? and raise Error, 'incomplete class'
116
- namespaces << parse_capitalized_identifier
117
- end
121
+ pos = @scanner.pos
122
+ namespaces = [(parse_capitalized_identifier or return)]
123
+ namespaces <<
124
+ begin
125
+ parse_capitalized_identifier or
126
+ begin
127
+ @scanner.pos = pos
128
+ return
129
+ end
130
+ end while @scanner.skip('::')
118
131
  *namespaces, name = namespaces
119
132
  Tcepsni::Class.new(name:, namespaces:)
120
133
  end
121
134
 
122
135
  def parse_capitalized_identifier
123
- id = @scanner.scan(/[A-Z][A-Za-z0-9_]*/) or raise Error, "no capitalized identifier: #{@scanner.inspect}"
124
- id.intern
136
+ @scanner.scan(/[A-Z][A-Za-z0-9_]*/)&.intern
137
+ end
138
+
139
+ def parse_encoding
140
+ @scanner.skip(/#<Encoding:(?<name>[^>]+)>/) && Encoding.find(@scanner[:name])
125
141
  end
126
142
 
127
143
  def parse_object
128
- klass = parse_class
129
- if klass.encoding?
130
- @scanner.skip(':') or raise Error, 'no colon separator in encoding object'
131
- @scanner.skip(/(?<name>[^>]+)>/) or raise Error, 'invalid encoding name'
132
- Encoding.find(@scanner[:name])
133
- else
134
- memory_reference = parse_memory_reference
135
- attributes = parse_attributes
136
- Tcepsni::Object.new(klass:, memory_reference:, attributes:)
144
+ pos = @scanner.pos
145
+ @scanner.skip('#<') or return
146
+ @vendors.select { |vendor| vendor.object? }.each do |vendor|
147
+ expr = vendor.parse(self) and return expr
137
148
  end
149
+
150
+ klass = parse_class and
151
+ memory_reference = parse_memory_reference and
152
+ attributes = parse_attributes and
153
+ @scanner.skip('>') and
154
+ Tcepsni::Object.new(klass:, memory_reference:, attributes:) or
155
+ begin
156
+ @scanner.pos = pos
157
+ nil
158
+ end
159
+ end
160
+
161
+ def parse_attribute
162
+ pos = @scanner.pos
163
+ @scanner.skip('@') and
164
+ key = parse_identifier and
165
+ @scanner.skip('=') and
166
+ if FAIL == (value = parse_expression)
167
+ @scanner.pos = pos
168
+ return
169
+ else
170
+ return key, value
171
+ end
138
172
  end
139
173
 
140
174
  def parse_attributes
175
+ @scanner.match?('>') and return {}
176
+ pos = @scanner.pos
141
177
  attributes = {}
142
- unless @scanner.skip('>')
143
- until @scanner.eos?
144
- @scanner.skip(' @') or break
145
- key = parse_identifier
146
- @scanner.skip('=') or raise Error, 'no attribute keyval equal char'
147
- attributes[key.intern] = parse_expression
148
- unless @scanner.skip(',')
149
- @scanner.skip('>') or raise Error, "no object closer: #{@scanner.inspect}"
178
+ while @scanner.skip(' ')
179
+ key, value = (parse_attribute or return)
180
+ attributes[key] = value
181
+ @scanner.skip(',') or
182
+ if @scanner.match?('>')
150
183
  break
184
+ else
185
+ @scanner.pos = pos
186
+ return
151
187
  end
152
- end
153
188
  end
154
189
  attributes
155
190
  end
156
191
 
157
192
  def parse_memory_reference
158
- @scanner.skip(/:(?<memory_reference>0x[0-9a-f]{16})/) or raise Error, "no memory reference: #{@scanner.inspect}"
159
- Integer(@scanner[:memory_reference])
193
+ @scanner.skip(/:(?<ref>0x[0-9a-f]{16})/) or return
194
+ Integer(@scanner[:ref])
195
+ end
196
+
197
+ def parse_range
198
+ pos = @scanner.pos
199
+ int = parse_integer and
200
+ if @scanner.skip("..") && (int2 = parse_integer)
201
+ int..int2
202
+ else
203
+ @scanner.pos = pos
204
+ nil
205
+ end
206
+ end
207
+
208
+ def parse_float
209
+ pos = @scanner.pos
210
+ int = parse_integer and
211
+ if @scanner.skip('.') && (int2 = parse_integer)
212
+ Float("#{int}.#{int2}")
213
+ else
214
+ @scanner.pos = pos
215
+ nil
216
+ end
217
+ end
218
+
219
+ def parse_time
220
+ pos = @scanner.pos
221
+ int = parse_integer and
222
+ if int <= 9999 && @scanner.skip(/-(?<month>[01]\d)-(?<day>\d\d) (?<hour>[012]\d):(?<minute>[0-5]\d):(?<second>[0-5]\d) (?<zone>[+-]\d\d\d\d)/)
223
+ Time.new(int, @scanner[:month], @scanner[:day],
224
+ @scanner[:hour], @scanner[:minute], @scanner[:second],
225
+ @scanner[:zone])
226
+ else
227
+ @scanner.pos = pos
228
+ nil
229
+ end
160
230
  end
161
231
 
162
232
  extend Forwardable
163
- def_delegators :@scanner, :skip, :[]
233
+ def_delegators :@scanner, :skip, :[], :match?, :pos, :pos=
164
234
  end
165
235
  end
@@ -5,13 +5,16 @@ module Tcepsni
5
5
  module ActiveSupport
6
6
  class OrderedOptions
7
7
  def self.parse(parser)
8
- parser.skip('ActiveSupport::OrderedOptions {') or raise Error, 'no space between ActiveSupport::OrderedOptions class name and hash opener'
9
- hash = parser.parse_hash
10
- parser.skip('>') or raise Error, "no ActiveSupport ordered options closer: #{parser.scanner.inspect}"
8
+ pos = parser.pos
9
+ parser.skip('ActiveSupport::OrderedOptions ') and
10
+ hash = parser.parse_hash and
11
+ parser.skip('>') or
12
+ begin
13
+ parser.pos = pos
14
+ return
15
+ end
11
16
  options = ::ActiveSupport::OrderedOptions.new
12
- hash.each do |key, val|
13
- options[key] = val
14
- end
17
+ hash.each { |key, val| options[key] = val }
15
18
  options
16
19
  end
17
20
 
@@ -4,8 +4,7 @@ module Tcepsni
4
4
  module Vendor
5
5
  class IPAddr
6
6
  def self.parse(parser)
7
- parser.skip(/IPAddr: IPv[46]:(?<addr>[^>]+)>/) or raise Error, 'invalid IP address format error'
8
- ::IPAddr.new(parser[:addr])
7
+ parser.skip(/IPAddr: IPv[46]:(?<addr>[^>]+)>/) && ::IPAddr.new(parser[:addr])
9
8
  end
10
9
 
11
10
  def self.object?
@@ -4,9 +4,7 @@ module Tcepsni
4
4
  module Vendor
5
5
  class Pathname
6
6
  def self.parse(parser)
7
- parser.skip('Pathname:') or raise Error, 'no colon between Pathname class name and path string'
8
- parser.skip(/(?<path>[^>]+)>/) or raise Error, 'invalid path string and closer'
9
- ::Pathname.new(parser[:path])
7
+ parser.skip(/Pathname:(?<path>[^>]+)>/) && ::Pathname.new(parser[:path])
10
8
  end
11
9
 
12
10
  def self.object?
@@ -13,14 +13,21 @@ module Tcepsni
13
13
  end
14
14
 
15
15
  def self.parse(parser)
16
- parser.skip('Rails::Paths::Root') or raise Error, 'this is not Rails::Paths::Root'
17
- memory_reference = parser.parse_memory_reference
18
- attributes = if parser.skip(' ...>')
19
- {}
20
- else
21
- parser.parse_attributes
22
- end
23
- Tcepsni::Vendor::Rails::Paths::Root.new(memory_reference, attributes)
16
+ parser.skip('Rails::Paths::Root') or return
17
+ pos = parser.pos
18
+ if (memory_reference = parser.parse_memory_reference)
19
+ if parser.skip(' ...>')
20
+ Tcepsni::Vendor::Rails::Paths::Root.new(memory_reference, {})
21
+ elsif (attrs = parser.parse_attributes) && parser.skip('>')
22
+ Tcepsni::Vendor::Rails::Paths::Root.new(memory_reference, attrs)
23
+ else
24
+ parser.pos = pos
25
+ return
26
+ end
27
+ else
28
+ parser.pos = pos
29
+ nil
30
+ end
24
31
  end
25
32
 
26
33
  def self.object?
@@ -4,23 +4,28 @@ module Tcepsni
4
4
  attr_reader :pos, :total, :scanned, :rest
5
5
 
6
6
  def initialize(pos:, total:, scanned:, rest:)
7
- @pos = pos
8
- @total = total
7
+ @pos = pos
8
+ @total = total
9
9
  @scanned = scanned
10
- @rest = rest
10
+ @rest = rest
11
11
  end
12
12
 
13
13
  def self.parse(parser)
14
- parser.skip('StringScanner ') or raise Error, 'no space after string scanner class name'
15
- pos = parser.parse_integer
16
- parser.skip('/') or raise Error, 'no string scanner progress delimiter slash'
17
- total = parser.parse_integer
18
- parser.skip(' "') or raise Error, 'no space after string scanner progress'
19
- scanned = parser.parse_string
20
- parser.skip(' @ "') or raise Error, "no string scanner mark in string: #{parser.scanner.inspect}"
21
- rest = parser.parse_string
22
- parser.skip('>') or raise Error, 'no string scanner closer'
23
- Tcepsni::Vendor::StringScanner.new(pos:, total:, scanned:, rest:)
14
+ pos = parser.pos
15
+ parser.skip('StringScanner ') and
16
+ pos = parser.parse_integer and
17
+ parser.skip('/') and
18
+ total = parser.parse_integer and
19
+ parser.skip(' ') and
20
+ scanned = parser.parse_string and
21
+ parser.skip(' @ ') and
22
+ rest = parser.parse_string and
23
+ parser.skip('>') and
24
+ Tcepsni::Vendor::StringScanner.new(pos:, total:, scanned:, rest:) or
25
+ begin
26
+ parser.pos = pos
27
+ nil
28
+ end
24
29
  end
25
30
 
26
31
  def self.dependencies
@@ -1,3 +1,3 @@
1
1
  module Tcepsni
2
- VERSION = '0.3.1'
2
+ VERSION = '0.4.0'
3
3
  end
data/lib/tcepsni.rb CHANGED
@@ -15,10 +15,6 @@ module Tcepsni
15
15
  @name = name
16
16
  @namespaces = namespaces
17
17
  end
18
-
19
- def encoding?
20
- @name == :Encoding && @namespaces.empty?
21
- end
22
18
  end
23
19
 
24
20
  class Object
data/sig/tcepsni.gen.rbs CHANGED
@@ -3,10 +3,12 @@
3
3
  # Classes
4
4
  module Tcepsni
5
5
  VERSION: String
6
+ Error: Class
6
7
 
7
8
  # def self.parse: (String str) -> untyped
8
9
 
9
10
  class Parser
11
+ FAIL: untyped
10
12
  extend Forwardable
11
13
  @scanner: StringScanner
12
14
  @vendors: Array[Array[untyped]]
@@ -24,6 +26,15 @@ module Tcepsni
24
26
  # def parse_object: -> Object
25
27
  # def parse_attributes: -> Hash[Symbol, untyped]
26
28
  # def parse_memory_reference: -> Integer
29
+ # def parse_nil: -> nil
30
+ # def parse_true: -> true?
31
+ # def parse_false: -> false
32
+ # def parse_symbol: -> Symbol
33
+ # def parse_range: -> Range?
34
+ # def parse_float: -> Float?
35
+ # def parse_time: -> Time?
36
+ # def parse_encoding: -> Encoding?
37
+ # def parse_attribute: -> [Symbol, untyped]?
27
38
  end
28
39
 
29
40
  class Class
@@ -48,47 +59,27 @@ module Tcepsni
48
59
 
49
60
  module Vendor
50
61
  class StringScanner
51
- attr_reader pos: untyped
52
- attr_reader total: untyped
53
- attr_reader scanned: untyped
54
- attr_reader rest: untyped
55
- def initialize: (pos: untyped, total: untyped, scanned: untyped, rest: untyped) -> void
56
- def self.parse: (untyped parser) -> StringScanner
57
- def self.dependencies: -> Array[untyped]
58
- def self.object?: -> true
62
+ # def initialize: (pos: untyped, total: untyped, scanned: untyped, rest: untyped) -> void
63
+ # def self.parse: (untyped parser) -> StringScanner?
64
+ # def self.dependencies: -> Array[untyped]
65
+ # def self.object?: -> true
66
+ # attr_reader pos: untyped
67
+ # attr_reader total: untyped
68
+ # attr_reader scanned: untyped
69
+ # attr_reader rest: untyped
59
70
  end
60
71
 
61
72
  module Rails
62
73
  module Paths
63
74
  class Root
64
- attr_reader memory_reference: untyped
65
- attr_reader attributes: Hash[untyped, untyped]
66
- def initialize: (untyped memory_reference, Hash[untyped, untyped] attributes) -> void
67
- def self.parse: (untyped parser) -> Root
68
- def self.object?: -> true
69
- def self.dependencies: -> [singleton(Pathname)]
75
+ # def initialize: (untyped memory_reference, Hash[untyped, untyped] attributes) -> void
76
+ # def self.parse: (untyped parser) -> Root?
77
+ # def self.object?: -> true
78
+ # def self.dependencies: -> [singleton(Pathname)]
79
+ # attr_reader memory_reference: untyped
80
+ # attr_reader attributes: Hash[untyped, untyped]
70
81
  end
71
82
  end
72
83
  end
73
-
74
- module ActiveSupport
75
- class OrderedOptions
76
- def self.parse: (untyped parser) -> untyped
77
- def self.dependencies: -> Array[untyped]
78
- def self.object?: -> true
79
- end
80
- end
81
-
82
- class IPAddr
83
- def self.parse: (untyped parser) -> IPAddr
84
- def self.object?: -> true
85
- def self.dependencies: -> Array[untyped]
86
- end
87
-
88
- class Pathname
89
- def self.parse: (untyped parser) -> Pathname
90
- def self.object?: -> true
91
- def self.dependencies: -> Array[untyped]
92
- end
93
84
  end
94
85
  end
data/sig/tcepsni.rbs CHANGED
@@ -1,12 +1,11 @@
1
1
  module Tcepsni
2
2
  VERSION: String
3
-
4
- class Error < StandardError
5
- end
3
+ Error: Class
6
4
 
7
5
  def self.parse: (String str) -> untyped
8
6
 
9
7
  class Parser
8
+ FAIL: untyped
10
9
  def initialize: (String source, vendors: Array[untyped]?) -> void
11
10
  def parse_expression: -> untyped
12
11
  alias parse parse_expression
@@ -20,6 +19,15 @@ module Tcepsni
20
19
  def parse_object: -> Object
21
20
  def parse_attributes: -> Hash[Symbol, untyped]
22
21
  def parse_memory_reference: -> Integer
22
+ def parse_nil: -> nil
23
+ def parse_true: -> true?
24
+ def parse_false: -> false
25
+ def parse_symbol: -> Symbol
26
+ def parse_range: -> Range?
27
+ def parse_float: -> Float?
28
+ def parse_time: -> Time?
29
+ def parse_encoding: -> Encoding?
30
+ def parse_attribute: -> [Symbol, untyped]?
23
31
  end
24
32
 
25
33
  class Class
@@ -44,24 +52,47 @@ module Tcepsni
44
52
 
45
53
  module Vendor
46
54
  class StringScanner
55
+ attr_reader pos: untyped
56
+ attr_reader total: untyped
57
+ attr_reader scanned: untyped
58
+ attr_reader rest: untyped
59
+ def initialize: (pos: untyped, total: untyped, scanned: untyped, rest: untyped) -> void
60
+ def self.parse: (untyped parser) -> StringScanner?
61
+ def self.dependencies: -> Array[untyped]
62
+ def self.object?: -> true
47
63
  end
48
64
 
49
65
  module Rails
50
66
  module Paths
51
67
  class Root
68
+ attr_reader memory_reference: untyped
69
+ attr_reader attributes: Hash[untyped, untyped]
70
+ def initialize: (untyped memory_reference, Hash[untyped, untyped] attributes) -> void
71
+ def self.parse: (untyped parser) -> Root?
72
+ def self.object?: -> true
73
+ def self.dependencies: -> [singleton(Pathname)]
52
74
  end
53
75
  end
54
76
  end
55
77
 
56
78
  module ActiveSupport
57
79
  class OrderedOptions
80
+ def self.parse: (untyped parser) -> nil
81
+ def self.dependencies: -> Array[untyped]
82
+ def self.object?: -> true
58
83
  end
59
84
  end
60
85
 
61
86
  class IPAddr
87
+ def self.parse: (untyped parser) -> IPAddr
88
+ def self.object?: -> true
89
+ def self.dependencies: -> Array[untyped]
62
90
  end
63
91
 
64
92
  class Pathname
93
+ def self.parse: (untyped parser) -> Pathname
94
+ def self.object?: -> true
95
+ def self.dependencies: -> Array[untyped]
65
96
  end
66
97
  end
67
98
  end
data/tcepsni.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
 
13
13
  spec.homepage = 'https://codeberg.org/gemmaro/tcepsni'
14
14
 
15
- spec.required_ruby_version = '>= 3.1.0'
15
+ spec.required_ruby_version = '>= 3.2'
16
16
 
17
17
  spec.files = Dir['lib/**/*.rb'] + Dir['sig/**/*.rbs'] +
18
18
  ['CHANGELOG.md', 'tcepsni.gemspec', 'README.md', 'LICENSE.txt']
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tcepsni
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - gemmaro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-21 00:00:00.000000000 Z
11
+ date: 2024-08-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Tcepsni gem is a parser library for inspected strings of Ruby objects.
14
14
  email:
@@ -50,14 +50,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: 3.1.0
53
+ version: '3.2'
54
54
  required_rubygems_version: !ruby/object:Gem::Requirement
55
55
  requirements:
56
56
  - - ">="
57
57
  - !ruby/object:Gem::Version
58
58
  version: '0'
59
59
  requirements: []
60
- rubygems_version: 3.3.26
60
+ rubygems_version: 3.4.19
61
61
  signing_key:
62
62
  specification_version: 4
63
63
  summary: inspected Ruby objects parser