nodo 1.6.2 → 1.6.3

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: 95d8c9823753373c6be5ad0c493e7f14346950b611d4ca0d90c5a96bcabfa5e6
4
- data.tar.gz: 3ad4b37694f4ef33cfadad03794ce7b4bf2a9fd42dc4e0abb319ec981e529b33
3
+ metadata.gz: 42cd6c0e3e07674ceb2f10dd670c490b7f23ed6534f22f978a40e0b91d529570
4
+ data.tar.gz: b560df0c25e2b72842e6d6d5be610503252069bfd1741fb2cd9228066d28f91e
5
5
  SHA512:
6
- metadata.gz: 0e0004a84541cb4edd4cc398250fe17ee5623aed13f1bbb76b31eee531867906cffd87c5e0f71b50c0c72fdae4f26e57d24f654fdd2623bee90b20c60f3ff0b4
7
- data.tar.gz: 539b75f4a8283f4db872db614158403129651f4b0811d9e7f9ef5dfa1f506bedcf238fa0b93896fe776ae936bbc8eba9cbd44ea86fa8f80b87142e5d69cfe957
6
+ metadata.gz: 012ed2197c0ea3e519884b3295a62986158326027adb08c484fbf87903874763594fe72236bebcc01f47a919a4893ef92cdc7a14b1f8ad02da7ea527ae5eab38
7
+ data.tar.gz: 6a953be3a789671c966248dcc385740c5964ad0bbb370411d93cdc44ee7ea129c14537d73c08e7a44eb4c19ca1bc2b5465873bec65fd4d56884ba9ed339981d6
data/README.md CHANGED
@@ -131,6 +131,23 @@ class BarFoo < Nodo::Core
131
131
  end
132
132
  ```
133
133
 
134
+ With the above syntax, the script code will be generated during class definition
135
+ time. In order to have the code generated when the first instance is created, the
136
+ code can be defined inside a block:
137
+
138
+ ```ruby
139
+ class Foo < Nodo::Core
140
+ script do
141
+ <<~JS
142
+ var definitionTime = #{Time.now.to_json};
143
+ JS
144
+ end
145
+ end
146
+ ```
147
+
148
+ Note that the script will still be executed only once, when the first instance
149
+ of class is created.
150
+
134
151
  ### Inheritance
135
152
 
136
153
  Subclasses will inherit functions, constants, dependencies and scripts from
@@ -168,6 +185,37 @@ class SyncFoo < Nodo::Core
168
185
  end
169
186
  ```
170
187
 
188
+ ### Deferred function definition
189
+
190
+ By default, the function code string literal is created when the class
191
+ is defined. Therefore any string interpolation inside the code will take
192
+ place at definition time.
193
+
194
+ In order to defer the code generation until the first object instantiation,
195
+ the function code can be given inside a block:
196
+
197
+ ```ruby
198
+ class Deferred < Nodo::Core
199
+ function :now, <<~JS
200
+ () => { return #{Time.now.to_json}; }
201
+ JS
202
+
203
+ function :later do
204
+ <<~JS
205
+ () => { return #{Time.now.to_json}; }
206
+ JS
207
+ end
208
+ end
209
+
210
+ instance = Deferred.new
211
+ sleep 5
212
+ instance.now => "2021-10-28 20:30:00 +0200"
213
+ instance.later => "2021-10-28 20:30:05 +0200"
214
+ ```
215
+
216
+ The block will be invoked when the first instance is created. As with deferred
217
+ scripts, it will only be invoked once.
218
+
171
219
  ### Limiting function execution time
172
220
 
173
221
  The default timeout for a single JS function call is 60 seconds and can be
data/lib/nodo/core.rb CHANGED
@@ -111,13 +111,11 @@ module Nodo
111
111
  self.dependencies = dependencies + mods.merge(deps).map { |name, package| Dependency.new(name, package) }
112
112
  end
113
113
 
114
- def function(name, _code = nil, timeout: Nodo.timeout, code: nil)
114
+ def function(name, _code = nil, timeout: Nodo.timeout, code: nil, &block)
115
115
  raise ArgumentError, "reserved method name #{name.inspect}" if reserved_method_name?(name)
116
- code = (code ||= _code).strip
117
- raise ArgumentError, 'function code is required' if '' == code
118
116
  loc = caller_locations(1, 1)[0]
119
117
  source_location = "#{loc.path}:#{loc.lineno}: in `#{name}'"
120
- self.functions = functions.merge(name => Function.new(name, _code || code, source_location, timeout))
118
+ self.functions = functions.merge(name => Function.new(name, _code || code, source_location, timeout, &block))
121
119
  define_method(name) { |*args| call_js_method(name, args) }
122
120
  end
123
121
 
@@ -129,8 +127,8 @@ module Nodo
129
127
  self.constants = constants + [Constant.new(name, value)]
130
128
  end
131
129
 
132
- def script(code)
133
- self.scripts = scripts + [Script.new(code)]
130
+ def script(code = nil, &block)
131
+ self.scripts = scripts + [Script.new(code, &block)]
134
132
  end
135
133
 
136
134
  def nodo_js
@@ -246,7 +244,7 @@ module Nodo
246
244
  request = Net::HTTP::Post.new("/#{clsid}/#{context_id}/#{method}", 'Content-Type': 'application/json')
247
245
  request.body = JSON.dump(args)
248
246
  client = Client.new("unix://#{socket_path}")
249
- client.read_timeout = function.timeout if function
247
+ client.read_timeout = function&.timeout || Nodo.timeout
250
248
  response = client.request(request)
251
249
  if response.is_a?(Net::HTTPOK)
252
250
  parse_response(response)
data/lib/nodo/function.rb CHANGED
@@ -2,12 +2,17 @@ module Nodo
2
2
  class Function
3
3
  attr_reader :name, :code, :source_location, :timeout
4
4
 
5
- def initialize(name, code, source_location, timeout)
6
- @name, @code, @source_location, @timeout = name, code, source_location, timeout
5
+ def initialize(name, code, source_location, timeout, &block)
6
+ raise ArgumentError, 'cannot give code when block is given' if code && block
7
+ code = code.strip if code
8
+ raise ArgumentError, 'function code is required' if '' == code
9
+ raise ArgumentError, 'code is required' unless code || block
10
+ @name, @code, @source_location, @timeout = name, code || block, source_location, timeout
7
11
  end
8
12
 
9
13
  def to_js
10
- "const #{name} = __nodo_klass__.#{name} = (#{code});\n"
14
+ js = code.respond_to?(:call) ? code.call.strip : code
15
+ "const #{name} = __nodo_klass__.#{name} = (#{js});\n"
11
16
  end
12
17
  end
13
18
  end
data/lib/nodo/script.rb CHANGED
@@ -2,12 +2,14 @@ module Nodo
2
2
  class Script
3
3
  attr_reader :code
4
4
 
5
- def initialize(code)
6
- @code = code
5
+ def initialize(code = nil, &block)
6
+ raise ArgumentError, 'cannot give code when block is given' if code && block
7
+ @code = code || block
7
8
  end
8
9
 
9
10
  def to_js
10
- "#{code}\n"
11
+ js = code.respond_to?(:call) ? code.call : code
12
+ "#{js}\n"
11
13
  end
12
14
  end
13
15
  end
data/lib/nodo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nodo
2
- VERSION = '1.6.2'
2
+ VERSION = '1.6.3'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nodo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.2
4
+ version: 1.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthias Grosser