sweet-moon 0.0.6 → 0.0.7

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: 46891cd3e8103176f3f909415432df155df1bd33cbed89a80f0042f5d303a2b7
4
- data.tar.gz: af7617e43eacc588135285dbd652f644d9bda8b87735c86ff89a7719ce6bfe1a
3
+ metadata.gz: 880cceae5913b9a748b5b318bfc27c56ccf58d7ae54b7f31f8aeea943c524aac
4
+ data.tar.gz: ab2abc87ef9ead4ea7be474963a92ad647326ec6d4ad1bfec62ed20d103d4e4c
5
5
  SHA512:
6
- metadata.gz: 1949e5f83c00dd65cdf78e2e8ebd4f66654dc24df1769add99ad8f01e75cc97bcb090e9d0dc0cf5d10dcdd4d1d338252b4ad78894bd3d4cef40b91ae31aab3d0
7
- data.tar.gz: 9a09f1231c7e02250f232e368abd95b7bb1b4d5e366ef2614ce9871248c49201fb480b8b698833df66d769e7688602e8c3415a454366ef5ad3ede02163e1c5a4
6
+ metadata.gz: 1b613dba97c24527e3e71a8bd7c6d14cd98edcd9a0083a85463a3300f05886a81da33ea5c515108fe523ed43ab012760954edd40dacec4aa38a250e6846b3906
7
+ data.tar.gz: c8c09f0f1bc7cde58c789975b84491399af843b8d95cb69bd3600dbb4c22a056f232e99eea50d3af969ebea6fa298bd86214a596d7ab67afe5c4a209d8a43fa3
data/README.md CHANGED
@@ -28,6 +28,7 @@ _Sweet Moon_ is a resilient solution that makes working with [Lua](https://www.l
28
28
  - [Fennel](#fennel)
29
29
  - [Fennel Usage](#fennel-usage)
30
30
  - [Fennel Global vs Local Variables](#fennel-global-vs-local-variables)
31
+ - [allowedGlobals and options](#allowedglobals-and-options)
31
32
  - [Fennel Setup](#fennel-setup)
32
33
  - [Integration with fnx](#integration-with-fnx)
33
34
  - [Fennel REPL](#fennel-repl)
@@ -74,7 +75,7 @@ gem install sweet-moon
74
75
  > **Disclaimer:** It's an early-stage project, and you should expect breaking changes.
75
76
 
76
77
  ```ruby
77
- gem 'sweet-moon', '~> 0.0.6'
78
+ gem 'sweet-moon', '~> 0.0.7'
78
79
  ```
79
80
 
80
81
  ```ruby
@@ -445,6 +446,16 @@ second = state.get(:second)
445
446
  second.([%w[a b c]]) # => 'b'
446
447
  ```
447
448
 
449
+ Alternatively, you can send the `outputs` parameter:
450
+
451
+ ```ruby
452
+ require 'sweet-moon'
453
+
454
+ state = SweetMoon::State.new
455
+
456
+ state.eval('return "a", "b"', { outputs: 2 }) # => ['a', 'b']
457
+ ```
458
+
448
459
  You can call Ruby _Lambdas_ from _Lua_ as well:
449
460
 
450
461
  ```ruby
@@ -821,6 +832,71 @@ fennel.eval('var-b') # => nil
821
832
  fennel.eval('_G.var-b') # => 35
822
833
  ```
823
834
 
835
+ ### allowedGlobals and options
836
+
837
+ As Lua, Fennel functions may return [multiple results](https://www.lua.org/pil/5.1.html), so `eval` and `load` accept a second parameter to indicate the expected number of outputs:
838
+
839
+ ```fnl
840
+ ; source.fnl
841
+
842
+ (fn multi [] (values "c" "d"))
843
+
844
+ (multi)
845
+ ```
846
+
847
+ ```ruby
848
+ require 'sweet-moon'
849
+
850
+ fennel = SweetMoon::State.new.fennel
851
+
852
+ fennel.eval('(values "a" "b")', 2) # => ['a', 'b']
853
+ fennel.load('source.fnl', 2) # => ['c', 'd']
854
+ ```
855
+
856
+ The Fennel API offers [some options](https://fennel-lang.org/api) that `eval` and `load` accept as a third parameter:
857
+
858
+ ```ruby
859
+ require 'sweet-moon'
860
+
861
+ fennel = SweetMoon::State.new.fennel
862
+
863
+ fennel.eval('(print (+ 2 3))', 1, { allowedGlobals: ['print'] }) # => 5
864
+
865
+ fennel.eval('(print (+ 2 3))', 1, { allowedGlobals: [] })
866
+ # Compile error in unknown:1 (SweetMoon::Errors::LuaRuntimeError)
867
+ # unknown identifier in strict mode: print
868
+
869
+ # (print (+ 2 3))
870
+ # ^^^^^
871
+ # * Try looking to see if there's a typo.
872
+ # * Try using the _G table instead, eg. _G.print if you really want a global.
873
+ # * Try moving this code to somewhere that print is in scope.
874
+ # * Try binding print as a local in the scope of this code.
875
+ ```
876
+
877
+ Alternatively, you can use the second parameter for options as well:
878
+
879
+ ```ruby
880
+ require 'sweet-moon'
881
+
882
+ fennel = SweetMoon::State.new.fennel
883
+
884
+ fennel.eval('(print (+ 2 3))', { allowedGlobals: ['print'] }) # => 5
885
+ ```
886
+
887
+ You can also specify the expected outputs in the options parameter (it will be removed and not forwarded to Fennel):
888
+
889
+ ```ruby
890
+ require 'sweet-moon'
891
+
892
+ fennel = SweetMoon::State.new.fennel
893
+
894
+ fennel.eval(
895
+ '(values "a" "b")',
896
+ { allowedGlobals: ['values'], outputs: 2 }
897
+ ) # => ['a', 'b']
898
+ ```
899
+
824
900
  ### Fennel Setup
825
901
 
826
902
  To ensure that the Fennel module is available, you can set up the [_LuaRocks_](#integration-withluarocks) integration or manually add the `package_path` for the module.
@@ -1,6 +1,6 @@
1
1
  # Available at https://github.com/gbaptista/sweet-moon-test
2
2
 
3
- fennel-dev: '/home/me/sweet-moon-test/fennel/dev/?.lua'
3
+ fennel-dev: '/home/gbaptista/Fennel/?.lua'
4
4
 
5
5
  luarocks:
6
6
  expected: ['dkjson', 'supernova', 'readline']
data/dsl/fennel.rb CHANGED
@@ -20,12 +20,16 @@ module DSL
20
20
  build_meta
21
21
  end
22
22
 
23
- def eval(input, outputs = 1)
24
- @eval.([input], outputs)
23
+ def eval(input, first = nil, second = nil)
24
+ options = _build_options(first, second)
25
+
26
+ @eval.([input, options[:options]], options[:outputs])
25
27
  end
26
28
 
27
- def load(path, outputs = 1)
28
- @dofile.([path], outputs)
29
+ def load(path, first = nil, second = nil)
30
+ options = _build_options(first, second)
31
+
32
+ @dofile.([path, options[:options]], options[:outputs])
29
33
  end
30
34
 
31
35
  def build_meta
data/dsl/state.rb CHANGED
@@ -28,11 +28,19 @@ module DSL
28
28
  end
29
29
 
30
30
  def eval(input, outputs = 1)
31
- @controller[:eval!].(@api, @interpreter, state, input, outputs)[:output]
31
+ options = _build_options(outputs, nil)
32
+
33
+ @controller[:eval!].(
34
+ @api, @interpreter, state, input, options[:outputs]
35
+ )[:output]
32
36
  end
33
37
 
34
38
  def load(path, outputs = 1)
35
- @controller[:load!].(@api, @interpreter, state, path, outputs)[:output]
39
+ options = _build_options(outputs, nil)
40
+
41
+ @controller[:load!].(
42
+ @api, @interpreter, state, path, options[:outputs]
43
+ )[:output]
36
44
  end
37
45
 
38
46
  def get(variable, key = nil)
@@ -56,6 +64,22 @@ module DSL
56
64
  nil
57
65
  end
58
66
 
67
+ def _build_options(first, second)
68
+ options = { outputs: 1 }
69
+
70
+ options = options.merge(first) if first.is_a? Hash
71
+ options = options.merge(second) if second.is_a? Hash
72
+
73
+ options[:outputs] = first if first.is_a? Numeric
74
+ options[:outputs] = second if second.is_a? Numeric
75
+
76
+ outputs = options[:outputs] if options[:outputs]
77
+
78
+ options.delete(:outputs)
79
+
80
+ { options: options, outputs: outputs }
81
+ end
82
+
59
83
  def _ensure_min_version!(purpose, lua, jit = nil)
60
84
  version = lua
61
85
  version = jit if meta.interpreter[/jit/] && jit
@@ -113,8 +137,7 @@ module DSL
113
137
 
114
138
  def state
115
139
  unless @state
116
- raise SweetMoon::Errors::SweetMoonError,
117
- 'The state no longer exists.'
140
+ raise SweetMoon::Errors::SweetMoonError, 'The state no longer exists.'
118
141
  end
119
142
 
120
143
  @state
data/logic/spec.rb CHANGED
@@ -2,7 +2,7 @@ module Logic
2
2
  Spec = {
3
3
  name: 'sweet-moon',
4
4
  command: 'sweet-moon',
5
- version: '0.0.6',
5
+ version: '0.0.7',
6
6
  author: 'gbaptista',
7
7
  summary: 'Lua / Fennel from Ruby and vice versa. Support to LuaJIT, Lua 5.0, ' \
8
8
  'and 5.1. Lua C API for Lua 5, 4, and 3. LuaRocks and fnx integration.',
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sweet-moon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - gbaptista
8
8
  autorequire:
9
9
  bindir: ports/in/shell
10
10
  cert_chain: []
11
- date: 2022-03-27 00:00:00.000000000 Z
11
+ date: 2022-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi