tcepsni 0.3.1 → 0.4.0

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