nodo 1.6.2 → 1.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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