code-ruby 0.6.0 → 0.6.2

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: 28db53e527baab77e31c69d2ba121f06a91333aa413ac1f82daf5f4f87ba6864
4
- data.tar.gz: '0963f43654020b71820b21fbcc4ade468fa98d85bd5e5fc628bdf5406037508a'
3
+ metadata.gz: b63a5dc762c3ac1d5e2f37910c24806b092a78f0bc8ed5ad4409f2e6283f7880
4
+ data.tar.gz: 5cd2966db552e1b06a7946767af43005a670dbe76378e8680524af6abf3a2479
5
5
  SHA512:
6
- metadata.gz: 61e09ee88f713f2f9dfd3e2f1a6db3ce89ab059170ff9864038e3473d264a36966595b7d354bcc77e3832d8f67620fd44ddf155177e716c0ea841682c64a232b
7
- data.tar.gz: '0806530251411c030f51f3edd620ab7147b98cdbc1712719db0656c5bc9fa9c17b34b92a416432614c046036a327dcefe514cc78e6b5f5026618f2120f536d68'
6
+ metadata.gz: 7d364133a93859542602ac10730d4b539e2e090e7b91fa9ffacfec1602edc5701da4ab8c6d1208e6e9a1967983ea2c62d80fbf7aab6df62141da332199ed7796
7
+ data.tar.gz: ad10fe135a0391fa37d769282b13a1fa7b1423a9226daa147553d91ee0d61f03f8b49d6e7b1c0514709bbf0cb03fe6c64db9ea7a71b10b9761cdcc1cdc95f2a1
data/Gemfile CHANGED
@@ -3,3 +3,4 @@ source "https://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  gem "rspec"
6
+ gem "ruby-prof"
data/Gemfile.lock CHANGED
@@ -1,13 +1,15 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- code-ruby (0.6.0)
4
+ code-ruby (0.6.1)
5
+ bigdecimal (~> 3)
5
6
  language-ruby (~> 0)
6
7
  zeitwerk (~> 2)
7
8
 
8
9
  GEM
9
10
  remote: https://rubygems.org/
10
11
  specs:
12
+ bigdecimal (3.1.6)
11
13
  diff-lcs (1.5.0)
12
14
  language-ruby (0.6.0)
13
15
  zeitwerk (~> 2)
@@ -24,14 +26,17 @@ GEM
24
26
  diff-lcs (>= 1.2.0, < 2.0)
25
27
  rspec-support (~> 3.12.0)
26
28
  rspec-support (3.12.1)
29
+ ruby-prof (1.7.0)
27
30
  zeitwerk (2.6.12)
28
31
 
29
32
  PLATFORMS
30
- arm64-darwin-22
33
+ arm64-darwin-23
34
+ ruby
31
35
 
32
36
  DEPENDENCIES
33
37
  code-ruby!
34
38
  rspec
39
+ ruby-prof
35
40
 
36
41
  BUNDLED WITH
37
- 2.4.22
42
+ 2.5.5
data/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # code-ruby
2
+
3
+ A programming language, like `Code.evaluate("1 + 1") # => 2`
4
+
5
+ TODO
6
+
7
+ - [ ] `code` command
data/bin/code ADDED
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "optparse"
4
+ require_relative "../lib/code-ruby"
5
+
6
+ options = { timeout: 0, profile: false, profiler: "text" }
7
+
8
+ OptionParser
9
+ .new do |opts|
10
+ opts.banner = "Usage: template [options]"
11
+
12
+ opts.on(
13
+ "-v",
14
+ "--version",
15
+ "Version of template"
16
+ ) do |input|
17
+ puts Code::Version
18
+ exit
19
+ end
20
+
21
+ opts.on(
22
+ "-i INPUT",
23
+ "--input=INPUT",
24
+ "Input in the code language (String or File)"
25
+ ) do |input|
26
+ input = File.read(input) if File.exist?(input)
27
+
28
+ options[:input] = input
29
+ end
30
+
31
+ opts.on(
32
+ "-c CONTEXT",
33
+ "--context=CONTEXT",
34
+ "Context in the code language (String or File)"
35
+ ) do |context|
36
+ context = File.read(context) if File.exist?(context)
37
+
38
+ options[:context] = context
39
+ end
40
+
41
+ opts.on("-p", "--parse", "Get parser results for input") do |parse|
42
+ options[:parse] = parse
43
+ end
44
+
45
+ opts.on(
46
+ "-t TIMEOUT",
47
+ "--timeout=TIMEOUT",
48
+ "Set timeout in seconds"
49
+ ) { |timeout| options[:timeout] = timeout.to_f }
50
+
51
+ opts.on(
52
+ "--profile",
53
+ "Profile Ruby code"
54
+ ) do |timeout|
55
+ require "ruby-prof"
56
+ options[:profile] = true
57
+ end
58
+
59
+ opts.on(
60
+ "--profiler TYPE",
61
+ "Profiler output type (text (default) or html)"
62
+ ) do |profiler|
63
+ require "ruby-prof"
64
+ options[:profile] = true
65
+ options[:profiler] = profiler
66
+ end
67
+ end
68
+ .parse!
69
+
70
+ input = options.fetch(:input, "")
71
+ context = options.fetch(:context, "")
72
+
73
+ if options[:profile]
74
+ RubyProf.start
75
+ end
76
+
77
+ if options[:parse]
78
+ pp Code::Parser.parse(input).to_raw
79
+ else
80
+ print Code.evaluate(input, context, io: $stdout, timeout: options[:timeout])
81
+ end
82
+
83
+ if options[:profile]
84
+ result = RubyProf.stop
85
+ if options[:profiler] == "text"
86
+ printer = RubyProf::FlatPrinter.new(result)
87
+ printer.print($stdout)
88
+ elsif options[:profiler] == "html"
89
+ printer = RubyProf::GraphHtmlPrinter.new(result)
90
+ printer.print($stdout)
91
+ else
92
+ abort "#{options[:profiler]} not recognized"
93
+ end
94
+ end
data/code-ruby.gemspec CHANGED
@@ -12,7 +12,9 @@ Gem::Specification.new do |s|
12
12
  s.require_paths = ["lib"]
13
13
  s.homepage = "https://github.com/dorianmariefr/code-ruby"
14
14
  s.license = "MIT"
15
+ s.executables = "code"
15
16
 
16
17
  s.add_dependency "zeitwerk", "~> 2"
17
18
  s.add_dependency "language-ruby", "~> 0"
19
+ s.add_dependency "bigdecimal", "~> 3"
18
20
  end
@@ -71,6 +71,9 @@ class Code
71
71
  when "size"
72
72
  sig(args)
73
73
  code_size
74
+ when "sum"
75
+ sig(args)
76
+ code_sum
74
77
  when "uniq"
75
78
  sig(args)
76
79
  code_uniq
@@ -197,6 +200,10 @@ class Code
197
200
  List.new(raw.uniq)
198
201
  end
199
202
 
203
+ def code_sum
204
+ raw.inject(&:code_plus) || Nothing.new
205
+ end
206
+
200
207
  def inspect
201
208
  to_s
202
209
  end
data/lib/code/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  require_relative "../code"
2
2
 
3
- Code::Version = Gem::Version.new("0.6.0")
3
+ Code::Version = Gem::Version.new("0.6.2")
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe Code::Object::List do
6
+ [
7
+ ["[] == []", "true"],
8
+ ["[1, 2, 3].sum", "6"],
9
+ ].each do |input, expected|
10
+ it "#{input} == #{expected}" do
11
+ expect(Code.evaluate(input)).to eq(Code.evaluate(expected))
12
+ end
13
+ end
14
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: code-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dorian Marié
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-24 00:00:00.000000000 Z
11
+ date: 2024-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: zeitwerk
@@ -38,15 +38,32 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bigdecimal
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3'
41
55
  description: 'A programming language, like Code.evaluate("1 + 1") # => 2'
42
56
  email: dorian@dorianmarie.fr
43
- executables: []
57
+ executables:
58
+ - code
44
59
  extensions: []
45
60
  extra_rdoc_files: []
46
61
  files:
47
62
  - ".rspec"
48
63
  - Gemfile
49
64
  - Gemfile.lock
65
+ - README.md
66
+ - bin/code
50
67
  - code-ruby.gemspec
51
68
  - lib/code-ruby.rb
52
69
  - lib/code.rb
@@ -151,6 +168,7 @@ files:
151
168
  - spec/code/object/dictionary_spec.rb
152
169
  - spec/code/object/function_spec.rb
153
170
  - spec/code/object/integer_spec.rb
171
+ - spec/code/object/list_spec.rb
154
172
  - spec/code/object/nothing_spec.rb
155
173
  - spec/code/object/range_spec.rb
156
174
  - spec/code/parser/boolean_spec.rb
@@ -185,7 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
203
  - !ruby/object:Gem::Version
186
204
  version: '0'
187
205
  requirements: []
188
- rubygems_version: 3.4.22
206
+ rubygems_version: 3.5.5
189
207
  signing_key:
190
208
  specification_version: 4
191
209
  summary: A programming language
@@ -196,6 +214,7 @@ test_files:
196
214
  - spec/code/object/dictionary_spec.rb
197
215
  - spec/code/object/function_spec.rb
198
216
  - spec/code/object/integer_spec.rb
217
+ - spec/code/object/list_spec.rb
199
218
  - spec/code/object/nothing_spec.rb
200
219
  - spec/code/object/range_spec.rb
201
220
  - spec/code/parser/boolean_spec.rb