language-ruby 0.5.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 (187) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +9 -0
  3. data/.github/workflows/rspec.yml +14 -0
  4. data/.gitignore +2 -0
  5. data/.prettierrc +3 -0
  6. data/.rspec +1 -0
  7. data/CHANGELOG.md +55 -0
  8. data/Gemfile +8 -0
  9. data/Gemfile.lock +48 -0
  10. data/LICENSE +7 -0
  11. data/README.md +103 -0
  12. data/TODO +17 -0
  13. data/bin/code +76 -0
  14. data/bin/format +3 -0
  15. data/bin/template +85 -0
  16. data/bin/test +17 -0
  17. data/code-ruby.gemspec +17 -0
  18. data/docs/class.code +9 -0
  19. data/docs/euler/1.template +10 -0
  20. data/docs/euler/2.template +16 -0
  21. data/docs/euler/3.template +16 -0
  22. data/docs/euler/4.template +10 -0
  23. data/docs/euler/5.template +13 -0
  24. data/docs/fibonnaci.template +14 -0
  25. data/docs/meetup.code +12 -0
  26. data/docs/precedence.template +36 -0
  27. data/docs/rain.code +22 -0
  28. data/docs/slack.code +17 -0
  29. data/docs/stripe.code +7 -0
  30. data/docs/twitter.code +9 -0
  31. data/language-ruby.gemspec +18 -0
  32. data/lib/code/error.rb +18 -0
  33. data/lib/code/node/base_10.rb +29 -0
  34. data/lib/code/node/base_16.rb +13 -0
  35. data/lib/code/node/base_2.rb +13 -0
  36. data/lib/code/node/base_8.rb +13 -0
  37. data/lib/code/node/boolean.rb +22 -0
  38. data/lib/code/node/call.rb +47 -0
  39. data/lib/code/node/call_argument.rb +21 -0
  40. data/lib/code/node/chained_call.rb +23 -0
  41. data/lib/code/node/code.rb +20 -0
  42. data/lib/code/node/decimal.rb +26 -0
  43. data/lib/code/node/dictionnary.rb +33 -0
  44. data/lib/code/node/equal.rb +34 -0
  45. data/lib/code/node/function.rb +20 -0
  46. data/lib/code/node/function_parameter.rb +31 -0
  47. data/lib/code/node/if.rb +59 -0
  48. data/lib/code/node/if_modifier.rb +47 -0
  49. data/lib/code/node/list.rb +16 -0
  50. data/lib/code/node/negation.rb +15 -0
  51. data/lib/code/node/not.rb +15 -0
  52. data/lib/code/node/nothing.rb +12 -0
  53. data/lib/code/node/number.rb +25 -0
  54. data/lib/code/node/operation.rb +38 -0
  55. data/lib/code/node/power.rb +20 -0
  56. data/lib/code/node/rescue.rb +17 -0
  57. data/lib/code/node/splat.rb +15 -0
  58. data/lib/code/node/statement.rb +59 -0
  59. data/lib/code/node/string.rb +53 -0
  60. data/lib/code/node/ternary.rb +24 -0
  61. data/lib/code/node/unary_minus.rb +15 -0
  62. data/lib/code/node/while.rb +35 -0
  63. data/lib/code/node.rb +13 -0
  64. data/lib/code/object/argument.rb +32 -0
  65. data/lib/code/object/boolean.rb +27 -0
  66. data/lib/code/object/decimal.rb +162 -0
  67. data/lib/code/object/dictionnary.rb +96 -0
  68. data/lib/code/object/function.rb +64 -0
  69. data/lib/code/object/global.rb +42 -0
  70. data/lib/code/object/integer.rb +221 -0
  71. data/lib/code/object/list.rb +200 -0
  72. data/lib/code/object/nothing.rb +23 -0
  73. data/lib/code/object/number.rb +6 -0
  74. data/lib/code/object/range.rb +146 -0
  75. data/lib/code/object/ruby_function.rb +31 -0
  76. data/lib/code/object/string.rb +88 -0
  77. data/lib/code/object.rb +197 -0
  78. data/lib/code/parser/addition.rb +21 -0
  79. data/lib/code/parser/and_operator.rb +17 -0
  80. data/lib/code/parser/bitwise_and.rb +17 -0
  81. data/lib/code/parser/bitwise_or.rb +21 -0
  82. data/lib/code/parser/boolean.rb +17 -0
  83. data/lib/code/parser/call.rb +122 -0
  84. data/lib/code/parser/chained_call.rb +47 -0
  85. data/lib/code/parser/class.rb +45 -0
  86. data/lib/code/parser/code.rb +25 -0
  87. data/lib/code/parser/dictionnary.rb +67 -0
  88. data/lib/code/parser/equal.rb +94 -0
  89. data/lib/code/parser/equality.rb +35 -0
  90. data/lib/code/parser/equality_lower.rb +9 -0
  91. data/lib/code/parser/function.rb +85 -0
  92. data/lib/code/parser/greater.rb +25 -0
  93. data/lib/code/parser/group.rb +22 -0
  94. data/lib/code/parser/if.rb +63 -0
  95. data/lib/code/parser/if_modifier.rb +55 -0
  96. data/lib/code/parser/list.rb +42 -0
  97. data/lib/code/parser/multiplication.rb +25 -0
  98. data/lib/code/parser/name.rb +101 -0
  99. data/lib/code/parser/negation.rb +30 -0
  100. data/lib/code/parser/not_keyword.rb +23 -0
  101. data/lib/code/parser/nothing.rb +22 -0
  102. data/lib/code/parser/number.rb +154 -0
  103. data/lib/code/parser/operation.rb +35 -0
  104. data/lib/code/parser/or_keyword.rb +21 -0
  105. data/lib/code/parser/or_operator.rb +17 -0
  106. data/lib/code/parser/power.rb +43 -0
  107. data/lib/code/parser/range.rb +17 -0
  108. data/lib/code/parser/rescue.rb +39 -0
  109. data/lib/code/parser/shift.rb +21 -0
  110. data/lib/code/parser/splat.rb +31 -0
  111. data/lib/code/parser/statement.rb +9 -0
  112. data/lib/code/parser/string.rb +78 -0
  113. data/lib/code/parser/ternary.rb +46 -0
  114. data/lib/code/parser/unary_minus.rb +31 -0
  115. data/lib/code/parser/while.rb +36 -0
  116. data/lib/code/parser/whitespace.rb +49 -0
  117. data/lib/code/parser.rb +19 -0
  118. data/lib/code/ruby.rb +162 -0
  119. data/lib/code-ruby.rb +10 -0
  120. data/lib/code.rb +47 -0
  121. data/lib/language/atom.rb +343 -0
  122. data/lib/language/output.rb +130 -0
  123. data/lib/language/parser/absent/present.rb +8 -0
  124. data/lib/language/parser/absent.rb +6 -0
  125. data/lib/language/parser/end_of_input.rb +6 -0
  126. data/lib/language/parser/interuption.rb +38 -0
  127. data/lib/language/parser/not_end_of_input.rb +6 -0
  128. data/lib/language/parser/str/not_found.rb +16 -0
  129. data/lib/language/parser/str.rb +6 -0
  130. data/lib/language/parser.rb +53 -0
  131. data/lib/language-ruby.rb +10 -0
  132. data/lib/language.rb +80 -0
  133. data/lib/template/node/code_part.rb +13 -0
  134. data/lib/template/node/part.rb +19 -0
  135. data/lib/template/node/template.rb +15 -0
  136. data/lib/template/node/text_part.rb +13 -0
  137. data/lib/template/node.rb +4 -0
  138. data/lib/template/parser/template.rb +39 -0
  139. data/lib/template/parser.rb +19 -0
  140. data/lib/template/version.rb +3 -0
  141. data/lib/template-ruby.rb +10 -0
  142. data/lib/template.rb +50 -0
  143. data/spec/code/addition_spec.rb +13 -0
  144. data/spec/code/and_operator_spec.rb +13 -0
  145. data/spec/code/bitwise_and_spec.rb +13 -0
  146. data/spec/code/bitwise_or_spec.rb +13 -0
  147. data/spec/code/boolean_spec.rb +13 -0
  148. data/spec/code/call_spec.rb +21 -0
  149. data/spec/code/chained_call_spec.rb +16 -0
  150. data/spec/code/dictionnary_spec.rb +17 -0
  151. data/spec/code/equal_spec.rb +26 -0
  152. data/spec/code/equality_spec.rb +13 -0
  153. data/spec/code/function_spec.rb +18 -0
  154. data/spec/code/greater_spec.rb +18 -0
  155. data/spec/code/group_spec.rb +12 -0
  156. data/spec/code/if_modifier_spec.rb +20 -0
  157. data/spec/code/if_spec.rb +25 -0
  158. data/spec/code/list_spec.rb +17 -0
  159. data/spec/code/multiplication_spec.rb +18 -0
  160. data/spec/code/negation_spec.rb +20 -0
  161. data/spec/code/not_keyword_spec.rb +13 -0
  162. data/spec/code/nothing_spec.rb +17 -0
  163. data/spec/code/number_spec.rb +22 -0
  164. data/spec/code/or_keyword_spec.rb +17 -0
  165. data/spec/code/or_operator_spec.rb +16 -0
  166. data/spec/code/parser/boolean_spec.rb +16 -0
  167. data/spec/code/parser/call_spec.rb +26 -0
  168. data/spec/code/parser/chained_call.rb +17 -0
  169. data/spec/code/parser/dictionnary_spec.rb +18 -0
  170. data/spec/code/parser/function_spec.rb +16 -0
  171. data/spec/code/parser/group_spec.rb +18 -0
  172. data/spec/code/parser/list_spec.rb +18 -0
  173. data/spec/code/parser/number_spec.rb +12 -0
  174. data/spec/code/parser/string_spec.rb +21 -0
  175. data/spec/code/parser_spec.rb +23 -0
  176. data/spec/code/power_spec.rb +13 -0
  177. data/spec/code/range_spec.rb +16 -0
  178. data/spec/code/rescue_spec.rb +13 -0
  179. data/spec/code/shift_spec.rb +13 -0
  180. data/spec/code/splat_spec.rb +13 -0
  181. data/spec/code/string_spec.rb +25 -0
  182. data/spec/code/ternary_spec.rb +18 -0
  183. data/spec/code/unary_minus_spec.rb +13 -0
  184. data/spec/code/while_spec.rb +18 -0
  185. data/spec/spec_helper.rb +6 -0
  186. data/template-ruby.gemspec +19 -0
  187. metadata +284 -0
@@ -0,0 +1,35 @@
1
+ class Code
2
+ class Parser
3
+ class Operation < Language
4
+ def statement
5
+ raise NotImplementedError
6
+ end
7
+
8
+ def whitespace
9
+ ::Code::Parser::Whitespace
10
+ end
11
+
12
+ def whitespace?
13
+ whitespace.maybe
14
+ end
15
+
16
+ def operator
17
+ raise NotImplementedError
18
+ end
19
+
20
+ def root
21
+ (
22
+ statement.aka(:first) <<
23
+ (
24
+ whitespace? << operator.aka(:operator) << whitespace? <<
25
+ statement.aka(:statement)
26
+ ).repeat(1).aka(:others).maybe
27
+ )
28
+ .aka(:operation)
29
+ .then do |output|
30
+ output[:operation][:others] ? output : output[:operation][:first]
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,21 @@
1
+ class Code
2
+ class Parser
3
+ class OrKeyword < Operation
4
+ def statement
5
+ ::Code::Parser::NotKeyword
6
+ end
7
+
8
+ def or_keyword
9
+ str("or")
10
+ end
11
+
12
+ def and_keyword
13
+ str("and")
14
+ end
15
+
16
+ def operator
17
+ or_keyword | and_keyword
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ class Code
2
+ class Parser
3
+ class OrOperator < Operation
4
+ def statement
5
+ ::Code::Parser::AndOperator
6
+ end
7
+
8
+ def pipe
9
+ str("|")
10
+ end
11
+
12
+ def operator
13
+ pipe << pipe
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,43 @@
1
+ class Code
2
+ class Parser
3
+ class Power < Language
4
+ def power
5
+ ::Code::Parser::Power
6
+ end
7
+
8
+ def statement
9
+ ::Code::Parser::Negation
10
+ end
11
+
12
+ def whitespace
13
+ ::Code::Parser::Whitespace
14
+ end
15
+
16
+ def whitespace?
17
+ whitespace.maybe
18
+ end
19
+
20
+ def asterisk
21
+ str("*")
22
+ end
23
+
24
+ def operator
25
+ asterisk << asterisk
26
+ end
27
+
28
+ def root
29
+ (
30
+ statement.aka(:left) <<
31
+ (
32
+ whitespace? << operator.aka(:operator) << whitespace? <<
33
+ power.aka(:right)
34
+ ).maybe
35
+ )
36
+ .aka(:power)
37
+ .then do |output|
38
+ output[:power][:right] ? output : output[:power][:left]
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,17 @@
1
+ class Code
2
+ class Parser
3
+ class Range < Operation
4
+ def statement
5
+ ::Code::Parser::OrOperator
6
+ end
7
+
8
+ def dot
9
+ str(".")
10
+ end
11
+
12
+ def operator
13
+ (dot << dot << dot) | (dot << dot)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,39 @@
1
+ class Code
2
+ class Parser
3
+ class Rescue < Language
4
+ def statement
5
+ ::Code::Parser::Ternary
6
+ end
7
+
8
+ def rescue_class
9
+ ::Code::Parser::Rescue
10
+ end
11
+
12
+ def whitespace
13
+ ::Code::Parser::Whitespace
14
+ end
15
+
16
+ def whitespace?
17
+ whitespace.maybe
18
+ end
19
+
20
+ def rescue_keyword
21
+ str("rescue")
22
+ end
23
+
24
+ def root
25
+ (
26
+ statement.aka(:left) <<
27
+ (
28
+ whitespace? << rescue_keyword << whitespace? <<
29
+ rescue_class.aka(:right)
30
+ ).maybe
31
+ )
32
+ .aka(:rescue)
33
+ .then do |output|
34
+ output[:rescue][:right] ? output : output[:rescue][:left]
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,21 @@
1
+ class Code
2
+ class Parser
3
+ class Shift < Operation
4
+ def statement
5
+ ::Code::Parser::Addition
6
+ end
7
+
8
+ def greater
9
+ str(">")
10
+ end
11
+
12
+ def lesser
13
+ str("<")
14
+ end
15
+
16
+ def operator
17
+ (greater << greater) | (lesser << lesser)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ class Code
2
+ class Parser
3
+ class Splat < Language
4
+ def statement
5
+ ::Code::Parser::Class
6
+ end
7
+
8
+ def splat
9
+ ::Code::Parser::Splat
10
+ end
11
+
12
+ def whitespace
13
+ ::Code::Parser::Whitespace
14
+ end
15
+
16
+ def whitespace?
17
+ whitespace.maybe
18
+ end
19
+
20
+ def ampersand
21
+ str("&")
22
+ end
23
+
24
+ def root
25
+ (ampersand.aka(:operator) << whitespace? << splat.aka(:right)).aka(
26
+ :splat
27
+ ) | statement
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,9 @@
1
+ class Code
2
+ class Parser
3
+ class Statement < Language
4
+ def root
5
+ ::Code::Parser::Equality
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,78 @@
1
+ class Code
2
+ class Parser
3
+ class String < Language
4
+ def code
5
+ ::Code::Parser::Code
6
+ end
7
+
8
+ def name
9
+ ::Code::Parser::Name
10
+ end
11
+
12
+ def single_quote
13
+ str("'")
14
+ end
15
+
16
+ def double_quote
17
+ str('"')
18
+ end
19
+
20
+ def backslash
21
+ str("\\")
22
+ end
23
+
24
+ def opening_curly_bracket
25
+ str("{")
26
+ end
27
+
28
+ def closing_curly_bracket
29
+ str("}")
30
+ end
31
+
32
+ def colon
33
+ str(":")
34
+ end
35
+
36
+ def code_part
37
+ opening_curly_bracket << code << closing_curly_bracket.maybe
38
+ end
39
+
40
+ def single_quoted_text_part
41
+ (
42
+ backslash.ignore << opening_curly_bracket |
43
+ backslash.ignore << single_quote |
44
+ single_quote.absent << opening_curly_bracket.absent << any
45
+ ).repeat(1)
46
+ end
47
+
48
+ def double_quoted_text_part
49
+ (
50
+ backslash.ignore << opening_curly_bracket |
51
+ backslash.ignore << double_quote |
52
+ double_quote.absent << opening_curly_bracket.absent << any
53
+ ).repeat(1)
54
+ end
55
+
56
+ def single_quoted_string
57
+ single_quote.ignore <<
58
+ (code_part.aka(:code) | single_quoted_text_part.aka(:text)).repeat <<
59
+ single_quote.ignore.maybe
60
+ end
61
+
62
+ def double_quoted_string
63
+ double_quote.ignore <<
64
+ (code_part.aka(:code) | double_quoted_text_part.aka(:text)).repeat <<
65
+ double_quote.ignore.maybe
66
+ end
67
+
68
+ def symbol
69
+ (colon.ignore << name).aka(:text).repeat(1, 1)
70
+ end
71
+
72
+ def root
73
+ (single_quoted_string | double_quoted_string | symbol).aka(:string) |
74
+ ::Code::Parser::Number
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,46 @@
1
+ class Code
2
+ class Parser
3
+ class Ternary < Language
4
+ def statement
5
+ ::Code::Parser::Range
6
+ end
7
+
8
+ def ternary
9
+ ::Code::Parser::Ternary
10
+ end
11
+
12
+ def whitespace
13
+ ::Code::Parser::Whitespace
14
+ end
15
+
16
+ def whitespace?
17
+ whitespace.maybe
18
+ end
19
+
20
+ def question_mark
21
+ str("?")
22
+ end
23
+
24
+ def colon
25
+ str(":")
26
+ end
27
+
28
+ def root
29
+ (
30
+ statement.aka(:left) <<
31
+ (
32
+ whitespace? << question_mark << whitespace? <<
33
+ ternary.aka(:middle) <<
34
+ (
35
+ whitespace? << colon << whitespace? << ternary.aka(:right)
36
+ ).maybe
37
+ ).maybe
38
+ )
39
+ .aka(:ternary)
40
+ .then do |output|
41
+ output[:ternary][:middle] ? output : output[:ternary][:left]
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,31 @@
1
+ class Code
2
+ class Parser
3
+ class UnaryMinus < Language
4
+ def unary_minus
5
+ ::Code::Parser::UnaryMinus
6
+ end
7
+
8
+ def whitespace
9
+ ::Code::Parser::Whitespace
10
+ end
11
+
12
+ def whitespace?
13
+ whitespace.maybe
14
+ end
15
+
16
+ def minus
17
+ str("-")
18
+ end
19
+
20
+ def operator
21
+ minus
22
+ end
23
+
24
+ def root
25
+ (operator.aka(:operator) << whitespace? << unary_minus.aka(:right)).aka(
26
+ :unary_minus
27
+ ) | ::Code::Parser::Power
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,36 @@
1
+ class Code
2
+ class Parser
3
+ class While < Language
4
+ def statement
5
+ ::Code::Parser::If
6
+ end
7
+
8
+ def whitespace
9
+ ::Code::Parser::Whitespace
10
+ end
11
+
12
+ def code
13
+ ::Code::Parser::Code
14
+ end
15
+
16
+ def while_keyword
17
+ str("while")
18
+ end
19
+
20
+ def until_keyword
21
+ str("until")
22
+ end
23
+
24
+ def end_keyword
25
+ str("end")
26
+ end
27
+
28
+ def root
29
+ (
30
+ (while_keyword | until_keyword).aka(:operator) << whitespace <<
31
+ statement.aka(:statement) << code.aka(:body) << end_keyword.maybe
32
+ ).aka(:while) | statement
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,49 @@
1
+ class Code
2
+ class Parser
3
+ class Whitespace < Language
4
+ def space
5
+ str(" ")
6
+ end
7
+
8
+ def newline
9
+ str("\n")
10
+ end
11
+
12
+ def hashtag
13
+ str("#")
14
+ end
15
+
16
+ def slash
17
+ str("/")
18
+ end
19
+
20
+ def asterisk
21
+ str("*")
22
+ end
23
+
24
+ def hash_comment
25
+ hashtag << (newline.absent << any).repeat << newline.maybe
26
+ end
27
+
28
+ def double_slash_comment
29
+ slash << slash << (newline.absent << any).repeat << newline.maybe
30
+ end
31
+
32
+ def multi_line_comment
33
+ slash << asterisk << ((asterisk << slash).absent << any).repeat <<
34
+ asterisk.maybe << slash.maybe
35
+ end
36
+
37
+ def without_newline
38
+ (space | multi_line_comment).repeat(1)
39
+ end
40
+
41
+ def root
42
+ (
43
+ space | newline | hash_comment | double_slash_comment |
44
+ multi_line_comment
45
+ ).repeat(1)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,19 @@
1
+ class Code
2
+ class Parser
3
+ def initialize(input)
4
+ @input = input
5
+ end
6
+
7
+ def self.parse(input)
8
+ new(input).parse
9
+ end
10
+
11
+ def parse
12
+ ::Code::Parser::Code.parse(input)
13
+ end
14
+
15
+ private
16
+
17
+ attr_reader :input
18
+ end
19
+ end
data/lib/code/ruby.rb ADDED
@@ -0,0 +1,162 @@
1
+ class Code
2
+ class Ruby
3
+ def initialize(raw = {})
4
+ @raw = raw
5
+ end
6
+
7
+ def self.to_code(raw)
8
+ new(raw).to_code
9
+ end
10
+
11
+ def self.from_code(raw)
12
+ new(raw).from_code
13
+ end
14
+
15
+ def to_code
16
+ if code?
17
+ raw
18
+ elsif true?
19
+ ::Code::Object::Boolean.new(raw)
20
+ elsif false?
21
+ ::Code::Object::Boolean.new(raw)
22
+ elsif string?
23
+ ::Code::Object::String.new(raw)
24
+ elsif symbol?
25
+ ::Code::Object::String.new(raw.to_s)
26
+ elsif integer?
27
+ ::Code::Object::Integer.new(raw)
28
+ elsif float?
29
+ ::Code::Object::Decimal.new(raw.to_s)
30
+ elsif big_decimal?
31
+ ::Code::Object::Decimal.new(raw)
32
+ elsif hash?
33
+ ::Code::Object::Dictionnary.new(
34
+ raw
35
+ .map do |key, value|
36
+ [::Code::Ruby.to_code(key), ::Code::Ruby.to_code(value)]
37
+ end
38
+ .to_h
39
+ )
40
+ elsif array?
41
+ ::Code::Object::List.new(
42
+ raw.map { |element| ::Code::Ruby.to_code(key) }
43
+ )
44
+ elsif proc?
45
+ ::Code::Object::RubyFunction.new(raw)
46
+ else
47
+ raise "Unsupported class #{raw.class} for Ruby to Code conversion"
48
+ end
49
+ end
50
+
51
+ def from_code
52
+ if code?
53
+ if code_boolean?
54
+ raw.raw
55
+ elsif code_decimal?
56
+ raw.raw
57
+ elsif code_integer?
58
+ raw.raw
59
+ elsif code_nothing?
60
+ raw.raw
61
+ elsif code_range?
62
+ raw.raw
63
+ elsif code_string?
64
+ raw.raw
65
+ elsif code_dictionnary?
66
+ raw
67
+ .raw
68
+ .map do |key, value|
69
+ [::Code::Ruby.to_code(key), ::Code::Ruby.to_code(value)]
70
+ end
71
+ .to_h
72
+ elsif code_list?
73
+ raw.raw.map { |element| ::Code::Ruby.to_code(element) }
74
+ else
75
+ raise "Unsupported class #{raw.class} for Code to Ruby conversion"
76
+ end
77
+ else
78
+ raw
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ attr_reader :raw
85
+
86
+ def code?
87
+ raw.is_a?(::Code::Object)
88
+ end
89
+
90
+ def true?
91
+ raw.is_a?(::TrueClass)
92
+ end
93
+
94
+ def false?
95
+ raw.is_a?(::FalseClass)
96
+ end
97
+
98
+ def hash?
99
+ raw.is_a?(::Hash)
100
+ end
101
+
102
+ def array?
103
+ raw.is_a?(::Array)
104
+ end
105
+
106
+ def string?
107
+ raw.is_a?(::String)
108
+ end
109
+
110
+ def symbol?
111
+ raw.is_a?(::Symbol)
112
+ end
113
+
114
+ def integer?
115
+ raw.is_a?(::Integer)
116
+ end
117
+
118
+ def float?
119
+ raw.is_a?(::Float)
120
+ end
121
+
122
+ def big_decimal?
123
+ raw.is_a?(::BigDecimal)
124
+ end
125
+
126
+ def proc?
127
+ raw.is_a?(::Proc)
128
+ end
129
+
130
+ def code_boolean?
131
+ raw.is_a?(::Code::Object::Boolean)
132
+ end
133
+
134
+ def code_decimal?
135
+ raw.is_a?(::Code::Object::Decimal)
136
+ end
137
+
138
+ def code_integer?
139
+ raw.is_a?(::Code::Object::Integer)
140
+ end
141
+
142
+ def code_nothing?
143
+ raw.is_a?(::Code::Object::Nothing)
144
+ end
145
+
146
+ def code_range?
147
+ raw.is_a?(::Code::Object::Range)
148
+ end
149
+
150
+ def code_string?
151
+ raw.is_a?(::Code::Object::String)
152
+ end
153
+
154
+ def code_dictionnary?
155
+ raw.is_a?(::Code::Object::Dictionnary)
156
+ end
157
+
158
+ def code_list?
159
+ raw.is_a?(::Code::Object::List)
160
+ end
161
+ end
162
+ end
data/lib/code-ruby.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "bigdecimal"
2
+ require "stringio"
3
+ require "timeout"
4
+ require "zeitwerk"
5
+
6
+ loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
7
+ loader.ignore("#{__dir__}/template-ruby.rb")
8
+ loader.ignore("#{__dir__}/code-ruby.rb")
9
+ loader.ignore("#{__dir__}/language-ruby.rb")
10
+ loader.setup