tcepsni 0.1.0 → 0.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/lib/tcepsni/version.rb +1 -1
- data/lib/tcepsni.rb +40 -23
- data/sig/tcepsni.gen.rbs +4 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f68a9bde443479e50e62f0f201a17c986eaad09e686e48adb24fa6a600ce38cb
|
4
|
+
data.tar.gz: 2e718d175261eb10ded9c3fbcad4926b6c98e5072d0a81d148aa1f40c6f04571
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 232ff2963d9bca49cea25eb7cc90bc6fc08815808058289e61b6ffae5dc8ee1516b43a2d56b64fde23c707034b7d1d1c068c417fc66a1e21503327f32237d5bb
|
7
|
+
data.tar.gz: aadf113b5b26b20fc9d648ead1b43bf29f1c48eddd977348f0ef195af98dc0ab5fed4654dfd79a7b4f3009411b47a3d97e4834143c3ee99f6dab0b724300135c
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,16 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## 0.1.1 - 2023-10-02
|
6
|
+
|
7
|
+
### Changed
|
8
|
+
|
9
|
+
- Object's memory reference attribute has changed to integer from string
|
10
|
+
|
11
|
+
### Fixed
|
12
|
+
|
13
|
+
- String scanner parser now supports string with quotes
|
14
|
+
|
5
15
|
## 0.1.0 - 2023-10-01
|
6
16
|
|
7
17
|
- Initial release
|
data/lib/tcepsni/version.rb
CHANGED
data/lib/tcepsni.rb
CHANGED
@@ -12,32 +12,41 @@ module Tcepsni
|
|
12
12
|
class << self
|
13
13
|
private
|
14
14
|
|
15
|
+
# If it returned nil when failed, it collides with normal nil value.
|
15
16
|
def parse_expression(scanner)
|
16
|
-
if
|
17
|
-
Integer(integer)
|
18
|
-
elsif scanner.skip('nil')
|
17
|
+
if scanner.skip('nil')
|
19
18
|
nil
|
20
19
|
elsif scanner.skip('true')
|
21
20
|
true
|
22
21
|
elsif scanner.skip('false')
|
23
22
|
false
|
24
|
-
elsif scanner.skip(
|
25
|
-
scanner
|
23
|
+
elsif scanner.skip(':')
|
24
|
+
parse_identifier(scanner)
|
26
25
|
elsif scanner.skip('"')
|
27
26
|
parse_string(scanner)
|
28
27
|
elsif scanner.skip('[')
|
29
28
|
parse_array(scanner)
|
30
29
|
elsif scanner.skip('{')
|
31
30
|
parse_hash(scanner)
|
32
|
-
elsif (name = scanner.scan(/[A-Z][A-Za-z0-9_]*/))
|
33
|
-
parse_class(scanner, name: name.intern)
|
34
31
|
elsif scanner.skip('#<')
|
35
32
|
parse_object(scanner)
|
36
33
|
else
|
37
|
-
|
34
|
+
parse_integer(scanner) or parse_class(scanner)
|
38
35
|
end
|
39
36
|
end
|
40
37
|
|
38
|
+
# Returns nil if it's not integer.
|
39
|
+
# This doesn't raise error for convenience.
|
40
|
+
def parse_integer(scanner)
|
41
|
+
int = scanner.scan(/\d+/) or return
|
42
|
+
Integer(int)
|
43
|
+
end
|
44
|
+
|
45
|
+
def parse_identifier(scanner)
|
46
|
+
id = scanner.scan(/[A-Za-z_][A-Za-z0-9_]*/) or raise Error, 'no identifier'
|
47
|
+
id.intern
|
48
|
+
end
|
49
|
+
|
41
50
|
def parse_string(scanner)
|
42
51
|
result = ''
|
43
52
|
until scanner.eos?
|
@@ -76,37 +85,45 @@ module Tcepsni
|
|
76
85
|
result
|
77
86
|
end
|
78
87
|
|
79
|
-
def parse_class(scanner
|
80
|
-
|
81
|
-
name = scanner.scan(/[A-Z][A-Za-z0-9_]*/) or raise Error, 'no class name'
|
82
|
-
name = name.intern
|
83
|
-
end
|
84
|
-
namespaces = [name]
|
88
|
+
def parse_class(scanner)
|
89
|
+
namespaces = [parse_capitalized_identifier(scanner)]
|
85
90
|
until scanner.eos?
|
86
91
|
scanner.skip('::') or break
|
87
92
|
scanner.eos? and raise Error, 'incomplete class'
|
88
|
-
|
89
|
-
namespaces << namespace.intern
|
93
|
+
namespaces << parse_capitalized_identifier(scanner)
|
90
94
|
end
|
91
95
|
*namespaces, name = namespaces
|
92
96
|
Tcepsni::Class.new(name: name, namespaces: namespaces)
|
93
97
|
end
|
94
98
|
|
99
|
+
def parse_capitalized_identifier(scanner)
|
100
|
+
id = scanner.scan(/[A-Z][A-Za-z0-9_]*/) or raise Error, 'no capitalized identifier'
|
101
|
+
id.intern
|
102
|
+
end
|
103
|
+
|
95
104
|
def parse_object(scanner)
|
96
105
|
klass = parse_class(scanner)
|
97
106
|
if klass.string_scanner?
|
98
|
-
scanner.skip(
|
99
|
-
|
107
|
+
scanner.skip(' ') or raise Error, 'no space after string scanner class name'
|
108
|
+
pos = parse_integer(scanner) or raise Error, 'no string scanner pos'
|
109
|
+
scanner.skip('/') or raise Error, 'no string scanner progress delimiter slash'
|
110
|
+
total = parse_integer(scanner) or raise Error, 'no string scanner total size'
|
111
|
+
scanner.skip(' "') or raise Error, 'no space after string scanner progress'
|
112
|
+
scanned = parse_string(scanner)
|
113
|
+
scanner.skip(' @ "') or raise Error, "no string scanner mark in string: #{scanner.inspect}"
|
114
|
+
rest = parse_string(scanner)
|
115
|
+
scanner.skip('>') or raise Error, 'no string scanner closer'
|
116
|
+
Tcepsni::StringScanner.new(pos: pos, total: total, scanned: scanned, rest: rest)
|
100
117
|
else
|
101
118
|
scanner.skip(/:(?<memory_reference>0x[0-9a-f]{16})/) or raise Error, "no memory reference: #{scanner.inspect}"
|
102
|
-
memory_reference = scanner[:memory_reference]
|
119
|
+
memory_reference = Integer(scanner[:memory_reference])
|
103
120
|
attributes = {}
|
104
121
|
unless scanner.skip('>')
|
105
122
|
until scanner.eos?
|
106
|
-
scanner.skip(
|
107
|
-
key = scanner
|
108
|
-
|
109
|
-
attributes[key] =
|
123
|
+
scanner.skip(' @') or break
|
124
|
+
key = parse_identifier(scanner)
|
125
|
+
scanner.skip('=') or raise Error, 'no attribute keyval equal char'
|
126
|
+
attributes[key.intern] = parse_expression(scanner)
|
110
127
|
scanner.skip(',') or break
|
111
128
|
end
|
112
129
|
end
|
data/sig/tcepsni.gen.rbs
CHANGED
@@ -6,10 +6,13 @@ module Tcepsni
|
|
6
6
|
|
7
7
|
# def self.parse: (String str) -> parsed
|
8
8
|
def self.parse_expression: (untyped scanner) -> ((Array[(Array[(Class | Integer | Object | String | StringScanner | bool)?] | Class | Hash[(Class | Integer | Object | String | StringScanner | bool)?, (Class | Integer | Object | String | StringScanner | bool)?] | Integer | Object | String | StringScanner | bool)?] | Class | Hash[(Class | Integer | Object | String | StringScanner | bool)?, (Array[(Class | Integer | Object | String | StringScanner | bool)?] | Class | Hash[(Class | Integer | Object | String | StringScanner | bool)?, (Class | Integer | Object | String | StringScanner | bool)?] | Integer | Object | String | StringScanner | bool)?] | Integer | Object | String | StringScanner | bool)?)
|
9
|
+
def self.parse_integer: (untyped scanner) -> Integer?
|
10
|
+
def self.parse_identifier: (untyped scanner) -> untyped
|
9
11
|
def self.parse_string: (untyped scanner) -> String
|
10
12
|
def self.parse_array: (untyped scanner) -> (Array[(Array[(Array[untyped] | Class | Hash[(Class | Integer | Object | String | StringScanner | bool)?, untyped] | Integer | Object | String | StringScanner | bool)?] | Class | Hash[(Class | Integer | Object | String | StringScanner | bool)?, (Array[untyped] | Class | Hash[(Class | Integer | Object | String | StringScanner | bool)?, untyped] | Integer | Object | String | StringScanner | bool)?] | Integer | Object | String | StringScanner | bool)?])
|
11
13
|
def self.parse_hash: (untyped scanner) -> (Hash[(Class | Integer | Object | String | StringScanner | bool)?, (Array[(Array[untyped] | Class | Hash[(Class | Integer | Object | String | StringScanner | bool)?, untyped] | Integer | Object | String | StringScanner | bool)?] | Class | Hash[(Class | Integer | Object | String | StringScanner | bool)?, (Array[untyped] | Class | Hash[(Class | Integer | Object | String | StringScanner | bool)?, untyped] | Integer | Object | String | StringScanner | bool)?] | Integer | Object | String | StringScanner | bool)?])
|
12
|
-
def self.parse_class: (untyped scanner
|
14
|
+
def self.parse_class: (untyped scanner) -> Class
|
15
|
+
def self.parse_capitalized_identifier: (untyped scanner) -> untyped
|
13
16
|
def self.parse_object: (untyped scanner) -> (Object | StringScanner)
|
14
17
|
|
15
18
|
class Class
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tcepsni
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- gemmaro
|
@@ -45,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '0'
|
47
47
|
requirements: []
|
48
|
-
rubygems_version: 3.
|
48
|
+
rubygems_version: 3.3.26
|
49
49
|
signing_key:
|
50
50
|
specification_version: 4
|
51
51
|
summary: inspected Ruby objects parser
|