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,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe "or keyword" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:timeout) { 0 }
         
     | 
| 
      
 5 
     | 
    
         
            +
              subject { Code.evaluate(input, timeout: timeout).to_s }
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              [
         
     | 
| 
      
 8 
     | 
    
         
            +
                ["true or false", "true"],
         
     | 
| 
      
 9 
     | 
    
         
            +
                ["true and false", "false"],
         
     | 
| 
      
 10 
     | 
    
         
            +
                ["random = 1 random", "1"]
         
     | 
| 
      
 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
         
     | 
| 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe "or operator" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:timeout) { 0 }
         
     | 
| 
      
 5 
     | 
    
         
            +
              subject { Code.evaluate(input, timeout: timeout).to_s }
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              [
         
     | 
| 
      
 8 
     | 
    
         
            +
                ["true || false", "true"],
         
     | 
| 
      
 9 
     | 
    
         
            +
                ["false || false", "false"]
         
     | 
| 
      
 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
         
     | 
| 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe Code::Parser::Boolean do
         
     | 
| 
      
 4 
     | 
    
         
            +
              subject { Code::Parser.parse(input) }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              [
         
     | 
| 
      
 7 
     | 
    
         
            +
                ["true", [{ boolean: "true" }]],
         
     | 
| 
      
 8 
     | 
    
         
            +
                ["false", [{ boolean: "false" }]]
         
     | 
| 
      
 9 
     | 
    
         
            +
              ].each do |input, output|
         
     | 
| 
      
 10 
     | 
    
         
            +
                context input.inspect do
         
     | 
| 
      
 11 
     | 
    
         
            +
                  let(:input) { input }
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  it { expect(subject).to eq(output) }
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe Code::Parser::Call do
         
     | 
| 
      
 4 
     | 
    
         
            +
              subject { Code::Parser.parse(input) }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              [
         
     | 
| 
      
 7 
     | 
    
         
            +
                "a",
         
     | 
| 
      
 8 
     | 
    
         
            +
                "hello",
         
     | 
| 
      
 9 
     | 
    
         
            +
                "hello()",
         
     | 
| 
      
 10 
     | 
    
         
            +
                "render(user)",
         
     | 
| 
      
 11 
     | 
    
         
            +
                'render(user, first_name: "Dorian")',
         
     | 
| 
      
 12 
     | 
    
         
            +
                "render { }",
         
     | 
| 
      
 13 
     | 
    
         
            +
                "render do end",
         
     | 
| 
      
 14 
     | 
    
         
            +
                "render { |name| name.upcase }",
         
     | 
| 
      
 15 
     | 
    
         
            +
                "render(user) { |name| name.upcase }",
         
     | 
| 
      
 16 
     | 
    
         
            +
                "render(user) do |name| name.upcase end",
         
     | 
| 
      
 17 
     | 
    
         
            +
                'render { "Dorian" }',
         
     | 
| 
      
 18 
     | 
    
         
            +
                'render(user) { "Dorian" }',
         
     | 
| 
      
 19 
     | 
    
         
            +
                'render(user) do "Dorian" end'
         
     | 
| 
      
 20 
     | 
    
         
            +
              ].each do |input|
         
     | 
| 
      
 21 
     | 
    
         
            +
                context input do
         
     | 
| 
      
 22 
     | 
    
         
            +
                  let(:input) { input }
         
     | 
| 
      
 23 
     | 
    
         
            +
                  it { subject }
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe Code::Parser::ChainedCall do
         
     | 
| 
      
 4 
     | 
    
         
            +
              subject { Code::Parser.parse(input) }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              [
         
     | 
| 
      
 7 
     | 
    
         
            +
                "a.b",
         
     | 
| 
      
 8 
     | 
    
         
            +
                "user.first_name",
         
     | 
| 
      
 9 
     | 
    
         
            +
                "user.admin?",
         
     | 
| 
      
 10 
     | 
    
         
            +
                'user.update!(name: "Dorian")'
         
     | 
| 
      
 11 
     | 
    
         
            +
              ].each do |input|
         
     | 
| 
      
 12 
     | 
    
         
            +
                context input do
         
     | 
| 
      
 13 
     | 
    
         
            +
                  let(:input) { input }
         
     | 
| 
      
 14 
     | 
    
         
            +
                  it { subject }
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe Code::Parser::Dictionnary do
         
     | 
| 
      
 4 
     | 
    
         
            +
              subject { Code::Parser.parse(input) }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              [
         
     | 
| 
      
 7 
     | 
    
         
            +
                "{}",
         
     | 
| 
      
 8 
     | 
    
         
            +
                "{ }",
         
     | 
| 
      
 9 
     | 
    
         
            +
                "{/* comment */}",
         
     | 
| 
      
 10 
     | 
    
         
            +
                "{ a: 1, b: 2, c: 3 }",
         
     | 
| 
      
 11 
     | 
    
         
            +
                '{ "first_name": "Dorian" }'
         
     | 
| 
      
 12 
     | 
    
         
            +
              ].each do |input|
         
     | 
| 
      
 13 
     | 
    
         
            +
                context input do
         
     | 
| 
      
 14 
     | 
    
         
            +
                  let(:input) { input }
         
     | 
| 
      
 15 
     | 
    
         
            +
                  it { subject }
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe Code::Parser::Function do
         
     | 
| 
      
 4 
     | 
    
         
            +
              subject { Code::Parser.parse(input) }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              [
         
     | 
| 
      
 7 
     | 
    
         
            +
                "() => {}",
         
     | 
| 
      
 8 
     | 
    
         
            +
                "(a, b) => { add(a, b) }",
         
     | 
| 
      
 9 
     | 
    
         
            +
                "(a:, b:) => { add(a, b) }"
         
     | 
| 
      
 10 
     | 
    
         
            +
              ].each do |input|
         
     | 
| 
      
 11 
     | 
    
         
            +
                context input do
         
     | 
| 
      
 12 
     | 
    
         
            +
                  let(:input) { input }
         
     | 
| 
      
 13 
     | 
    
         
            +
                  it { subject }
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe Code::Parser::Group do
         
     | 
| 
      
 4 
     | 
    
         
            +
              subject { Code::Parser.parse(input) }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              [
         
     | 
| 
      
 7 
     | 
    
         
            +
                [
         
     | 
| 
      
 8 
     | 
    
         
            +
                  "(true (nothing))",
         
     | 
| 
      
 9 
     | 
    
         
            +
                  [{ group: [{ boolean: "true" }, { group: [{ nothing: "nothing" }] }] }]
         
     | 
| 
      
 10 
     | 
    
         
            +
                ]
         
     | 
| 
      
 11 
     | 
    
         
            +
              ].each do |input, output|
         
     | 
| 
      
 12 
     | 
    
         
            +
                context input.inspect do
         
     | 
| 
      
 13 
     | 
    
         
            +
                  let(:input) { input }
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  it { expect(subject).to eq(output) }
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe Code::Parser::List do
         
     | 
| 
      
 4 
     | 
    
         
            +
              subject { Code::Parser.parse(input) }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              [
         
     | 
| 
      
 7 
     | 
    
         
            +
                "[]",
         
     | 
| 
      
 8 
     | 
    
         
            +
                "[ ]",
         
     | 
| 
      
 9 
     | 
    
         
            +
                "[/* comment */]",
         
     | 
| 
      
 10 
     | 
    
         
            +
                "[1, 2, 3]",
         
     | 
| 
      
 11 
     | 
    
         
            +
                "['hello', 1, true, [false, nothing]]"
         
     | 
| 
      
 12 
     | 
    
         
            +
              ].each do |input|
         
     | 
| 
      
 13 
     | 
    
         
            +
                context input do
         
     | 
| 
      
 14 
     | 
    
         
            +
                  let(:input) { input }
         
     | 
| 
      
 15 
     | 
    
         
            +
                  it { subject }
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe Code::Parser::String do
         
     | 
| 
      
 4 
     | 
    
         
            +
              subject { Code::Parser.parse(input) }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              [
         
     | 
| 
      
 7 
     | 
    
         
            +
                "''",
         
     | 
| 
      
 8 
     | 
    
         
            +
                '""',
         
     | 
| 
      
 9 
     | 
    
         
            +
                "'Hello Dorian'",
         
     | 
| 
      
 10 
     | 
    
         
            +
                '"Hello Dorian"',
         
     | 
| 
      
 11 
     | 
    
         
            +
                "'Hello \\{name}'",
         
     | 
| 
      
 12 
     | 
    
         
            +
                '"Hello \\{name}"',
         
     | 
| 
      
 13 
     | 
    
         
            +
                "'Hello {name}'",
         
     | 
| 
      
 14 
     | 
    
         
            +
                '"Hello {name}"'
         
     | 
| 
      
 15 
     | 
    
         
            +
              ].each do |input|
         
     | 
| 
      
 16 
     | 
    
         
            +
                context input do
         
     | 
| 
      
 17 
     | 
    
         
            +
                  let(:input) { input }
         
     | 
| 
      
 18 
     | 
    
         
            +
                  it { subject }
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe "Code::Parser" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              subject { Code::Parser.parse(input) }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              [
         
     | 
| 
      
 7 
     | 
    
         
            +
                ["", []],
         
     | 
| 
      
 8 
     | 
    
         
            +
                ["  ", []],
         
     | 
| 
      
 9 
     | 
    
         
            +
                ["\n", []],
         
     | 
| 
      
 10 
     | 
    
         
            +
                ["nothing", [{ nothing: "nothing" }]],
         
     | 
| 
      
 11 
     | 
    
         
            +
                ["  nothing  ", [{ nothing: "nothing" }]],
         
     | 
| 
      
 12 
     | 
    
         
            +
                [
         
     | 
| 
      
 13 
     | 
    
         
            +
                  "nothing null nil",
         
     | 
| 
      
 14 
     | 
    
         
            +
                  [{ nothing: "nothing" }, { nothing: "null" }, { nothing: "nil" }]
         
     | 
| 
      
 15 
     | 
    
         
            +
                ]
         
     | 
| 
      
 16 
     | 
    
         
            +
              ].each do |input, output|
         
     | 
| 
      
 17 
     | 
    
         
            +
                context input.inspect do
         
     | 
| 
      
 18 
     | 
    
         
            +
                  let(:input) { input }
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                  it { expect(subject).to eq(output) }
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,13 @@ 
     | 
|
| 
      
 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 
     | 
    
         
            +
              [["2 ** 3", "8"], ["2 ** 3 ** 2", "512"]].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
         
     | 
| 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe "range" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:timeout) { 0 }
         
     | 
| 
      
 5 
     | 
    
         
            +
              subject { Code.evaluate(input, timeout: timeout).to_s }
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              [
         
     | 
| 
      
 8 
     | 
    
         
            +
                ["(0..1).to_list", "[0, 1]"],
         
     | 
| 
      
 9 
     | 
    
         
            +
                ["(0...1).to_list", "[0]"]
         
     | 
| 
      
 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
         
     | 
| 
         @@ -0,0 +1,13 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe "rescue" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:timeout) { 0 }
         
     | 
| 
      
 5 
     | 
    
         
            +
              subject { Code.evaluate(input, timeout: timeout).to_s }
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              [["a rescue 'oops'", "oops"]].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
         
     | 
| 
         @@ -0,0 +1,13 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe "shift" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:timeout) { 0 }
         
     | 
| 
      
 5 
     | 
    
         
            +
              subject { Code.evaluate(input, timeout: timeout).to_s }
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              [["1 >> 1", "0"], ["1 << 1", "2"]].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
         
     | 
| 
         @@ -0,0 +1,13 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe "string" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:timeout) { 0 }
         
     | 
| 
      
 5 
     | 
    
         
            +
              subject { Code.evaluate(input, timeout: timeout).to_s }
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              [["[1, 2].map(&:to_string)", '["1", "2"]']].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
         
     | 
| 
         @@ -0,0 +1,25 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe "string" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:timeout) { 0 }
         
     | 
| 
      
 5 
     | 
    
         
            +
              subject { Code.evaluate(input, timeout: timeout).to_s }
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              [
         
     | 
| 
      
 8 
     | 
    
         
            +
                ["''", ""],
         
     | 
| 
      
 9 
     | 
    
         
            +
                ['""', ""],
         
     | 
| 
      
 10 
     | 
    
         
            +
                %w[:hello hello],
         
     | 
| 
      
 11 
     | 
    
         
            +
                %w[:admin? admin?],
         
     | 
| 
      
 12 
     | 
    
         
            +
                %w[:update! update!],
         
     | 
| 
      
 13 
     | 
    
         
            +
                ["'Hello Dorian'", "Hello Dorian"],
         
     | 
| 
      
 14 
     | 
    
         
            +
                ['"Hello Dorian"', "Hello Dorian"],
         
     | 
| 
      
 15 
     | 
    
         
            +
                ["'Hello \\{name}'", "Hello {name}"],
         
     | 
| 
      
 16 
     | 
    
         
            +
                ['"Hello \\{name}"', "Hello {name}"],
         
     | 
| 
      
 17 
     | 
    
         
            +
                ["'Hello {1}'", "Hello 1"],
         
     | 
| 
      
 18 
     | 
    
         
            +
                ['"Hello {1}"', "Hello 1"]
         
     | 
| 
      
 19 
     | 
    
         
            +
              ].each do |input, output|
         
     | 
| 
      
 20 
     | 
    
         
            +
                context input do
         
     | 
| 
      
 21 
     | 
    
         
            +
                  let(:input) { input }
         
     | 
| 
      
 22 
     | 
    
         
            +
                  it { expect(subject).to eq(output) }
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            RSpec.describe "ternary" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:timeout) { 0 }
         
     | 
| 
      
 5 
     | 
    
         
            +
              subject { Code.evaluate(input, timeout: timeout).to_s }
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              [
         
     | 
| 
      
 8 
     | 
    
         
            +
                ["true ? 1", "1"],
         
     | 
| 
      
 9 
     | 
    
         
            +
                ["false ? 1", ""],
         
     | 
| 
      
 10 
     | 
    
         
            +
                ["true ? 1 : 2", "1"],
         
     | 
| 
      
 11 
     | 
    
         
            +
                ["false ? 1 : 2", "2"]
         
     | 
| 
      
 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
         
     | 
| 
         @@ -0,0 +1,13 @@ 
     | 
|
| 
      
 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 
     | 
    
         
            +
              [%w[-1 -1], %w[--1 1], %w[-1.0 -1.0], %w[--1.0 1.0]].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
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 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 
     | 
    
         
            +
              [
         
     | 
| 
      
 8 
     | 
    
         
            +
                ["while false", ""],
         
     | 
| 
      
 9 
     | 
    
         
            +
                ["a = 0\nwhile a < 10 a += 1 end a", "10"],
         
     | 
| 
      
 10 
     | 
    
         
            +
                ["until true", ""],
         
     | 
| 
      
 11 
     | 
    
         
            +
                ["a = 0\nuntil a > 10 a += 1 end a", "11"]
         
     | 
| 
      
 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
         
     | 
    
        data/spec/spec_helper.rb
    ADDED
    
    
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative "lib/template/version"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Gem::Specification.new do |s|
         
     | 
| 
      
 4 
     | 
    
         
            +
              s.name = "template-ruby"
         
     | 
| 
      
 5 
     | 
    
         
            +
              s.version = ::Template::Version
         
     | 
| 
      
 6 
     | 
    
         
            +
              s.summary = "A templating programming language"
         
     | 
| 
      
 7 
     | 
    
         
            +
              s.description =
         
     | 
| 
      
 8 
     | 
    
         
            +
                'A templating programming language, like "Hello {name}" with {name: "Dorian"} gives "Hello Dorian"'
         
     | 
| 
      
 9 
     | 
    
         
            +
              s.authors = ["Dorian Marié"]
         
     | 
| 
      
 10 
     | 
    
         
            +
              s.email = "dorian@dorianmarie.fr"
         
     | 
| 
      
 11 
     | 
    
         
            +
              s.files = `git ls-files`.split($/)
         
     | 
| 
      
 12 
     | 
    
         
            +
              s.test_files = s.files.grep(%r{^(test|spec|features)/})
         
     | 
| 
      
 13 
     | 
    
         
            +
              s.require_paths = ["lib"]
         
     | 
| 
      
 14 
     | 
    
         
            +
              s.homepage = "https://github.com/dorianmariefr/template-ruby"
         
     | 
| 
      
 15 
     | 
    
         
            +
              s.license = "MIT"
         
     | 
| 
      
 16 
     | 
    
         
            +
              s.executables = "template"
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              s.add_dependency "zeitwerk", "~> 2"
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     |