code-ruby 0.6.2 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b63a5dc762c3ac1d5e2f37910c24806b092a78f0bc8ed5ad4409f2e6283f7880
4
- data.tar.gz: 5cd2966db552e1b06a7946767af43005a670dbe76378e8680524af6abf3a2479
3
+ metadata.gz: 2885af9560ee132a0d9ab0be653fadd74e54e04975a1673ff98d929e14040088
4
+ data.tar.gz: 68450cd4d425cc61bccd154f32b7786a2e7f0778ca567a2e19346b017f6e40c2
5
5
  SHA512:
6
- metadata.gz: 7d364133a93859542602ac10730d4b539e2e090e7b91fa9ffacfec1602edc5701da4ab8c6d1208e6e9a1967983ea2c62d80fbf7aab6df62141da332199ed7796
7
- data.tar.gz: ad10fe135a0391fa37d769282b13a1fa7b1423a9226daa147553d91ee0d61f03f8b49d6e7b1c0514709bbf0cb03fe6c64db9ea7a71b10b9761cdcc1cdc95f2a1
6
+ metadata.gz: f090263fb431fa7d6ab1193bd5735b8ef8c425783eea75c8495537a2f2c80576dbe8a71ecf3d41202eea787687cdf9f2d6ef0b4dcec931e38be9cc28baa2ed50
7
+ data.tar.gz: d2fbf7f1e6534a1f15e9fca4271b9505fb0229984a53e85d9adbfaaeba5b94535cfde135eede3289f564f06949d0f4bb3c2ff3ac384ffa56596bb802eef2be7e
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.gem
2
+ .env
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.3.0
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.3.0
data/Gemfile CHANGED
@@ -1,6 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  gemspec
4
6
 
7
+ ruby "3.3.0"
8
+
5
9
  gem "rspec"
6
10
  gem "ruby-prof"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- code-ruby (0.6.1)
4
+ code-ruby (0.6.3)
5
5
  bigdecimal (~> 3)
6
6
  language-ruby (~> 0)
7
7
  zeitwerk (~> 2)
@@ -11,7 +11,7 @@ GEM
11
11
  specs:
12
12
  bigdecimal (3.1.6)
13
13
  diff-lcs (1.5.0)
14
- language-ruby (0.6.0)
14
+ language-ruby (0.6.1)
15
15
  zeitwerk (~> 2)
16
16
  rspec (3.12.0)
17
17
  rspec-core (~> 3.12.0)
@@ -38,5 +38,8 @@ DEPENDENCIES
38
38
  rspec
39
39
  ruby-prof
40
40
 
41
+ RUBY VERSION
42
+ ruby 3.3.0p0
43
+
41
44
  BUNDLED WITH
42
45
  2.5.5
data/bin/code CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require "optparse"
4
5
  require_relative "../lib/code-ruby"
@@ -9,11 +10,7 @@ OptionParser
9
10
  .new do |opts|
10
11
  opts.banner = "Usage: template [options]"
11
12
 
12
- opts.on(
13
- "-v",
14
- "--version",
15
- "Version of template"
16
- ) do |input|
13
+ opts.on("-v", "--version", "Version of template") do |_input|
17
14
  puts Code::Version
18
15
  exit
19
16
  end
@@ -48,10 +45,7 @@ OptionParser
48
45
  "Set timeout in seconds"
49
46
  ) { |timeout| options[:timeout] = timeout.to_f }
50
47
 
51
- opts.on(
52
- "--profile",
53
- "Profile Ruby code"
54
- ) do |timeout|
48
+ opts.on("--profile", "Profile Ruby code") do |_timeout|
55
49
  require "ruby-prof"
56
50
  options[:profile] = true
57
51
  end
@@ -70,9 +64,7 @@ OptionParser
70
64
  input = options.fetch(:input, "")
71
65
  context = options.fetch(:context, "")
72
66
 
73
- if options[:profile]
74
- RubyProf.start
75
- end
67
+ RubyProf.start if options[:profile]
76
68
 
77
69
  if options[:parse]
78
70
  pp Code::Parser.parse(input).to_raw
data/code-ruby.gemspec CHANGED
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "English"
1
4
  require_relative "lib/code/version"
2
5
 
3
6
  Gem::Specification.new do |s|
@@ -7,14 +10,13 @@ Gem::Specification.new do |s|
7
10
  s.description = 'A programming language, like Code.evaluate("1 + 1") # => 2'
8
11
  s.authors = ["Dorian Marié"]
9
12
  s.email = "dorian@dorianmarie.fr"
10
- s.files = `git ls-files`.split($/)
11
- s.test_files = s.files.grep(%r{^(test|spec|features)/})
13
+ s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
12
14
  s.require_paths = ["lib"]
13
15
  s.homepage = "https://github.com/dorianmariefr/code-ruby"
14
16
  s.license = "MIT"
15
17
  s.executables = "code"
16
18
 
17
- s.add_dependency "zeitwerk", "~> 2"
18
- s.add_dependency "language-ruby", "~> 0"
19
19
  s.add_dependency "bigdecimal", "~> 3"
20
+ s.add_dependency "language-ruby", "~> 0"
21
+ s.add_dependency "zeitwerk", "~> 2"
20
22
  end
@@ -3,7 +3,8 @@
3
3
  class Code
4
4
  class Node
5
5
  class Nothing < Node
6
- def initialize(parsed)
6
+ def initialize(nothing)
7
+ @nothing = nothing
7
8
  end
8
9
 
9
10
  def evaluate(**_args)
@@ -214,7 +214,11 @@ class Code
214
214
 
215
215
  def code_delete(*arguments, index: Integer.new(0), **globals)
216
216
  default =
217
- (arguments.last if arguments.last.is_a?(Function) && arguments.size > 1)
217
+ (
218
+ if arguments.last.is_a?(Function) && arguments.size > 1
219
+ arguments.last
220
+ end
221
+ )
218
222
 
219
223
  arguments = arguments[..-2] if default
220
224
 
@@ -303,8 +307,8 @@ class Code
303
307
  self
304
308
  end
305
309
 
306
- def code_dig(*arguments)
307
- raw.dig(*arguments) || Nothing.new
310
+ def code_dig(*)
311
+ raw.dig(*) || Nothing.new
308
312
  end
309
313
 
310
314
  def code_each(argument, **globals)
@@ -331,13 +335,17 @@ class Code
331
335
  Boolean.new(raw.empty?)
332
336
  end
333
337
 
334
- def code_except(*arguments)
335
- self.class.new(raw.except(*arguments))
338
+ def code_except(*)
339
+ self.class.new(raw.except(*))
336
340
  end
337
341
 
338
342
  def code_fetch(*arguments, index: Integer.new(0), **globals)
339
343
  default =
340
- (arguments.last if arguments.last.is_a?(Function) && arguments.size > 1)
344
+ (
345
+ if arguments.last.is_a?(Function) && arguments.size > 1
346
+ arguments.last
347
+ end
348
+ )
341
349
 
342
350
  arguments = arguments[..-2] if default
343
351
 
@@ -386,8 +394,8 @@ class Code
386
394
  end
387
395
  end
388
396
 
389
- def code_fetch_values(*arguments)
390
- List.new(raw.fetch_values(*arguments))
397
+ def code_fetch_values(*)
398
+ List.new(raw.fetch_values(*))
391
399
  end
392
400
 
393
401
  def code_five?
@@ -485,7 +493,11 @@ class Code
485
493
 
486
494
  def code_merge(*arguments, **globals)
487
495
  conflict =
488
- (arguments.last if arguments.last.is_a?(Function) && arguments.size > 1)
496
+ (
497
+ if arguments.last.is_a?(Function) && arguments.size > 1
498
+ arguments.last
499
+ end
500
+ )
489
501
 
490
502
  arguments = arguments[..-2] if conflict
491
503
 
@@ -36,9 +36,7 @@ class Code
36
36
  if parameter.regular_splat?
37
37
  context.code_set(
38
38
  parameter.name,
39
- List.new(
40
- arguments.select(&:regular?).map(&:value)
41
- )
39
+ List.new(arguments.select(&:regular?).map(&:value))
42
40
  )
43
41
  elsif parameter.keyword_splat?
44
42
  context.code_set(
@@ -53,7 +51,10 @@ class Code
53
51
  context.code_set(parameter.name, argument)
54
52
  end
55
53
  elsif parameter.keyword?
56
- argument = arguments.detect { |argument| argument.name == parameter.name }&.value
54
+ argument =
55
+ arguments
56
+ .detect { |argument| argument.name == parameter.name }
57
+ &.value
57
58
  argument = parameter.evaluate(**globals) if argument.nil?
58
59
  context.code_set(parameter.name, argument)
59
60
  else
data/lib/code/object.rb CHANGED
@@ -33,7 +33,7 @@ class Code
33
33
  other == self
34
34
  end
35
35
  end
36
- alias eql? ==
36
+ alias_method :eql?, :==
37
37
 
38
38
  def call(**args)
39
39
  operator = args.fetch(:operator, nil)
@@ -20,7 +20,7 @@ class Code
20
20
  end
21
21
 
22
22
  def backslash
23
- str('\\')
23
+ str("\\")
24
24
  end
25
25
 
26
26
  def opening_curly_bracket
@@ -6,28 +6,26 @@ class Code
6
6
  attr_reader :hash
7
7
 
8
8
  def initialize(hash)
9
- @hash = hash
9
+ @hash = hash.transform_keys { |key| Object::String.new(key) }
10
10
  end
11
11
 
12
12
  def valid?(argument)
13
13
  return false unless argument.is_a?(Object::Dictionary)
14
+
14
15
  argument = argument.raw
15
16
  (argument.keys + hash.keys).uniq.all? do |key|
16
17
  next false unless hash[key] && argument[key]
18
+
17
19
  valid_for?(expected: hash[key], actual: argument[key])
18
20
  end
19
21
  end
20
22
 
21
23
  def min_arguments
22
- hash.sum do |_, value|
23
- min_arguments_of(value)
24
- end
24
+ hash.sum { |_, value| min_arguments_of(value) }
25
25
  end
26
26
 
27
27
  def max_arguments
28
- hash.sum do |_, value|
29
- max_arguments_of(value)
30
- end
28
+ hash.sum { |_, value| max_arguments_of(value) }
31
29
  end
32
30
 
33
31
  def name
@@ -21,7 +21,7 @@ class Code
21
21
 
22
22
  def max_arguments
23
23
  max_arguments = max_arguments_of(clazz)
24
- max_arguments.nil? || maximum.nil? ? nil : maximum * max_arguments
24
+ (max_arguments.nil? || maximum.nil?) ? nil : maximum * max_arguments
25
25
  end
26
26
 
27
27
  def name
data/lib/code/type/sig.rb CHANGED
@@ -23,9 +23,10 @@ class Code
23
23
  attr_reader :args, :block, :object
24
24
 
25
25
  def expected_arguments
26
- @expected_arguments ||= Array(block&.call || []).map do |clazz|
27
- clazz.is_a?(::Hash) ? Hash.new(clazz) : clazz
28
- end
26
+ @expected_arguments ||=
27
+ wrap(block&.call || []).map do |clazz|
28
+ clazz.is_a?(::Hash) ? Hash.new(clazz) : clazz
29
+ end
29
30
  end
30
31
 
31
32
  def min_arguments_of(clazz)
@@ -53,7 +54,8 @@ class Code
53
54
  end
54
55
 
55
56
  def max_arguments
56
- max_arguments = expected_arguments.map { |clazz| max_arguments_of(clazz) }
57
+ max_arguments =
58
+ expected_arguments.map { |clazz| max_arguments_of(clazz) }
57
59
  max_arguments.include?(nil) ? nil : max_arguments.sum
58
60
  end
59
61
 
@@ -96,6 +98,10 @@ class Code
96
98
  expected.is_a?(Type) ? expected.valid?(actual) : actual.is_a?(expected)
97
99
  end
98
100
 
101
+ def wrap(object)
102
+ object.is_a?(Array) ? object : [object]
103
+ end
104
+
99
105
  def check_types_of_arguments!
100
106
  expected_index = 0
101
107
  repeat_index = 0
data/lib/code/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "../code"
2
4
 
3
- Code::Version = Gem::Version.new("0.6.2")
5
+ Code::Version = Gem::Version.new("0.6.4")
data/lib/code-ruby.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bigdecimal"
2
4
  require "stringio"
3
5
  require "timeout"
@@ -3,37 +3,35 @@
3
3
  require "spec_helper"
4
4
 
5
5
  RSpec.describe Code::Node::Call do
6
- =begin
7
- let(:context) { <<~CONTEXT }
8
- render = (*args, **kargs, &block) => {
9
- [args, kargs, block&.call(:dorian)]
10
- }
11
-
12
- { render:, user: { name: :Dorian } }"
13
- CONTEXT
14
-
15
- [
16
- ["render", "[[], {}, nothing]"],
17
- ["render()", "[[], {}, nothing]"],
18
- ["render(user)", "[[user], {}, nothing]"],
19
- [
20
- "render(user, first_name: :Dorian)",
21
- "[[user], { first_name: :Dorian }, nothing]"
22
- ],
23
- ["render { }", "[[], {}, nothing]"],
24
- ["render do end", "[[], {}, nothing]"],
25
- ["render { |name| name.upcase }", "[[], {}, :Dorian]"],
26
- ["render(user) { |name| name.upcase }", "[[user], {}, :Dorian]"],
27
- ["render(user) do |name| name.upcase end", "[[user], {}, :Dorian]"],
28
- ["render { :Dorian }", "[[], {}, :Dorian]"],
29
- ["render(user) { :Dorian }", "[[user], {}, :Dorian]"],
30
- ["render(user) do :Dorian end", "[[user], {}, :Dorian]"]
31
- ].each do |input, expected|
32
- it "#{input} == #{expected}" do
33
- expect(Code.evaluate(input, context)).to eq(
34
- Code.evaluate(expected, context)
35
- )
36
- end
37
- end
38
- =end
6
+ # let(:context) { <<~CONTEXT }
7
+ # render = (*args, **kargs, &block) => {
8
+ # [args, kargs, block&.call(:dorian)]
9
+ # }
10
+ #
11
+ # { render:, user: { name: :Dorian } }"
12
+ # CONTEXT
13
+ #
14
+ # [
15
+ # ["render", "[[], {}, nothing]"],
16
+ # ["render()", "[[], {}, nothing]"],
17
+ # ["render(user)", "[[user], {}, nothing]"],
18
+ # [
19
+ # "render(user, first_name: :Dorian)",
20
+ # "[[user], { first_name: :Dorian }, nothing]"
21
+ # ],
22
+ # ["render { }", "[[], {}, nothing]"],
23
+ # ["render do end", "[[], {}, nothing]"],
24
+ # ["render { |name| name.upcase }", "[[], {}, :Dorian]"],
25
+ # ["render(user) { |name| name.upcase }", "[[user], {}, :Dorian]"],
26
+ # ["render(user) do |name| name.upcase end", "[[user], {}, :Dorian]"],
27
+ # ["render { :Dorian }", "[[], {}, :Dorian]"],
28
+ # ["render(user) { :Dorian }", "[[user], {}, :Dorian]"],
29
+ # ["render(user) do :Dorian end", "[[user], {}, :Dorian]"]
30
+ # ].each do |input, expected|
31
+ # it "#{input} == #{expected}" do
32
+ # expect(Code.evaluate(input, context)).to eq(
33
+ # Code.evaluate(expected, context)
34
+ # )
35
+ # end
36
+ # end
39
37
  end
@@ -3,24 +3,22 @@
3
3
  require "spec_helper"
4
4
 
5
5
  RSpec.describe Code::Object::Function do
6
- =begin
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, expected|
13
- it "#{input} == #{expected}" do
14
- expect(Code.evaluate(input)).to eq(Code.evaluate(expected))
15
- end
16
- end
17
- =end
6
+ # [
7
+ # ["even? = (i) => { i.even? } even?(2)", "true"],
8
+ # ["even? = (i:) => { i.even? } even?(i: 2)", "true"],
9
+ # ["add = (a, b) => { a + b } add(1, 2)", "3"],
10
+ # ["minus = (a:, b:) => { a - b } minus(b: 1, a: 2)", "1"]
11
+ # ].each do |input, expected|
12
+ # it "#{input} == #{expected}" do
13
+ # expect(Code.evaluate(input)).to eq(Code.evaluate(expected))
14
+ # end
15
+ # end
18
16
 
19
17
  context "valid" do
20
18
  [
21
19
  "f = () => {} f",
22
- "f = (x) => {} f(1)",
23
- # "f = (x:) => {} f(x: 1)"
20
+ "f = (x) => {} f(1)"
21
+ # "f = (x:) => {} f(x: 1)"
24
22
  ].each do |input|
25
23
  it "#{input} is valid" do
26
24
  Code.evaluate(input)
@@ -3,10 +3,7 @@
3
3
  require "spec_helper"
4
4
 
5
5
  RSpec.describe Code::Object::List do
6
- [
7
- ["[] == []", "true"],
8
- ["[1, 2, 3].sum", "6"],
9
- ].each do |input, expected|
6
+ [["[] == []", "true"], ["[1, 2, 3].sum", "6"]].each do |input, expected|
10
7
  it "#{input} == #{expected}" do
11
8
  expect(Code.evaluate(input)).to eq(Code.evaluate(expected))
12
9
  end
data/spec/code_spec.rb CHANGED
@@ -109,7 +109,7 @@ RSpec.describe Code do
109
109
  ['"Hello \\{name}"', '"Hello \\{" + "name}"'],
110
110
  ["'Hello {1}'", '"Hello 1"'],
111
111
  ['"Hello {1}"', '"Hello 1"'],
112
- %w["Hello".include?("H") true],
112
+ %w[:Hello.include?(:H) true],
113
113
  %w["Hello".downcase :hello],
114
114
  ["true ? 1", "1"],
115
115
  ["false ? 1", ""],
data/spec/spec_helper.rb CHANGED
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "../lib/code-ruby"
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: code-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dorian Marié
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-30 00:00:00.000000000 Z
11
+ date: 2024-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: zeitwerk
14
+ name: bigdecimal
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2'
19
+ version: '3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2'
26
+ version: '3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: language-ruby
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -39,19 +39,19 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bigdecimal
42
+ name: zeitwerk
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3'
47
+ version: '2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3'
54
+ version: '2'
55
55
  description: 'A programming language, like Code.evaluate("1 + 1") # => 2'
56
56
  email: dorian@dorianmarie.fr
57
57
  executables:
@@ -59,7 +59,10 @@ executables:
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - ".gitignore"
62
63
  - ".rspec"
64
+ - ".ruby-version"
65
+ - ".tool-versions"
63
66
  - Gemfile
64
67
  - Gemfile.lock
65
68
  - README.md
@@ -203,30 +206,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
203
206
  - !ruby/object:Gem::Version
204
207
  version: '0'
205
208
  requirements: []
206
- rubygems_version: 3.5.5
209
+ rubygems_version: 3.5.3
207
210
  signing_key:
208
211
  specification_version: 4
209
212
  summary: A programming language
210
- test_files:
211
- - spec/code/node/call_spec.rb
212
- - spec/code/object/boolean_spec.rb
213
- - spec/code/object/decimal_spec.rb
214
- - spec/code/object/dictionary_spec.rb
215
- - spec/code/object/function_spec.rb
216
- - spec/code/object/integer_spec.rb
217
- - spec/code/object/list_spec.rb
218
- - spec/code/object/nothing_spec.rb
219
- - spec/code/object/range_spec.rb
220
- - spec/code/parser/boolean_spec.rb
221
- - spec/code/parser/chained_call.rb
222
- - spec/code/parser/dictionary_spec.rb
223
- - spec/code/parser/function_spec.rb
224
- - spec/code/parser/group_spec.rb
225
- - spec/code/parser/if_modifier_spec.rb
226
- - spec/code/parser/list_spec.rb
227
- - spec/code/parser/number_spec.rb
228
- - spec/code/parser/string_spec.rb
229
- - spec/code/parser_spec.rb
230
- - spec/code/type_spec.rb
231
- - spec/code_spec.rb
232
- - spec/spec_helper.rb
213
+ test_files: []