template-ruby 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +70 -0
- data/lib/code/node/base_10_decimal.rb +27 -0
- data/lib/code/node/base_10_integer.rb +23 -0
- data/lib/code/node/base_10_number.rb +19 -0
- data/lib/code/node/base_16_number.rb +19 -0
- data/lib/code/node/base_2_number.rb +19 -0
- data/lib/code/node/base_8_number.rb +19 -0
- data/lib/code/node/boolean.rb +13 -0
- data/lib/code/node/call.rb +19 -0
- data/lib/code/node/code.rb +19 -0
- data/lib/code/node/dictionnary.rb +18 -0
- data/lib/code/node/dictionnary_key_value.rb +23 -0
- data/lib/code/node/list.rb +13 -0
- data/lib/code/node/name.rb +17 -0
- data/lib/code/node/nothing.rb +12 -0
- data/lib/code/node/number.rb +23 -0
- data/lib/code/node/statement.rb +31 -0
- data/lib/code/node/string.rb +17 -0
- data/lib/code/node.rb +4 -0
- data/lib/code/object/boolean.rb +28 -0
- data/lib/code/object/decimal.rb +31 -0
- data/lib/code/object/dictionnary.rb +32 -0
- data/lib/code/object/integer.rb +29 -0
- data/lib/code/object/list.rb +37 -0
- data/lib/code/object/nothing.rb +22 -0
- data/lib/code/object/string.rb +30 -0
- data/lib/code/object.rb +11 -0
- data/lib/code/parser/boolean.rb +14 -0
- data/lib/code/parser/call.rb +16 -0
- data/lib/code/parser/code.rb +18 -0
- data/lib/code/parser/dictionnary.rb +41 -0
- data/lib/code/parser/list.rb +29 -0
- data/lib/code/parser/name.rb +49 -0
- data/lib/code/parser/nothing.rb +17 -0
- data/lib/code/parser/number.rb +98 -0
- data/lib/code/parser/statement.rb +11 -0
- data/lib/code/parser/string.rb +66 -0
- data/lib/code/parser.rb +4 -0
- data/lib/code.rb +27 -0
- data/lib/template/node/code_part.rb +13 -0
- data/lib/template/node/part.rb +19 -0
- data/lib/template/node/template.rb +13 -0
- data/lib/template/node/text_part.rb +13 -0
- data/lib/template/node.rb +4 -0
- data/lib/template/parser/template.rb +26 -0
- data/lib/template/parser.rb +4 -0
- data/lib/template-ruby.rb +6 -0
- data/lib/template.rb +20 -0
- data/spec/code/parser/boolean_spec.rb +18 -0
- data/spec/code/parser/call_spec.rb +39 -0
- data/spec/code/parser/dictionnary_spec.rb +46 -0
- data/spec/code/parser/list_spec.rb +29 -0
- data/spec/code/parser/name_spec.rb +15 -0
- data/spec/code/parser/nothing_spec.rb +19 -0
- data/spec/code/parser/number_spec.rb +117 -0
- data/spec/code/parser/string_spec.rb +29 -0
- data/spec/code_spec.rb +35 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/template/parser/template_spec.rb +19 -0
- data/spec/template_spec.rb +30 -0
- data/template-ruby.gemspec +20 -0
- metadata +188 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 51afb6ed8605217e5960882e6b007cdd3b96dd8c3f72e0cb372e67b55d96e88b
|
4
|
+
data.tar.gz: 18bfdbb2a0a22b736aa9282f2875021d4e5398f0d61c1c35f402c4a1a8e2d4dd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7cd8c95144f5a535b704f79cbb559d1868bfad164d8c08a261ae915afb94d3c06b02fae4eb2cc51000a49547a48a282cbf35043e7d769ff890338c78958f4b42
|
7
|
+
data.tar.gz: 00cd29f362d8bb6b93ae782daaef8a87e4dcade2c299ce9504e2579faa5558005fa4305706006fa21b54b7c9b3d5b4ef74d561d7a28775454112c6181d4be00c
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--require spec_helper
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
template-ruby (0.1.0)
|
5
|
+
activesupport (~> 7)
|
6
|
+
parslet (~> 2)
|
7
|
+
zeitwerk (~> 2)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
activesupport (7.0.3.1)
|
13
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
14
|
+
i18n (>= 1.6, < 2)
|
15
|
+
minitest (>= 5.1)
|
16
|
+
tzinfo (~> 2.0)
|
17
|
+
concurrent-ruby (1.1.10)
|
18
|
+
diff-lcs (1.5.0)
|
19
|
+
haml (5.2.2)
|
20
|
+
temple (>= 0.8.0)
|
21
|
+
tilt
|
22
|
+
i18n (1.12.0)
|
23
|
+
concurrent-ruby (~> 1.0)
|
24
|
+
minitest (5.16.2)
|
25
|
+
parslet (2.0.0)
|
26
|
+
prettier (3.2.0)
|
27
|
+
syntax_tree (>= 2.7.1)
|
28
|
+
syntax_tree-haml (>= 1.1.0)
|
29
|
+
syntax_tree-rbs (>= 0.2.0)
|
30
|
+
prettier_print (0.1.0)
|
31
|
+
rbs (2.6.0)
|
32
|
+
rspec (3.11.0)
|
33
|
+
rspec-core (~> 3.11.0)
|
34
|
+
rspec-expectations (~> 3.11.0)
|
35
|
+
rspec-mocks (~> 3.11.0)
|
36
|
+
rspec-core (3.11.0)
|
37
|
+
rspec-support (~> 3.11.0)
|
38
|
+
rspec-expectations (3.11.0)
|
39
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
40
|
+
rspec-support (~> 3.11.0)
|
41
|
+
rspec-mocks (3.11.1)
|
42
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
43
|
+
rspec-support (~> 3.11.0)
|
44
|
+
rspec-support (3.11.0)
|
45
|
+
syntax_tree (3.2.1)
|
46
|
+
prettier_print
|
47
|
+
syntax_tree-haml (1.3.0)
|
48
|
+
haml (>= 5.2)
|
49
|
+
prettier_print
|
50
|
+
syntax_tree (>= 2.0.1)
|
51
|
+
syntax_tree-rbs (0.5.0)
|
52
|
+
prettier_print
|
53
|
+
rbs
|
54
|
+
syntax_tree (>= 2.0.1)
|
55
|
+
temple (0.8.2)
|
56
|
+
tilt (2.0.11)
|
57
|
+
tzinfo (2.0.5)
|
58
|
+
concurrent-ruby (~> 1.0)
|
59
|
+
zeitwerk (2.6.0)
|
60
|
+
|
61
|
+
PLATFORMS
|
62
|
+
arm64-darwin-21
|
63
|
+
|
64
|
+
DEPENDENCIES
|
65
|
+
prettier (~> 3)
|
66
|
+
rspec (~> 3)
|
67
|
+
template-ruby!
|
68
|
+
|
69
|
+
BUNDLED WITH
|
70
|
+
2.3.18
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class Base10Decimal
|
4
|
+
def initialize(number)
|
5
|
+
@sign = number[:sign]
|
6
|
+
@whole = number.fetch(:whole)
|
7
|
+
@decimal = number.fetch(:decimal)
|
8
|
+
|
9
|
+
if number.key?(:exponent)
|
10
|
+
@exponent = ::Code::Node::Base10Number.new(number[:exponent])
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def evaluate(context)
|
15
|
+
@exponent = @exponent.evaluate(context) if @exponent
|
16
|
+
::Code::Object::Decimal.new(
|
17
|
+
"#{sign}#{whole}.#{decimal}",
|
18
|
+
exponent: @exponent
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :sign, :whole, :decimal
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class Base10Integer
|
4
|
+
def initialize(number)
|
5
|
+
@sign = number[:sign]
|
6
|
+
@whole = number.fetch(:whole)
|
7
|
+
|
8
|
+
if number.key?(:exponent)
|
9
|
+
@exponent = ::Code::Node::Base10Number.new(number[:exponent])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def evaluate(context)
|
14
|
+
@exponent = @exponent.evaluate(context) if @exponent
|
15
|
+
::Code::Object::Integer.new("#{sign}#{whole}", exponent: @exponent)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
attr_reader :sign, :whole
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class Base10Number
|
4
|
+
def initialize(number)
|
5
|
+
if number.key?(:integer)
|
6
|
+
@number = ::Code::Node::Base10Integer.new(number[:integer])
|
7
|
+
elsif number.key?(:decimal)
|
8
|
+
@number = ::Code::Node::Base10Decimal.new(number[:decimal])
|
9
|
+
else
|
10
|
+
raise NotImplementedErorr.new(number.inspect)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def evaluate(context)
|
15
|
+
@number.evaluate(context)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class Base16Number
|
4
|
+
def initialize(number)
|
5
|
+
@number = number
|
6
|
+
end
|
7
|
+
|
8
|
+
def evaluate(context)
|
9
|
+
::Code::Object::Integer.new(number)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def number
|
15
|
+
@number.to_s.to_i(16)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class Base2Number
|
4
|
+
def initialize(number)
|
5
|
+
@number = number
|
6
|
+
end
|
7
|
+
|
8
|
+
def evaluate(context)
|
9
|
+
::Code::Object::Integer.new(number)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def number
|
15
|
+
@number.to_s.to_i(2)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class Base8Number
|
4
|
+
def initialize(number)
|
5
|
+
@number = number
|
6
|
+
end
|
7
|
+
|
8
|
+
def evaluate(context)
|
9
|
+
::Code::Object::Integer.new(number)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def number
|
15
|
+
@number.to_s.to_i(8)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class Call
|
4
|
+
def initialize(call)
|
5
|
+
@left = ::Code::Node::Statement.new(call.fetch(:left))
|
6
|
+
@right = ::Code::Node::Statement.new(call.fetch(:right))
|
7
|
+
end
|
8
|
+
|
9
|
+
def evaluate(context)
|
10
|
+
context = left.evaluate(context)
|
11
|
+
right.evaluate(context)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
attr_reader :left, :right
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "active_support"
|
2
|
+
require "active_support/core_ext/object/blank"
|
3
|
+
|
4
|
+
class Code
|
5
|
+
class Node
|
6
|
+
class Code
|
7
|
+
def initialize(statements)
|
8
|
+
statements = [] if statements.blank?
|
9
|
+
|
10
|
+
@statements =
|
11
|
+
statements.map { |statement| ::Code::Node::Statement.new(statement) }
|
12
|
+
end
|
13
|
+
|
14
|
+
def evaluate(context)
|
15
|
+
@statements.map { |statement| statement.evaluate(context) }.last
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class Dictionnary
|
4
|
+
def initialize(key_values)
|
5
|
+
@key_values =
|
6
|
+
key_values.map do |key_value|
|
7
|
+
::Code::Node::DictionnaryKeyValue.new(key_value)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def evaluate(context)
|
12
|
+
::Code::Object::Dictionnary.new(
|
13
|
+
@key_values.map { |key_value| key_value.evaluate(context) }.to_h
|
14
|
+
)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class DictionnaryKeyValue
|
4
|
+
def initialize(key_value)
|
5
|
+
@key = key_value.fetch(:key)
|
6
|
+
|
7
|
+
if @key.is_a?(Array)
|
8
|
+
@key = ::Code::Node::Code.new(@key)
|
9
|
+
elsif @key.key?(:name)
|
10
|
+
@key = ::Code::Node::String.new(@key[:name])
|
11
|
+
else
|
12
|
+
@key = ::Code::Node::Statement.new(@key)
|
13
|
+
end
|
14
|
+
|
15
|
+
@value = ::Code::Node::Code.new(key_value.fetch(:value))
|
16
|
+
end
|
17
|
+
|
18
|
+
def evaluate(context)
|
19
|
+
[@key.evaluate(context), @value.evaluate(context)]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class List
|
4
|
+
def initialize(codes)
|
5
|
+
@codes = codes.map { |code| ::Code::Node::Code.new(code[:code]) }
|
6
|
+
end
|
7
|
+
|
8
|
+
def evaluate(context)
|
9
|
+
::Code::Object::List.new(@codes.map { |code| code.evaluate(context) })
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class Number
|
4
|
+
def initialize(number)
|
5
|
+
if number.key?(:base_2)
|
6
|
+
@number = ::Code::Node::Base2Number.new(number[:base_2])
|
7
|
+
elsif number.key?(:base_8)
|
8
|
+
@number = ::Code::Node::Base8Number.new(number[:base_8])
|
9
|
+
elsif number.key?(:base_10)
|
10
|
+
@number = ::Code::Node::Base10Number.new(number[:base_10])
|
11
|
+
elsif number.key?(:base_16)
|
12
|
+
@number = ::Code::Node::Base16Number.new(number[:base_16])
|
13
|
+
else
|
14
|
+
raise NotImplementedErorr.new(number.inspect)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def evaluate(context)
|
19
|
+
@number.evaluate(context)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Code
|
2
|
+
class Node
|
3
|
+
class Statement
|
4
|
+
def initialize(statement)
|
5
|
+
if statement.key?(:nothing)
|
6
|
+
@statement = ::Code::Node::Nothing.new
|
7
|
+
elsif statement.key?(:boolean)
|
8
|
+
@statement = ::Code::Node::Boolean.new(statement[:boolean])
|
9
|
+
elsif statement.key?(:number)
|
10
|
+
@statement = ::Code::Node::Number.new(statement[:number])
|
11
|
+
elsif statement.key?(:string)
|
12
|
+
@statement = ::Code::Node::String.new(statement[:string])
|
13
|
+
elsif statement.key?(:call)
|
14
|
+
@statement = ::Code::Node::Call.new(statement[:call])
|
15
|
+
elsif statement.key?(:name)
|
16
|
+
@statement = ::Code::Node::Name.new(statement[:name])
|
17
|
+
elsif statement.key?(:list)
|
18
|
+
@statement = ::Code::Node::List.new(statement[:list])
|
19
|
+
elsif statement.key?(:dictionnary)
|
20
|
+
@statement = ::Code::Node::Dictionnary.new(statement[:dictionnary])
|
21
|
+
else
|
22
|
+
raise NotImplementedError.new(statement.inspect)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def evaluate(context)
|
27
|
+
@statement.evaluate(context)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/code/node.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
class Code
|
2
|
+
class Object
|
3
|
+
class Boolean < ::Code::Object
|
4
|
+
attr_reader :raw
|
5
|
+
|
6
|
+
def initialize(raw)
|
7
|
+
@raw = raw
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
raw.to_s
|
12
|
+
end
|
13
|
+
|
14
|
+
def inspect
|
15
|
+
to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
def ==(other)
|
19
|
+
raw == other.raw
|
20
|
+
end
|
21
|
+
alias_method :eql?, :==
|
22
|
+
|
23
|
+
def hash
|
24
|
+
[self.class, raw].hash
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "bigdecimal"
|
2
|
+
|
3
|
+
class Code
|
4
|
+
class Object
|
5
|
+
class Decimal < ::Code::Object
|
6
|
+
attr_reader :raw
|
7
|
+
|
8
|
+
def initialize(decimal, exponent: nil)
|
9
|
+
@raw = BigDecimal(decimal)
|
10
|
+
@raw = @raw * 10**exponent.raw if exponent
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
raw.to_s("F")
|
15
|
+
end
|
16
|
+
|
17
|
+
def inspect
|
18
|
+
to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
def ==(other)
|
22
|
+
raw == other.raw
|
23
|
+
end
|
24
|
+
alias_method :eql?, :==
|
25
|
+
|
26
|
+
def hash
|
27
|
+
[self.class, raw].hash
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Code
|
2
|
+
class Object
|
3
|
+
class Dictionnary < ::Code::Object
|
4
|
+
attr_reader :raw
|
5
|
+
|
6
|
+
def initialize(raw = {})
|
7
|
+
@raw = raw
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
"{#{raw.map { |key, value| "#{key.inspect} => #{value.inspect}" }.join(", ")}}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def inspect
|
15
|
+
to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
def fetch(key, default = ::Code::Object::Nothing.new)
|
19
|
+
raw.fetch(key, default)
|
20
|
+
end
|
21
|
+
|
22
|
+
def ==(other)
|
23
|
+
raw == other.raw
|
24
|
+
end
|
25
|
+
alias_method :eql?, :==
|
26
|
+
|
27
|
+
def hash
|
28
|
+
[self.class, raw].hash
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Code
|
2
|
+
class Object
|
3
|
+
class Integer < ::Code::Object
|
4
|
+
attr_reader :raw
|
5
|
+
|
6
|
+
def initialize(whole, exponent: nil)
|
7
|
+
@raw = whole.to_i
|
8
|
+
@raw = @raw * 10**exponent.raw if exponent
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
raw.to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def inspect
|
16
|
+
to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
def ==(other)
|
20
|
+
raw == other.raw
|
21
|
+
end
|
22
|
+
alias_method :eql?, :==
|
23
|
+
|
24
|
+
def hash
|
25
|
+
[self.class, raw].hash
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class Code
|
2
|
+
class Object
|
3
|
+
class List < ::Code::Object
|
4
|
+
attr_reader :raw
|
5
|
+
|
6
|
+
def initialize(raw)
|
7
|
+
@raw = raw
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
"[#{raw.map(&:inspect).join(", ")}]"
|
12
|
+
end
|
13
|
+
|
14
|
+
def inspect
|
15
|
+
to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
def map(&block)
|
19
|
+
@raw = raw.map(&block)
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def join
|
24
|
+
raw.join
|
25
|
+
end
|
26
|
+
|
27
|
+
def ==(other)
|
28
|
+
raw == other.raw
|
29
|
+
end
|
30
|
+
alias_method :eql?, :==
|
31
|
+
|
32
|
+
def hash
|
33
|
+
[self.class, raw].hash
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Code
|
2
|
+
class Object
|
3
|
+
class Nothing < ::Code::Object
|
4
|
+
def to_s
|
5
|
+
""
|
6
|
+
end
|
7
|
+
|
8
|
+
def inspect
|
9
|
+
"nothing"
|
10
|
+
end
|
11
|
+
|
12
|
+
def ==(other)
|
13
|
+
other.is_a?(::Code::Object::Nothing)
|
14
|
+
end
|
15
|
+
alias_method :eql?, :==
|
16
|
+
|
17
|
+
def hash
|
18
|
+
[self.class, nil].hash
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "bigdecimal"
|
2
|
+
|
3
|
+
class Code
|
4
|
+
class Object
|
5
|
+
class String < ::Code::Object
|
6
|
+
attr_reader :raw
|
7
|
+
|
8
|
+
def initialize(string)
|
9
|
+
@raw = string
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_s
|
13
|
+
raw
|
14
|
+
end
|
15
|
+
|
16
|
+
def inspect
|
17
|
+
raw.inspect
|
18
|
+
end
|
19
|
+
|
20
|
+
def ==(other)
|
21
|
+
raw == other.raw
|
22
|
+
end
|
23
|
+
alias_method :eql?, :==
|
24
|
+
|
25
|
+
def hash
|
26
|
+
[self.class, raw].hash
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|