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.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +70 -0
  6. data/lib/code/node/base_10_decimal.rb +27 -0
  7. data/lib/code/node/base_10_integer.rb +23 -0
  8. data/lib/code/node/base_10_number.rb +19 -0
  9. data/lib/code/node/base_16_number.rb +19 -0
  10. data/lib/code/node/base_2_number.rb +19 -0
  11. data/lib/code/node/base_8_number.rb +19 -0
  12. data/lib/code/node/boolean.rb +13 -0
  13. data/lib/code/node/call.rb +19 -0
  14. data/lib/code/node/code.rb +19 -0
  15. data/lib/code/node/dictionnary.rb +18 -0
  16. data/lib/code/node/dictionnary_key_value.rb +23 -0
  17. data/lib/code/node/list.rb +13 -0
  18. data/lib/code/node/name.rb +17 -0
  19. data/lib/code/node/nothing.rb +12 -0
  20. data/lib/code/node/number.rb +23 -0
  21. data/lib/code/node/statement.rb +31 -0
  22. data/lib/code/node/string.rb +17 -0
  23. data/lib/code/node.rb +4 -0
  24. data/lib/code/object/boolean.rb +28 -0
  25. data/lib/code/object/decimal.rb +31 -0
  26. data/lib/code/object/dictionnary.rb +32 -0
  27. data/lib/code/object/integer.rb +29 -0
  28. data/lib/code/object/list.rb +37 -0
  29. data/lib/code/object/nothing.rb +22 -0
  30. data/lib/code/object/string.rb +30 -0
  31. data/lib/code/object.rb +11 -0
  32. data/lib/code/parser/boolean.rb +14 -0
  33. data/lib/code/parser/call.rb +16 -0
  34. data/lib/code/parser/code.rb +18 -0
  35. data/lib/code/parser/dictionnary.rb +41 -0
  36. data/lib/code/parser/list.rb +29 -0
  37. data/lib/code/parser/name.rb +49 -0
  38. data/lib/code/parser/nothing.rb +17 -0
  39. data/lib/code/parser/number.rb +98 -0
  40. data/lib/code/parser/statement.rb +11 -0
  41. data/lib/code/parser/string.rb +66 -0
  42. data/lib/code/parser.rb +4 -0
  43. data/lib/code.rb +27 -0
  44. data/lib/template/node/code_part.rb +13 -0
  45. data/lib/template/node/part.rb +19 -0
  46. data/lib/template/node/template.rb +13 -0
  47. data/lib/template/node/text_part.rb +13 -0
  48. data/lib/template/node.rb +4 -0
  49. data/lib/template/parser/template.rb +26 -0
  50. data/lib/template/parser.rb +4 -0
  51. data/lib/template-ruby.rb +6 -0
  52. data/lib/template.rb +20 -0
  53. data/spec/code/parser/boolean_spec.rb +18 -0
  54. data/spec/code/parser/call_spec.rb +39 -0
  55. data/spec/code/parser/dictionnary_spec.rb +46 -0
  56. data/spec/code/parser/list_spec.rb +29 -0
  57. data/spec/code/parser/name_spec.rb +15 -0
  58. data/spec/code/parser/nothing_spec.rb +19 -0
  59. data/spec/code/parser/number_spec.rb +117 -0
  60. data/spec/code/parser/string_spec.rb +29 -0
  61. data/spec/code_spec.rb +35 -0
  62. data/spec/spec_helper.rb +1 -0
  63. data/spec/template/parser/template_spec.rb +19 -0
  64. data/spec/template_spec.rb +30 -0
  65. data/template-ruby.gemspec +20 -0
  66. 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
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
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,13 @@
1
+ class Code
2
+ class Node
3
+ class Boolean
4
+ def initialize(boolean)
5
+ @boolean = boolean == "true" ? true : false
6
+ end
7
+
8
+ def evaluate(_context)
9
+ ::Code::Object::Boolean.new(@boolean)
10
+ end
11
+ end
12
+ end
13
+ 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,17 @@
1
+ class Code
2
+ class Node
3
+ class Name
4
+ def initialize(name)
5
+ @name = name
6
+ end
7
+
8
+ def evaluate(context)
9
+ context.fetch(::Code::Object::String.new(name.to_s))
10
+ end
11
+
12
+ private
13
+
14
+ attr_reader :name
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ class Code
2
+ class Node
3
+ class Nothing
4
+ def initialize
5
+ end
6
+
7
+ def evaluate(_context)
8
+ ::Code::Object::Nothing.new
9
+ end
10
+ end
11
+ end
12
+ 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
@@ -0,0 +1,17 @@
1
+ class Code
2
+ class Node
3
+ class String
4
+ def initialize(string)
5
+ @string = string
6
+ end
7
+
8
+ def evaluate(context)
9
+ ::Code::Object::String.new(string.to_s)
10
+ end
11
+
12
+ private
13
+
14
+ attr_reader :string
15
+ end
16
+ end
17
+ end
data/lib/code/node.rb ADDED
@@ -0,0 +1,4 @@
1
+ class Code
2
+ class Node
3
+ end
4
+ end
@@ -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
@@ -0,0 +1,11 @@
1
+ class Code
2
+ class Object
3
+ def fetch(_key, default = ::Code::Object::Nothing.new)
4
+ default
5
+ end
6
+
7
+ def to_s
8
+ raise NotImplementedError
9
+ end
10
+ end
11
+ end