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.
- checksums.yaml +7 -0
- data/.editorconfig +9 -0
- data/.github/workflows/rspec.yml +14 -0
- data/.gitignore +2 -0
- data/.prettierrc +3 -0
- data/.rspec +1 -0
- data/CHANGELOG.md +55 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +48 -0
- data/LICENSE +7 -0
- data/README.md +103 -0
- data/TODO +17 -0
- data/bin/code +76 -0
- data/bin/format +3 -0
- data/bin/template +85 -0
- data/bin/test +17 -0
- data/code-ruby.gemspec +17 -0
- data/docs/class.code +9 -0
- data/docs/euler/1.template +10 -0
- data/docs/euler/2.template +16 -0
- data/docs/euler/3.template +16 -0
- data/docs/euler/4.template +10 -0
- data/docs/euler/5.template +13 -0
- data/docs/fibonnaci.template +14 -0
- data/docs/meetup.code +12 -0
- data/docs/precedence.template +36 -0
- data/docs/rain.code +22 -0
- data/docs/slack.code +17 -0
- data/docs/stripe.code +7 -0
- data/docs/twitter.code +9 -0
- data/language-ruby.gemspec +18 -0
- data/lib/code/error.rb +18 -0
- data/lib/code/node/base_10.rb +29 -0
- data/lib/code/node/base_16.rb +13 -0
- data/lib/code/node/base_2.rb +13 -0
- data/lib/code/node/base_8.rb +13 -0
- data/lib/code/node/boolean.rb +22 -0
- data/lib/code/node/call.rb +47 -0
- data/lib/code/node/call_argument.rb +21 -0
- data/lib/code/node/chained_call.rb +23 -0
- data/lib/code/node/code.rb +20 -0
- data/lib/code/node/decimal.rb +26 -0
- data/lib/code/node/dictionnary.rb +33 -0
- data/lib/code/node/equal.rb +34 -0
- data/lib/code/node/function.rb +20 -0
- data/lib/code/node/function_parameter.rb +31 -0
- data/lib/code/node/if.rb +59 -0
- data/lib/code/node/if_modifier.rb +47 -0
- data/lib/code/node/list.rb +16 -0
- data/lib/code/node/negation.rb +15 -0
- data/lib/code/node/not.rb +15 -0
- data/lib/code/node/nothing.rb +12 -0
- data/lib/code/node/number.rb +25 -0
- data/lib/code/node/operation.rb +38 -0
- data/lib/code/node/power.rb +20 -0
- data/lib/code/node/rescue.rb +17 -0
- data/lib/code/node/splat.rb +15 -0
- data/lib/code/node/statement.rb +59 -0
- data/lib/code/node/string.rb +53 -0
- data/lib/code/node/ternary.rb +24 -0
- data/lib/code/node/unary_minus.rb +15 -0
- data/lib/code/node/while.rb +35 -0
- data/lib/code/node.rb +13 -0
- data/lib/code/object/argument.rb +32 -0
- data/lib/code/object/boolean.rb +27 -0
- data/lib/code/object/decimal.rb +162 -0
- data/lib/code/object/dictionnary.rb +96 -0
- data/lib/code/object/function.rb +64 -0
- data/lib/code/object/global.rb +42 -0
- data/lib/code/object/integer.rb +221 -0
- data/lib/code/object/list.rb +200 -0
- data/lib/code/object/nothing.rb +23 -0
- data/lib/code/object/number.rb +6 -0
- data/lib/code/object/range.rb +146 -0
- data/lib/code/object/ruby_function.rb +31 -0
- data/lib/code/object/string.rb +88 -0
- data/lib/code/object.rb +197 -0
- data/lib/code/parser/addition.rb +21 -0
- data/lib/code/parser/and_operator.rb +17 -0
- data/lib/code/parser/bitwise_and.rb +17 -0
- data/lib/code/parser/bitwise_or.rb +21 -0
- data/lib/code/parser/boolean.rb +17 -0
- data/lib/code/parser/call.rb +122 -0
- data/lib/code/parser/chained_call.rb +47 -0
- data/lib/code/parser/class.rb +45 -0
- data/lib/code/parser/code.rb +25 -0
- data/lib/code/parser/dictionnary.rb +67 -0
- data/lib/code/parser/equal.rb +94 -0
- data/lib/code/parser/equality.rb +35 -0
- data/lib/code/parser/equality_lower.rb +9 -0
- data/lib/code/parser/function.rb +85 -0
- data/lib/code/parser/greater.rb +25 -0
- data/lib/code/parser/group.rb +22 -0
- data/lib/code/parser/if.rb +63 -0
- data/lib/code/parser/if_modifier.rb +55 -0
- data/lib/code/parser/list.rb +42 -0
- data/lib/code/parser/multiplication.rb +25 -0
- data/lib/code/parser/name.rb +101 -0
- data/lib/code/parser/negation.rb +30 -0
- data/lib/code/parser/not_keyword.rb +23 -0
- data/lib/code/parser/nothing.rb +22 -0
- data/lib/code/parser/number.rb +154 -0
- data/lib/code/parser/operation.rb +35 -0
- data/lib/code/parser/or_keyword.rb +21 -0
- data/lib/code/parser/or_operator.rb +17 -0
- data/lib/code/parser/power.rb +43 -0
- data/lib/code/parser/range.rb +17 -0
- data/lib/code/parser/rescue.rb +39 -0
- data/lib/code/parser/shift.rb +21 -0
- data/lib/code/parser/splat.rb +31 -0
- data/lib/code/parser/statement.rb +9 -0
- data/lib/code/parser/string.rb +78 -0
- data/lib/code/parser/ternary.rb +46 -0
- data/lib/code/parser/unary_minus.rb +31 -0
- data/lib/code/parser/while.rb +36 -0
- data/lib/code/parser/whitespace.rb +49 -0
- data/lib/code/parser.rb +19 -0
- data/lib/code/ruby.rb +162 -0
- data/lib/code-ruby.rb +10 -0
- data/lib/code.rb +47 -0
- data/lib/language/atom.rb +343 -0
- data/lib/language/output.rb +130 -0
- data/lib/language/parser/absent/present.rb +8 -0
- data/lib/language/parser/absent.rb +6 -0
- data/lib/language/parser/end_of_input.rb +6 -0
- data/lib/language/parser/interuption.rb +38 -0
- data/lib/language/parser/not_end_of_input.rb +6 -0
- data/lib/language/parser/str/not_found.rb +16 -0
- data/lib/language/parser/str.rb +6 -0
- data/lib/language/parser.rb +53 -0
- data/lib/language-ruby.rb +10 -0
- data/lib/language.rb +80 -0
- data/lib/template/node/code_part.rb +13 -0
- data/lib/template/node/part.rb +19 -0
- data/lib/template/node/template.rb +15 -0
- data/lib/template/node/text_part.rb +13 -0
- data/lib/template/node.rb +4 -0
- data/lib/template/parser/template.rb +39 -0
- data/lib/template/parser.rb +19 -0
- data/lib/template/version.rb +3 -0
- data/lib/template-ruby.rb +10 -0
- data/lib/template.rb +50 -0
- data/spec/code/addition_spec.rb +13 -0
- data/spec/code/and_operator_spec.rb +13 -0
- data/spec/code/bitwise_and_spec.rb +13 -0
- data/spec/code/bitwise_or_spec.rb +13 -0
- data/spec/code/boolean_spec.rb +13 -0
- data/spec/code/call_spec.rb +21 -0
- data/spec/code/chained_call_spec.rb +16 -0
- data/spec/code/dictionnary_spec.rb +17 -0
- data/spec/code/equal_spec.rb +26 -0
- data/spec/code/equality_spec.rb +13 -0
- data/spec/code/function_spec.rb +18 -0
- data/spec/code/greater_spec.rb +18 -0
- data/spec/code/group_spec.rb +12 -0
- data/spec/code/if_modifier_spec.rb +20 -0
- data/spec/code/if_spec.rb +25 -0
- data/spec/code/list_spec.rb +17 -0
- data/spec/code/multiplication_spec.rb +18 -0
- data/spec/code/negation_spec.rb +20 -0
- data/spec/code/not_keyword_spec.rb +13 -0
- data/spec/code/nothing_spec.rb +17 -0
- data/spec/code/number_spec.rb +22 -0
- data/spec/code/or_keyword_spec.rb +17 -0
- data/spec/code/or_operator_spec.rb +16 -0
- data/spec/code/parser/boolean_spec.rb +16 -0
- data/spec/code/parser/call_spec.rb +26 -0
- data/spec/code/parser/chained_call.rb +17 -0
- data/spec/code/parser/dictionnary_spec.rb +18 -0
- data/spec/code/parser/function_spec.rb +16 -0
- data/spec/code/parser/group_spec.rb +18 -0
- data/spec/code/parser/list_spec.rb +18 -0
- data/spec/code/parser/number_spec.rb +12 -0
- data/spec/code/parser/string_spec.rb +21 -0
- data/spec/code/parser_spec.rb +23 -0
- data/spec/code/power_spec.rb +13 -0
- data/spec/code/range_spec.rb +16 -0
- data/spec/code/rescue_spec.rb +13 -0
- data/spec/code/shift_spec.rb +13 -0
- data/spec/code/splat_spec.rb +13 -0
- data/spec/code/string_spec.rb +25 -0
- data/spec/code/ternary_spec.rb +18 -0
- data/spec/code/unary_minus_spec.rb +13 -0
- data/spec/code/while_spec.rb +18 -0
- data/spec/spec_helper.rb +6 -0
- data/template-ruby.gemspec +19 -0
- 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,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,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,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
|
data/lib/code/parser.rb
ADDED
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
|