rufus-lua 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,6 +2,23 @@
2
2
  = rufus-lua CHANGELOG.txt
3
3
 
4
4
 
5
+ == rufus-lua - 1.1.1 released 2014/07/01
6
+
7
+ - move from bacon to rspec
8
+ - remove double VERSION (Nathanael Jones - https://github.com/nathanaeljones)
9
+ - load only one Lua lib (Thanks Nathanael)
10
+ - add Rufus::Lua::Lib.path to learn which Lua lib got loaded (idea Nathanael)
11
+ - set `ffi_lib_flags(:lazy, :global)` before loading Lua (thanks Nathanael)
12
+ - fix panic error when creating new Rufus::Lua::State with specific
13
+ list of lib to load (fix by Matthew Nielsen - https://github.com/xunker)
14
+ - read back Lua strings containing \0 bytes (thanks Nathanael Jones)
15
+ - let Ruby strings containing \0 bytes go to the Lua side freely (thanks NJ)
16
+ - enhanced Rufus::Lua::LuaError by adding filename and lineno - based on
17
+ a suggestion by Nathanael Jones)
18
+ - enhanced Rufus::Lua::State#eval by adding optional 'filename' and 'lineno'
19
+ arguments (like Kernel.eval) (hint by Nathanael Jones)
20
+
21
+
5
22
  == rufus-lua - 1.1.0 released 2009/09/30
6
23
 
7
24
  - todo : Ruby symbols are passed to Lua as strings (Scott)
@@ -4,11 +4,16 @@
4
4
 
5
5
  == authors
6
6
 
7
- John Mettraux http://jmettraux.wordpress.com
7
+ John Mettraux http://jmettraux.lambda.io
8
8
  Alain Hoang http://blogs.law.harvard.edu/hoanga/
9
- Scott Persinger http://github.com/scottpersinger
9
+ Scott Persinger https://github.com/scottpersinger
10
10
 
11
11
 
12
+ == contributors
13
+
14
+ Matthew Nielsen https://github.com/xunker
15
+ Nathanael Jones https://github.com/nathanaeljones
16
+
12
17
  == inspiration
13
18
 
14
19
  http://rubyluabridge.rubyforge.org/
@@ -1,5 +1,5 @@
1
1
 
2
- Copyright (c) 2009, John Mettraux, Alain Hoang.
2
+ Copyright (c) 2009-2014, John Mettraux, Alain Hoang.
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,263 @@
1
+
2
+ # rufus-lua
3
+
4
+ [![Gem Version](https://badge.fury.io/rb/rufus-lua.png)](http://badge.fury.io/rb/rufus-lua)
5
+
6
+ Lua embedded in Ruby, via Ruby FFI.
7
+
8
+ (Lua 5.1.x only, sorry).
9
+
10
+
11
+ ## Lua
12
+
13
+ http://www.lua.org/about.html says :
14
+
15
+
16
+ > Lua is a powerful, fast, lightweight, embeddable scripting language.
17
+ >
18
+ > Lua combines simple procedural syntax with powerful data description
19
+ > constructs based on associative arrays and extensible semantics. Lua is
20
+ > dynamically typed, runs by interpreting bytecode for a register-based
21
+ > virtual machine, and has automatic memory management with incremental
22
+ > garbage collection, making it ideal for configuration, scripting, and
23
+ > rapid prototyping.
24
+
25
+ http://www.lua.org/
26
+
27
+
28
+ ## other Ruby and Lua bridges / connectors
29
+
30
+ * https://github.com/glejeune/ruby-lua by Gregoire Lejeune
31
+ * http://rubyluabridge.rubyforge.org/ by Evan Wies
32
+ * https://github.com/whitequark/rlua by Peter Zotov
33
+
34
+
35
+ ## getting Lua on your system
36
+
37
+ On Debian GNU/Linux, I do
38
+
39
+ ```
40
+ sudo apt-get install liblua5.1-0
41
+ ```
42
+
43
+ If your system's package manager doesn't have some version (5.1.x) of Lua around, jump to [compiling liblua.dylib](#compiling-libluadylib) below.
44
+
45
+ Rufus-lua will look for library in a [list of know places](https://github.com/jmettraux/rufus-lua/blob/9ddf26cde9f4a73115032504ad7f7eb688849b73/lib/rufus/lua/lib.rb#L38-L50).
46
+
47
+ If it doesn't find the Lua dynamic library or if it picks the wrong one, it's OK to set the `LUA_LIB` environment variable. For example:
48
+
49
+ ```bash
50
+ LUA_LIB=~/mystuff/lualib.5.1.4.so ruby myluacode.rb
51
+ ```
52
+ or
53
+ ```bash
54
+ export LUA_LIB=~/mystuff/lualib.5.1.4.so
55
+ # ...
56
+ ruby myluacode.rb
57
+ ```
58
+
59
+
60
+
61
+ ## using rufus-lua
62
+
63
+ ```
64
+ gem install rufus-lua
65
+ ```
66
+
67
+ or add to your Gemfile:
68
+
69
+ ```ruby
70
+ gem 'rufus-lua'
71
+ ```
72
+
73
+ then
74
+
75
+ ```ruby
76
+ require 'rufus-lua'
77
+
78
+ s = Rufus::Lua::State.new
79
+
80
+ puts s.eval("return table.concat({ 'hello', 'from', 'Lua' }, ' ')")
81
+ #
82
+ # => "Hello from Lua"
83
+
84
+ s.close
85
+ ```
86
+
87
+
88
+ ### binding Ruby code as Lua functions
89
+
90
+ ```ruby
91
+ require 'rufus-lua'
92
+
93
+ s = Rufus::Lua::State.new
94
+
95
+ s.function 'key_up' do |table|
96
+ table.inject({}) do |h, (k, v)|
97
+ h[k.to_s.upcase] = v
98
+ end
99
+ end
100
+
101
+ p s.eval(%{
102
+ local table = { CoW = 2, pigs = 3, DUCKS = 'none' }
103
+ return key_up(table) -- calling Ruby from Lua...
104
+ }).to_h
105
+ # => { 'COW' => 2.0, 'DUCKS => 'none', 'PIGS' => 3.0 }
106
+
107
+ s.close
108
+ ```
109
+
110
+
111
+ It's OK to bind a function inside of a table (library):
112
+
113
+ ```ruby
114
+ require 'rufus-lua'
115
+
116
+ s = Rufus::Lua::State.new
117
+
118
+ s.eval("rubies = {}")
119
+ s.function 'add' do |x, y|
120
+ x + y
121
+ end
122
+
123
+ s.eval("rubies.add(1, 2)")
124
+ # => 3.0
125
+
126
+ s.close
127
+ ```
128
+
129
+
130
+ You can omit the table definition (only 1 level allowed here though):
131
+
132
+ ```ruby
133
+ require 'rufus-lua'
134
+
135
+ s = Rufus::Lua::State.new
136
+
137
+ s.function 'rubies.add' do |x, y|
138
+ x + y
139
+ end
140
+
141
+ s.eval("rubies.add(1, 2)")
142
+ # => 3.0
143
+
144
+ s.close
145
+ ```
146
+
147
+
148
+ The specs contain more examples:
149
+
150
+ https://github.com/jmettraux/rufus-lua/tree/master/spec/
151
+
152
+
153
+ ### eval(code[, binding[, filename[, lineno ]]])
154
+
155
+ The examples so far have shown `Rufus::Lua::State#eval` being used with a single argument, a piece of code.
156
+
157
+ But this rufus-lua eval mimics the Ruby `eval` and lets one specify binding, filename and lineno.
158
+
159
+ (TODO) Binding hasn't yet been implemented. It'll probaby be with `setfenv` but nothing sure yet. Stick a `nil` to it for now.
160
+
161
+ The string of Lua code may come from wild places, it may help to flag it with arbitrary filename and lineno.
162
+
163
+ ```ruby
164
+ require 'rufus-lua'
165
+
166
+ lua = Rufus::Lua::State.new
167
+
168
+ lua.eval('print("hello")', nil, 'myluastuff/hello.lua', 77)
169
+ ```
170
+
171
+
172
+ ## compiling liblua.dylib
173
+
174
+ original instructions by Adrian Perez at:
175
+
176
+ http://lua-users.org/lists/lua-l/2006-09/msg00894.html
177
+
178
+ get the source at:
179
+
180
+ http://www.lua.org/ftp/lua-5.1.4.tar.gz
181
+
182
+ then
183
+
184
+ ```
185
+ tar xzvf lua-5.1.4.tar.gz
186
+ cd lua-5.1.4
187
+ ```
188
+
189
+ Modify the file `src/Makefile` as per http://lua-users.org/lists/lua-l/2006-09/msg00894.html
190
+
191
+ It's mostly about adding that rule to the `src/Makefile`:
192
+ ```make
193
+ liblua.dylib: $(CORE_O) $(LIB_O)
194
+ $(CC) -dynamiclib -o $@ $^ $(LIBS)
195
+ ```
196
+
197
+ Here's how to build the library file and deploy it:
198
+ ```
199
+ make
200
+ make macosx # or make linux ...
201
+ make -C src liblua.dylib
202
+ sudo cp src/liblua.dylib /usr/local/lib/
203
+
204
+ sudo make macosx install
205
+ ```
206
+
207
+ I tend to copy the lib with
208
+
209
+ ```
210
+ sudo cp src/liblua.dylib /usr/local/lib/liblua.5.1.4.dylib
211
+
212
+ # instead of
213
+ #sudo cp src/liblua.dylib /usr/local/lib/
214
+ ```
215
+
216
+
217
+ ## tested with
218
+
219
+ ruby 1.8.7p72, ruby 1.9.1p0, jruby 1.2.0
220
+ jruby 1.1.6 has an issue with errors raised inside of Ruby functions (callbacks)
221
+
222
+ ruby-ffi 0.4.0 and 0.5.0
223
+
224
+ I run the specs with
225
+
226
+ ```
227
+ bundle install # first time only
228
+ bundle exec rspec
229
+ ```
230
+
231
+
232
+ ## dependencies
233
+
234
+ the ruby gem 'ffi'
235
+
236
+
237
+ ## issue tracker
238
+
239
+ http://github.com/jmettraux/rufus-lua/issues
240
+
241
+
242
+ ## source
243
+
244
+ http://github.com/jmettraux/rufus-lua
245
+
246
+ ```
247
+ git clone git://github.com/jmettraux/rufus-lua.git
248
+ ```
249
+
250
+
251
+ ## authors and credits
252
+
253
+ see [CREDITS.txt](CREDITS.txt)
254
+
255
+
256
+ ## license
257
+
258
+ MIT
259
+
260
+ Lua itself is licensed under the MIT license as well :
261
+
262
+ http://www.lua.org/license.html
263
+
@@ -0,0 +1,82 @@
1
+
2
+ $:.unshift('.') # 1.9.2
3
+
4
+ require 'rake'
5
+ require 'rake/clean'
6
+ require 'rspec/core/rake_task'
7
+
8
+
9
+ #
10
+ # clean
11
+
12
+ CLEAN.include('pkg', 'rdoc')
13
+
14
+
15
+ #
16
+ # test / spec
17
+
18
+ RSpec::Core::RakeTask.new
19
+
20
+ task :test => :spec
21
+ task :default => :spec
22
+
23
+
24
+ #
25
+ # gem
26
+
27
+ GEMSPEC_FILE = Dir['*.gemspec'].first
28
+ GEMSPEC = eval(File.read(GEMSPEC_FILE))
29
+ GEMSPEC.validate
30
+
31
+
32
+ desc %{
33
+ builds the gem and places it in pkg/
34
+ }
35
+ task :build do
36
+
37
+ sh "gem build #{GEMSPEC_FILE}"
38
+ sh "mkdir pkg" rescue nil
39
+ sh "mv #{GEMSPEC.name}-#{GEMSPEC.version}.gem pkg/"
40
+ end
41
+
42
+ desc %{
43
+ builds the gem and pushes it to rubygems.org
44
+ }
45
+ task :push => :build do
46
+
47
+ sh "gem push pkg/#{GEMSPEC.name}-#{GEMSPEC.version}.gem"
48
+ end
49
+
50
+
51
+ ##
52
+ ## rdoc
53
+ ##
54
+ ## make sure to have rdoc 2.5.x to run that
55
+ #
56
+ #Rake::RDocTask.new do |rd|
57
+ #
58
+ # rd.main = 'README.txt'
59
+ # rd.rdoc_dir = "rdoc/#{GEMSPEC.name}"
60
+ #
61
+ # rd.rdoc_files.include('README.mdown', 'CHANGELOG.txt', 'lib/**/*.rb')
62
+ #
63
+ # rd.title = "#{GEMSPEC.name} #{GEMSPEC.version}"
64
+ #end
65
+ #
66
+ #
67
+ ##
68
+ ## upload_rdoc
69
+ #
70
+ #desc %{
71
+ # upload the rdoc to rubyforge
72
+ #}
73
+ #task :upload_rdoc => [ :clean, :rdoc ] do
74
+ #
75
+ # account = 'jmettraux@rubyforge.org'
76
+ # webdir = '/var/www/gforge-projects/rufus'
77
+ #
78
+ # sh "rsync -azv -e ssh rdoc/#{GEMSPEC.name} #{account}:#{webdir}/"
79
+ #end
80
+ #
81
+ # keep that in the fridge for now
82
+
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009, John Mettraux, Alain Hoang.
2
+ # Copyright (c) 2009-2014, John Mettraux, Alain Hoang.
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  # of this software and associated documentation files (the "Software"), to deal
@@ -22,8 +22,11 @@
22
22
  # Made in Japan.
23
23
  #++
24
24
 
25
+ require 'rufus/lua/version'
26
+
25
27
  require 'rufus/lua/lib'
26
28
 
29
+ require 'rufus/lua/error'
27
30
  require 'rufus/lua/state'
28
31
  require 'rufus/lua/utils'
29
32
  require 'rufus/lua/objects'
@@ -0,0 +1,86 @@
1
+ #--
2
+ # Copyright (c) 2009-2014, John Mettraux, Alain Hoang.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
25
+
26
+ module Rufus::Lua
27
+
28
+ #
29
+ # An error class for rufus-lua.
30
+ #
31
+ class LuaError < RuntimeError
32
+
33
+ attr_reader :kind, :errcode, :msg
34
+ attr_reader :binding, :filename, :lineno
35
+
36
+ attr_reader :original_backtrace
37
+
38
+ def initialize(kind, errcode, msg, binding, filename, lineno)
39
+
40
+ super("#{kind} : '#{msg}' (#{errcode})")
41
+
42
+ @kind = kind
43
+ @errcode = errcode
44
+ @msg = msg
45
+
46
+ @binding = binding
47
+ @filename = filename
48
+ @lineno = lineno
49
+ end
50
+
51
+ def filename
52
+
53
+ return @filename if @filename
54
+
55
+ m = CALLER_REX.match(backtrace.first || '')
56
+ return m ? m[1] : nil
57
+ end
58
+
59
+ def lineno
60
+
61
+ return @lineno if @lineno
62
+
63
+ m = CALLER_REX.match(backtrace.first || '')
64
+ return m ? m[2].to_i : -1
65
+ end
66
+
67
+ def set_backtrace(trace)
68
+
69
+ @original_backtrace = trace
70
+
71
+ trace =
72
+ trace.select { |line|
73
+ m = CALLER_REX.match(line)
74
+ ( ! m) || File.dirname(m[1]) != DIR
75
+ }
76
+
77
+ trace.insert(0, "#{@filename}:#{@lineno}:") if @filename
78
+
79
+ super(trace)
80
+ end
81
+
82
+ CALLER_REX = /^(.+):(\d+):/
83
+ DIR = File.dirname(__FILE__)
84
+ end
85
+ end
86
+