template-ruby 0.1.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 +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
|