language-ruby 0.5.6 → 0.6.1

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 (203) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.ruby-version +1 -0
  4. data/.tool-versions +1 -1
  5. data/Gemfile +5 -4
  6. data/Gemfile.lock +12 -23
  7. data/README.md +2 -102
  8. data/language-ruby.gemspec +7 -5
  9. data/lib/language/atom/absent.rb +29 -0
  10. data/lib/language/atom/aka.rb +32 -0
  11. data/lib/language/atom/and.rb +32 -0
  12. data/lib/language/atom/any.rb +15 -0
  13. data/lib/language/atom/ignore.rb +27 -0
  14. data/lib/language/atom/maybe.rb +32 -0
  15. data/lib/language/atom/or.rb +46 -0
  16. data/lib/language/atom/repeat.rb +57 -0
  17. data/lib/language/atom/str.rb +21 -0
  18. data/lib/language/atom/then.rb +21 -0
  19. data/lib/language/atom.rb +10 -291
  20. data/lib/language/output.rb +13 -11
  21. data/lib/language/parser/absent/present.rb +2 -0
  22. data/lib/language/parser/absent.rb +2 -0
  23. data/lib/language/parser/end_of_input.rb +2 -0
  24. data/lib/language/parser/interuption.rb +2 -0
  25. data/lib/language/parser/not_end_of_input.rb +2 -0
  26. data/lib/language/parser/str/not_found.rb +2 -0
  27. data/lib/language/parser/str.rb +2 -0
  28. data/lib/language/parser.rb +10 -10
  29. data/lib/language/version.rb +5 -0
  30. data/lib/language-ruby.rb +2 -5
  31. data/lib/language.rb +9 -7
  32. data/spec/language_spec.rb +21 -0
  33. data/spec/spec_helper.rb +2 -5
  34. metadata +18 -218
  35. data/.cherry.js +0 -21
  36. data/.editorconfig +0 -9
  37. data/.github/workflows/rspec.yml +0 -14
  38. data/.prettierrc +0 -3
  39. data/CHANGELOG.md +0 -55
  40. data/LICENSE +0 -7
  41. data/TODO +0 -17
  42. data/bin/code +0 -76
  43. data/bin/format +0 -3
  44. data/bin/publish +0 -19
  45. data/bin/template +0 -85
  46. data/bin/test +0 -17
  47. data/code-ruby.gemspec +0 -17
  48. data/docs/class.code +0 -9
  49. data/docs/euler/1.template +0 -10
  50. data/docs/euler/2.template +0 -16
  51. data/docs/euler/3.template +0 -16
  52. data/docs/euler/4.template +0 -10
  53. data/docs/euler/5.template +0 -13
  54. data/docs/fibonnaci.template +0 -14
  55. data/docs/meetup.code +0 -12
  56. data/docs/precedence.template +0 -36
  57. data/docs/rain.code +0 -22
  58. data/docs/slack.code +0 -17
  59. data/docs/stripe.code +0 -7
  60. data/docs/twitter.code +0 -9
  61. data/lib/code/error.rb +0 -18
  62. data/lib/code/node/base_10.rb +0 -29
  63. data/lib/code/node/base_16.rb +0 -13
  64. data/lib/code/node/base_2.rb +0 -13
  65. data/lib/code/node/base_8.rb +0 -13
  66. data/lib/code/node/boolean.rb +0 -22
  67. data/lib/code/node/call.rb +0 -47
  68. data/lib/code/node/call_argument.rb +0 -21
  69. data/lib/code/node/chained_call.rb +0 -23
  70. data/lib/code/node/code.rb +0 -20
  71. data/lib/code/node/decimal.rb +0 -26
  72. data/lib/code/node/dictionnary.rb +0 -33
  73. data/lib/code/node/equal.rb +0 -34
  74. data/lib/code/node/function.rb +0 -20
  75. data/lib/code/node/function_parameter.rb +0 -31
  76. data/lib/code/node/if.rb +0 -59
  77. data/lib/code/node/if_modifier.rb +0 -47
  78. data/lib/code/node/list.rb +0 -16
  79. data/lib/code/node/negation.rb +0 -15
  80. data/lib/code/node/not.rb +0 -15
  81. data/lib/code/node/nothing.rb +0 -12
  82. data/lib/code/node/number.rb +0 -25
  83. data/lib/code/node/operation.rb +0 -38
  84. data/lib/code/node/power.rb +0 -20
  85. data/lib/code/node/rescue.rb +0 -17
  86. data/lib/code/node/splat.rb +0 -15
  87. data/lib/code/node/statement.rb +0 -59
  88. data/lib/code/node/string.rb +0 -53
  89. data/lib/code/node/ternary.rb +0 -24
  90. data/lib/code/node/unary_minus.rb +0 -15
  91. data/lib/code/node/while.rb +0 -35
  92. data/lib/code/node.rb +0 -13
  93. data/lib/code/object/argument.rb +0 -32
  94. data/lib/code/object/boolean.rb +0 -27
  95. data/lib/code/object/decimal.rb +0 -162
  96. data/lib/code/object/dictionnary.rb +0 -96
  97. data/lib/code/object/function.rb +0 -64
  98. data/lib/code/object/global.rb +0 -42
  99. data/lib/code/object/integer.rb +0 -221
  100. data/lib/code/object/list.rb +0 -207
  101. data/lib/code/object/nothing.rb +0 -23
  102. data/lib/code/object/number.rb +0 -6
  103. data/lib/code/object/range.rb +0 -146
  104. data/lib/code/object/ruby_function.rb +0 -31
  105. data/lib/code/object/string.rb +0 -102
  106. data/lib/code/object.rb +0 -197
  107. data/lib/code/parser/addition.rb +0 -21
  108. data/lib/code/parser/and_operator.rb +0 -17
  109. data/lib/code/parser/bitwise_and.rb +0 -17
  110. data/lib/code/parser/bitwise_or.rb +0 -21
  111. data/lib/code/parser/boolean.rb +0 -17
  112. data/lib/code/parser/call.rb +0 -122
  113. data/lib/code/parser/chained_call.rb +0 -47
  114. data/lib/code/parser/class.rb +0 -45
  115. data/lib/code/parser/code.rb +0 -25
  116. data/lib/code/parser/dictionnary.rb +0 -67
  117. data/lib/code/parser/equal.rb +0 -94
  118. data/lib/code/parser/equality.rb +0 -35
  119. data/lib/code/parser/equality_lower.rb +0 -9
  120. data/lib/code/parser/function.rb +0 -85
  121. data/lib/code/parser/greater.rb +0 -25
  122. data/lib/code/parser/group.rb +0 -22
  123. data/lib/code/parser/if.rb +0 -63
  124. data/lib/code/parser/if_modifier.rb +0 -55
  125. data/lib/code/parser/list.rb +0 -42
  126. data/lib/code/parser/multiplication.rb +0 -25
  127. data/lib/code/parser/name.rb +0 -107
  128. data/lib/code/parser/negation.rb +0 -30
  129. data/lib/code/parser/not_keyword.rb +0 -23
  130. data/lib/code/parser/nothing.rb +0 -22
  131. data/lib/code/parser/number.rb +0 -154
  132. data/lib/code/parser/operation.rb +0 -35
  133. data/lib/code/parser/or_keyword.rb +0 -21
  134. data/lib/code/parser/or_operator.rb +0 -17
  135. data/lib/code/parser/power.rb +0 -43
  136. data/lib/code/parser/range.rb +0 -17
  137. data/lib/code/parser/rescue.rb +0 -39
  138. data/lib/code/parser/shift.rb +0 -21
  139. data/lib/code/parser/splat.rb +0 -31
  140. data/lib/code/parser/statement.rb +0 -9
  141. data/lib/code/parser/string.rb +0 -78
  142. data/lib/code/parser/ternary.rb +0 -46
  143. data/lib/code/parser/unary_minus.rb +0 -31
  144. data/lib/code/parser/while.rb +0 -36
  145. data/lib/code/parser/whitespace.rb +0 -49
  146. data/lib/code/parser.rb +0 -19
  147. data/lib/code/ruby.rb +0 -174
  148. data/lib/code-ruby.rb +0 -10
  149. data/lib/code.rb +0 -47
  150. data/lib/template/node/code_part.rb +0 -13
  151. data/lib/template/node/part.rb +0 -19
  152. data/lib/template/node/template.rb +0 -15
  153. data/lib/template/node/text_part.rb +0 -13
  154. data/lib/template/node.rb +0 -4
  155. data/lib/template/parser/template.rb +0 -39
  156. data/lib/template/parser.rb +0 -19
  157. data/lib/template/version.rb +0 -3
  158. data/lib/template-ruby.rb +0 -10
  159. data/lib/template.rb +0 -50
  160. data/spec/code/addition_spec.rb +0 -13
  161. data/spec/code/and_operator_spec.rb +0 -13
  162. data/spec/code/bitwise_and_spec.rb +0 -13
  163. data/spec/code/bitwise_or_spec.rb +0 -13
  164. data/spec/code/boolean_spec.rb +0 -13
  165. data/spec/code/call_spec.rb +0 -21
  166. data/spec/code/chained_call_spec.rb +0 -16
  167. data/spec/code/code_spec.rb +0 -29
  168. data/spec/code/dictionnary_spec.rb +0 -17
  169. data/spec/code/equal_spec.rb +0 -26
  170. data/spec/code/equality_spec.rb +0 -13
  171. data/spec/code/function_spec.rb +0 -18
  172. data/spec/code/greater_spec.rb +0 -18
  173. data/spec/code/group_spec.rb +0 -12
  174. data/spec/code/if_modifier_spec.rb +0 -20
  175. data/spec/code/if_spec.rb +0 -25
  176. data/spec/code/list_spec.rb +0 -19
  177. data/spec/code/multiplication_spec.rb +0 -18
  178. data/spec/code/negation_spec.rb +0 -20
  179. data/spec/code/not_keyword_spec.rb +0 -13
  180. data/spec/code/nothing_spec.rb +0 -17
  181. data/spec/code/number_spec.rb +0 -22
  182. data/spec/code/or_keyword_spec.rb +0 -17
  183. data/spec/code/or_operator_spec.rb +0 -16
  184. data/spec/code/parser/boolean_spec.rb +0 -16
  185. data/spec/code/parser/call_spec.rb +0 -26
  186. data/spec/code/parser/chained_call.rb +0 -17
  187. data/spec/code/parser/dictionnary_spec.rb +0 -18
  188. data/spec/code/parser/function_spec.rb +0 -16
  189. data/spec/code/parser/group_spec.rb +0 -18
  190. data/spec/code/parser/list_spec.rb +0 -18
  191. data/spec/code/parser/number_spec.rb +0 -12
  192. data/spec/code/parser/string_spec.rb +0 -21
  193. data/spec/code/parser_spec.rb +0 -23
  194. data/spec/code/power_spec.rb +0 -13
  195. data/spec/code/range_spec.rb +0 -16
  196. data/spec/code/rescue_spec.rb +0 -13
  197. data/spec/code/shift_spec.rb +0 -13
  198. data/spec/code/splat_spec.rb +0 -13
  199. data/spec/code/string_spec.rb +0 -27
  200. data/spec/code/ternary_spec.rb +0 -18
  201. data/spec/code/unary_minus_spec.rb +0 -13
  202. data/spec/code/while_spec.rb +0 -18
  203. data/template-ruby.gemspec +0 -19
data/lib/code/ruby.rb DELETED
@@ -1,174 +0,0 @@
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 nil?
19
- ::Code::Object::Nothing.new
20
- elsif true?
21
- ::Code::Object::Boolean.new(raw)
22
- elsif false?
23
- ::Code::Object::Boolean.new(raw)
24
- elsif string?
25
- ::Code::Object::String.new(raw)
26
- elsif symbol?
27
- ::Code::Object::String.new(raw.to_s)
28
- elsif integer?
29
- ::Code::Object::Integer.new(raw)
30
- elsif float?
31
- ::Code::Object::Decimal.new(raw.to_s)
32
- elsif big_decimal?
33
- ::Code::Object::Decimal.new(raw)
34
- elsif hash?
35
- ::Code::Object::Dictionnary.new(
36
- raw
37
- .map do |key, value|
38
- [::Code::Ruby.to_code(key), ::Code::Ruby.to_code(value)]
39
- end
40
- .to_h
41
- )
42
- elsif array?
43
- ::Code::Object::List.new(
44
- raw.map { |element| ::Code::Ruby.to_code(element) }
45
- )
46
- elsif proc?
47
- ::Code::Object::RubyFunction.new(raw)
48
- else
49
- raise "Unsupported class #{raw.class} for Ruby to Code conversion"
50
- end
51
- end
52
-
53
- def from_code
54
- if code?
55
- if code_nothing?
56
- raw.raw
57
- elsif code_boolean?
58
- raw.raw
59
- elsif code_decimal?
60
- raw.raw
61
- elsif code_integer?
62
- raw.raw
63
- elsif code_nothing?
64
- raw.raw
65
- elsif code_range?
66
- raw.raw
67
- elsif code_string?
68
- raw.raw
69
- elsif code_dictionnary?
70
- raw
71
- .raw
72
- .map do |key, value|
73
- [::Code::Ruby.from_code(key), ::Code::Ruby.from_code(value)]
74
- end
75
- .to_h
76
- elsif code_list?
77
- raw.raw.map { |element| ::Code::Ruby.from_code(element) }
78
- else
79
- raise "Unsupported class #{raw.class} for Code to Ruby conversion"
80
- end
81
- else
82
- raw
83
- end
84
- end
85
-
86
- private
87
-
88
- attr_reader :raw
89
-
90
- def code?
91
- raw.is_a?(::Code::Object)
92
- end
93
-
94
- def nil?
95
- raw.is_a?(::NilClass)
96
- end
97
-
98
- def true?
99
- raw.is_a?(::TrueClass)
100
- end
101
-
102
- def false?
103
- raw.is_a?(::FalseClass)
104
- end
105
-
106
- def hash?
107
- raw.is_a?(::Hash)
108
- end
109
-
110
- def array?
111
- raw.is_a?(::Array)
112
- end
113
-
114
- def string?
115
- raw.is_a?(::String)
116
- end
117
-
118
- def symbol?
119
- raw.is_a?(::Symbol)
120
- end
121
-
122
- def integer?
123
- raw.is_a?(::Integer)
124
- end
125
-
126
- def float?
127
- raw.is_a?(::Float)
128
- end
129
-
130
- def big_decimal?
131
- raw.is_a?(::BigDecimal)
132
- end
133
-
134
- def proc?
135
- raw.is_a?(::Proc)
136
- end
137
-
138
- def code_nothing?
139
- raw.is_a?(::Code::Object::Nothing)
140
- end
141
-
142
- def code_boolean?
143
- raw.is_a?(::Code::Object::Boolean)
144
- end
145
-
146
- def code_decimal?
147
- raw.is_a?(::Code::Object::Decimal)
148
- end
149
-
150
- def code_integer?
151
- raw.is_a?(::Code::Object::Integer)
152
- end
153
-
154
- def code_nothing?
155
- raw.is_a?(::Code::Object::Nothing)
156
- end
157
-
158
- def code_range?
159
- raw.is_a?(::Code::Object::Range)
160
- end
161
-
162
- def code_string?
163
- raw.is_a?(::Code::Object::String)
164
- end
165
-
166
- def code_dictionnary?
167
- raw.is_a?(::Code::Object::Dictionnary)
168
- end
169
-
170
- def code_list?
171
- raw.is_a?(::Code::Object::List)
172
- end
173
- end
174
- end
data/lib/code-ruby.rb DELETED
@@ -1,10 +0,0 @@
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
data/lib/code.rb DELETED
@@ -1,47 +0,0 @@
1
- class Code
2
- EMPTY_STRING = ""
3
- GLOBALS = %i[io context object]
4
- DEFAULT_TIMEOUT = Template::DEFAULT_TIMEOUT
5
-
6
- def initialize(input, io: StringIO.new, timeout: DEFAULT_TIMEOUT, ruby: {})
7
- @input = input
8
- @parsed = Timeout.timeout(timeout) { ::Code::Parser.parse(@input).to_raw }
9
- @io = io
10
- @timeout = timeout || DEFAULT_TIMEOUT
11
- @ruby = ::Code::Ruby.to_code(ruby || {})
12
- end
13
-
14
- def self.evaluate(
15
- input,
16
- context = "",
17
- io: StringIO.new,
18
- timeout: DEFAULT_TIMEOUT,
19
- ruby: {}
20
- )
21
- new(input, io: io, timeout: timeout, ruby: ruby).evaluate(context)
22
- end
23
-
24
- def evaluate(context = "")
25
- Timeout.timeout(timeout) do
26
- if context != EMPTY_STRING
27
- context = ::Code.evaluate(context, timeout: timeout, io: io, ruby: ruby)
28
- else
29
- context = ::Code::Object::Dictionnary.new
30
- end
31
-
32
- if !context.is_a?(::Code::Object::Dictionnary)
33
- raise ::Code::Error::IncompatibleContext.new(
34
- "context must be a dictionnary"
35
- )
36
- end
37
-
38
- context = context.merge(ruby)
39
-
40
- ::Code::Node::Code.new(parsed).evaluate(context: context, io: io)
41
- end
42
- end
43
-
44
- private
45
-
46
- attr_reader :input, :parsed, :timeout, :io, :ruby
47
- end
@@ -1,13 +0,0 @@
1
- class Template
2
- class Node
3
- class CodePart < Node
4
- def initialize(code)
5
- @code = ::Code::Node::Code.new(code)
6
- end
7
-
8
- def evaluate(**args)
9
- @code.evaluate(**args)
10
- end
11
- end
12
- end
13
- end
@@ -1,19 +0,0 @@
1
- class Template
2
- class Node
3
- class Part < Node
4
- def initialize(part)
5
- if part.key?(:text)
6
- @part = ::Template::Node::TextPart.new(part[:text])
7
- elsif part.key?(:code)
8
- @part = ::Template::Node::CodePart.new(part[:code])
9
- else
10
- raise NotImplementedError.new(part.inspect)
11
- end
12
- end
13
-
14
- def evaluate(**args)
15
- @part.evaluate(**args)
16
- end
17
- end
18
- end
19
- end
@@ -1,15 +0,0 @@
1
- class Template
2
- class Node
3
- class Template < Node
4
- def initialize(parts)
5
- @parts = parts.map { |part| ::Template::Node::Part.new(part) }
6
- end
7
-
8
- def evaluate(**args)
9
- io = args.fetch(:io)
10
-
11
- @parts.each { |part| io.print(part.evaluate(**args)) }
12
- end
13
- end
14
- end
15
- end
@@ -1,13 +0,0 @@
1
- class Template
2
- class Node
3
- class TextPart < Node
4
- def initialize(text)
5
- @text = text
6
- end
7
-
8
- def evaluate(**args)
9
- ::Code::Object::String.new(@text.to_s)
10
- end
11
- end
12
- end
13
- end
data/lib/template/node.rb DELETED
@@ -1,4 +0,0 @@
1
- class Template
2
- class Node < ::Code::Node
3
- end
4
- end
@@ -1,39 +0,0 @@
1
- class Template
2
- class Parser
3
- class Template < Language
4
- def code
5
- ::Code::Parser::Code
6
- end
7
-
8
- def opening_curly_bracket
9
- str("{")
10
- end
11
-
12
- def closing_curly_bracket
13
- str("}")
14
- end
15
-
16
- def backslash
17
- str("\\")
18
- end
19
-
20
- def code_part
21
- opening_curly_bracket << code << (closing_curly_bracket | any.absent)
22
- end
23
-
24
- def text_character
25
- (backslash.ignore << opening_curly_bracket) |
26
- (opening_curly_bracket.absent << any)
27
- end
28
-
29
- def text_part
30
- text_character.repeat(1)
31
- end
32
-
33
- def root
34
- (code_part.aka(:code) | text_part.aka(:text)).repeat |
35
- str("").aka(:text).repeat(1, 1)
36
- end
37
- end
38
- end
39
- end
@@ -1,19 +0,0 @@
1
- class Template
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
- ::Template::Parser::Template.parse(input)
13
- end
14
-
15
- private
16
-
17
- attr_reader :input
18
- end
19
- end
@@ -1,3 +0,0 @@
1
- require_relative "../template"
2
-
3
- Template::Version = Gem::Version.new("0.5.6")
data/lib/template-ruby.rb DELETED
@@ -1,10 +0,0 @@
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
data/lib/template.rb DELETED
@@ -1,50 +0,0 @@
1
- class Template
2
- DEFAULT_TIMEOUT = 10
3
-
4
- def initialize(input, io: StringIO.new, timeout: DEFAULT_TIMEOUT, ruby: {})
5
- @input = input
6
- @parsed =
7
- Timeout.timeout(timeout) { ::Template::Parser.parse(@input).to_raw }
8
- @io = io
9
- @timeout = timeout || DEFAULT_TIMEOUT
10
- @ruby = ::Code::Ruby.to_code(ruby || {})
11
- end
12
-
13
- def self.render(
14
- input,
15
- context = "",
16
- io: StringIO.new,
17
- timeout: DEFAULT_TIMEOUT,
18
- ruby: {}
19
- )
20
- new(input, io: io, timeout: timeout, ruby: ruby).render(context)
21
- end
22
-
23
- def render(context = "")
24
- Timeout.timeout(timeout) do
25
- if context != ""
26
- context = ::Code.evaluate(context, timeout: timeout, io: io, ruby: ruby)
27
- else
28
- context = ::Code::Object::Dictionnary.new
29
- end
30
-
31
- if !context.is_a?(::Code::Object::Dictionnary)
32
- raise ::Code::Template::IncompatibleContext.new(
33
- "context must be a dictionnary"
34
- )
35
- end
36
-
37
- context = context.merge(ruby)
38
-
39
- ::Template::Node::Template.new(parsed).evaluate(context: context, io: io)
40
-
41
- io.is_a?(StringIO) ? io.string : nil
42
- end
43
- end
44
-
45
- private
46
-
47
- attr_reader :parsed, :io, :timeout, :ruby
48
- end
49
-
50
- require_relative "template/version"
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "function" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [["1 + 2", "3"], ["2 - 1", "1"], ["a = 2 - 1 a", "1"]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "and operator" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [["true && false", "false"], ["true && true", "true"]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "bitwise and" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [["1 & 1", "1"]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "bitwise or" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [["1 | 2", "3"], ["1 ^ 2", "3"]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "boolean" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [%w[true true], %w[false false]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,21 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "call" do
4
- let(:timeout) { 0 }
5
-
6
- context "inspecting the io" do
7
- let(:io) { StringIO.new }
8
-
9
- subject do
10
- Code.evaluate(input, io: io, timeout: timeout)
11
- io.string
12
- end
13
-
14
- [["puts(true)", "true\n"], %w[print(false) false]].each do |input, output|
15
- context input do
16
- let(:input) { input }
17
- it { expect(subject).to eq(output) }
18
- end
19
- end
20
- end
21
- end
@@ -1,16 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "chained call" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["[1, 2, 3].select { |n| n.even? }", "[2]"],
9
- ["[1, 2, 3].select { |n| n.even? }.select { |n| n.odd? }", "[]"]
10
- ].each do |input, output|
11
- context input do
12
- let(:input) { input }
13
- it { expect(subject).to eq(output) }
14
- end
15
- end
16
- end
@@ -1,29 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "function" do
4
- it "converts nil" do
5
- expect(Code::Ruby.from_code(Code.evaluate("a", ruby: { a: nil }))).to eq(nil)
6
- end
7
-
8
- it "works with downcase" do
9
- expect(Code.evaluate("downcase", "{ downcase: 1 }")).to eq(1)
10
- end
11
-
12
- it "works with nested objects" do
13
- expect(
14
- Code.evaluate(
15
- "items.first.title",
16
- ruby: { items: [{ title: "Hello" }] }
17
- )
18
- ).to eq("Hello")
19
- end
20
-
21
- it "works with arrays" do
22
- expect(
23
- Code.evaluate(
24
- "items.map { |item| item.title }",
25
- ruby: { items: [{ title: "Hello" }] }
26
- )
27
- ).to eq(["Hello"])
28
- end
29
- end
@@ -1,17 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "dictionnary" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- %w[{} {}],
9
- ["{ a: 1, b: 2, c: 3 }", '{"a" => 1, "b" => 2, "c" => 3}'],
10
- ['{ "first_name": "Dorian" }', '{"first_name" => "Dorian"}']
11
- ].each do |input, output|
12
- context input do
13
- let(:input) { input }
14
- it { expect(subject).to eq(output) }
15
- end
16
- end
17
- end
@@ -1,26 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "function" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["a = 1 a", "1"],
9
- ["a = 1 a += 1 a", "2"],
10
- ["a = 1 a -= 1 a", "0"],
11
- ["a = 1 a *= 2 a", "2"],
12
- ["a = 1 a /= 2 a", "0.5"],
13
- ["a = 10 a %= 2 a", "0"],
14
- ["a = 1 a >>= 1 a", "0"],
15
- ["a = 1 a <<= 1 a", "2"],
16
- ["a = 1 a |= 2 a", "3"],
17
- ["a = 1 a ^= 2 a", "3"],
18
- ["a = false a ||= true a", "true"],
19
- ["a = false a &&= true a", "false"]
20
- ].each do |input, output|
21
- context input do
22
- let(:input) { input }
23
- it { expect(subject).to eq(output) }
24
- end
25
- end
26
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "while" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [["1 == 1", "true"], ["1 == 1 and 2 == 2", "true"]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,18 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "function" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["even? = (i) => { i.even? } even?(2)", "true"],
9
- ["even? = (i:) => { i.even? } even?(i: 2)", "true"],
10
- ["add = (a, b) => { a + b } add(1, 2)", "3"],
11
- ["minus = (a:, b:) => { a - b } minus(b: 1, a: 2)", "1"]
12
- ].each do |input, output|
13
- context input do
14
- let(:input) { input }
15
- it { expect(subject).to eq(output) }
16
- end
17
- end
18
- end
@@ -1,18 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "greater" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["1 > 2", "false"],
9
- ["1 < 2", "true"],
10
- ["1 <= 1", "true"],
11
- ["1 >= 1", "true"]
12
- ].each do |input, output|
13
- context input do
14
- let(:input) { input }
15
- it { expect(subject).to eq(output) }
16
- end
17
- end
18
- end
@@ -1,12 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "group" do
4
- subject { Code.evaluate(input).to_s }
5
-
6
- [["(true false)", "false"]].each do |input, output|
7
- context input do
8
- let(:input) { input }
9
- it { expect(subject).to eq(output) }
10
- end
11
- end
12
- end