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