isomorfeus-puppetmaster 0.1.0 → 0.2.0

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: 4b481e8e7cbdaf5306f466442b34746e75b94ae25f0b8c0df4f0f9f1f697ae9d
4
- data.tar.gz: '008940290200527c011ec2a629282582943dfb447e0731dfe91c28839844d250'
3
+ metadata.gz: cd75e7d5e87decf7b2360c99c4f17cd80c3f08fe3366bb5d536c61ed24287289
4
+ data.tar.gz: 3ac555d46df4ba4e4884ed25f137e6053c55504ce3b8140844d808298690aff1
5
5
  SHA512:
6
- metadata.gz: 9991f261a20cfc93bed0f58be805beaa0ffd5c6bba33509eac520a334f0ea4efe008005a1b98ef444636785036ecf13ba0bf60a2b2f1282885cdc24b1f3f9e58
7
- data.tar.gz: cc1cec085b651ed9611f3dadc3094143d3b73081e7449e00942954bee77f5d43ae9ec5f5cc3baeba16fe61e048c3d91f6066972cfbc85106739404e25644cfd9
6
+ metadata.gz: 9ad2e07e9036fb54be28d75a2f727a7a088a141eb5961b97ce98c73fa452d9a688029664ae5a7506bd78dbb5a494ba457b6e734cb731fb411b91e7758bdcd733
7
+ data.tar.gz: 0e6a588c8a19722957e1578b9b4dec0fc5d3222c8dbb6b06c6cd48b1640080589b972d90f7b84864cc83c569fa65265d46a020e555b673c685f01d6b6c376d99
data/README.md CHANGED
@@ -2,13 +2,14 @@
2
2
 
3
3
  A framework for acceptance tests or simply running tests in a headless browser.
4
4
  Comes with drivers for chromium headless, firefox and jsdom.
5
+ Allows for writing javascript tests in pure ruby.
5
6
 
6
7
  ## Chat
7
8
  At our [Gitter Isomorfeus Lobby](http://gitter.im/isomorfeus/Lobby)
8
9
 
9
10
  ## Running on:
10
11
  - [CircleCI](https://circleci.com): [![CircleCI](https://circleci.com/gh/isomorfeus/isomorfeus-puppetmaster/tree/master.svg?style=svg)](https://circleci.com/gh/isomorfeus/isomorfeus-puppetmaster/tree/master)
11
- - [SemaphoreCI 2.0](https://semaphoreci.com): (no badge yet, and i dont know how to link to public 2.0 repos)
12
+ - [SemaphoreCI 2.0](https://semaphoreci.com): (not yet available)
12
13
  - [TravisCI](https://travis-ci.org): [![Build Status](https://travis-ci.org/isomorfeus/isomorfeus-puppetmaster.svg?branch=master)](https://travis-ci.org/isomorfeus/isomorfeus-puppetmaster)
13
14
 
14
15
  ## Installation
@@ -107,9 +108,28 @@ Both open documents can then be independently interacted with:
107
108
  doc.visit('/go')
108
109
  doc2.goto('/location')
109
110
  ```
111
+ ### Documents and Ruby
112
+
113
+ Ruby can be executed within documents by simply providing a block or a string:
114
+ ```ruby
115
+ doc.evaluate_ruby do
116
+ $document['my_id'].class_names
117
+ end
118
+
119
+ # or
120
+
121
+ doc.evaluate_ruby "$document['my_id'].class_names"
122
+ ```
123
+
124
+ The complete API of [opal-browser](https://github.com/opal/opal-browser) is available.
110
125
 
111
126
  ### Documents and Javascript
112
127
 
128
+ Javascript can be be evaluated within documents by simply providing a string:
129
+ ```ruby
130
+ doc.evaluate_javascript '1+1' # => 2
131
+ ```
132
+
113
133
  #### Executing Javascript
114
134
 
115
135
  TODO
@@ -2,7 +2,11 @@ require 'active_support/core_ext/string'
2
2
  require 'uri'
3
3
  require 'net/http'
4
4
  require 'rack'
5
-
5
+ require 'opal'
6
+ require 'opal-browser'
7
+ require 'unparser'
8
+ require 'method_source'
9
+ require 'securerandom'
6
10
  require 'isomorfeus-speednode'
7
11
 
8
12
  # use execjs speednode for sure, unless something else has been specified
@@ -10,6 +14,8 @@ unless ENV["EXECJS_RUNTIME"]
10
14
  ExecJS.runtime = ExecJS::Runtimes::Speednode
11
15
  end
12
16
 
17
+ # require 'uglifier'
18
+
13
19
  require 'isomorfeus/puppetmaster'
14
20
  require 'isomorfeus/puppetmaster/self_forwardable'
15
21
  require 'isomorfeus/puppetmaster/errors'
@@ -34,7 +40,7 @@ require 'isomorfeus/puppetmaster/driver/jsdom_document'
34
40
  require 'isomorfeus/puppetmaster/driver/jsdom_node'
35
41
  require 'isomorfeus/puppetmaster/driver/jsdom'
36
42
  require 'isomorfeus/puppetmaster/driver_registration'
37
-
43
+ require 'isomorfeus/puppetmaster/server/executor_middleware'
38
44
  require 'isomorfeus/puppetmaster/server/middleware'
39
45
  require 'isomorfeus/puppetmaster/server/checker'
40
46
  require 'isomorfeus/puppetmaster/server'
@@ -2,13 +2,19 @@ module Isomorfeus
2
2
  module Puppetmaster
3
3
  class << self
4
4
  attr_accessor :app, :server_port, :session
5
- attr_writer :save_path, :server_host, :server_scheme
5
+ attr_writer :download_path, :server_host, :server_scheme
6
6
  attr_reader :served_app, :server
7
7
 
8
8
  def boot_app
9
9
  @served_app = Isomorfeus::Puppetmaster::Server.new(app, port: server_port, host: server_host).boot
10
10
  end
11
11
 
12
+ def block_source_code(&block)
13
+ source_block = Parser::CurrentRuby.parse(block.source).children.last
14
+ source_block = source_block.children.last if source_block.type == :block
15
+ Unparser.unparse(source_block)
16
+ end
17
+
12
18
  def driver
13
19
  @driver ||= :chromium
14
20
  end
@@ -22,6 +28,10 @@ module Isomorfeus
22
28
  @drivers ||= {}
23
29
  end
24
30
 
31
+ def opal_prelude
32
+ @opal_prelude ||= build_opal_prelude
33
+ end
34
+
25
35
  def register_driver(name, &block)
26
36
  drivers[name.to_sym] = block
27
37
  end
@@ -30,8 +40,8 @@ module Isomorfeus
30
40
  servers[name.to_sym] = block
31
41
  end
32
42
 
33
- def save_path
34
- @save_path ||= Dir.pwd
43
+ def download_path
44
+ @download_path ||= Dir.pwd
35
45
  end
36
46
 
37
47
  def server=(name)
@@ -57,6 +67,12 @@ module Isomorfeus
57
67
  def servers
58
68
  @servers ||= {}
59
69
  end
70
+
71
+ private
72
+
73
+ def build_opal_prelude
74
+ js = Opal::Builder.new.build_str("require 'opal'\nrequire 'opal-browser'", 'puppetmaster_opal_prelude').to_s
75
+ end
60
76
  end
61
77
  end
62
78
  end
@@ -69,6 +69,24 @@ module Isomorfeus
69
69
  @driver.browser
70
70
  end
71
71
 
72
+ def evaluate_ruby(ruby_source = '', &block)
73
+ ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
74
+ compiled_ruby = compile_ruby_source(ruby_source)
75
+ if compiled_ruby.start_with?('/*')
76
+ start_of_code = compiled_ruby.index('*/') + 3
77
+ compiled_ruby = compiled_ruby[start_of_code..-1]
78
+ end
79
+ javascript = <<~JAVASCRIPT
80
+ (function(){
81
+ if (typeof Opal === "undefined") {
82
+ #{Isomorfeus::Puppetmaster.opal_prelude}
83
+ }
84
+ return #{compiled_ruby}
85
+ })()
86
+ JAVASCRIPT
87
+ evaluate_script(javascript)
88
+ end
89
+
72
90
  def go_back
73
91
  @response = @driver.document_go_back(self)
74
92
  self
@@ -105,6 +123,12 @@ module Isomorfeus
105
123
  body.has_xpath?(query, options)
106
124
  end
107
125
 
126
+ def isomorphic(ruby_source = '', &block)
127
+ ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
128
+ Isomorfeus::Puppetmaster.served_app.on_server(ruby_source)
129
+ evaluate_ruby(ruby_source)
130
+ end
131
+
108
132
  def method_missing(name, *args)
109
133
  method_name = name.to_s
110
134
  if method_name.start_with?('find_by_')
@@ -155,6 +179,13 @@ module Isomorfeus
155
179
  # :assert_no_current_path
156
180
  # assert_title
157
181
  # assert_no_title
182
+
183
+ protected
184
+
185
+ def compile_ruby_source(source_code)
186
+ # TODO maybe use compile server
187
+ Opal.compile(source_code, parse_comments: false)
188
+ end
158
189
  end
159
190
  end
160
191
  end
@@ -91,12 +91,13 @@ module Isomorfeus
91
91
  node_data = await <<~JAVASCRIPT
92
92
  var tt = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
93
93
  node = frame.contentDocument.body;
94
+ var name = node.nodeName;
94
95
  var tag = node.tagName.toLowerCase();
95
96
  var type = null;
96
97
  if (tag === 'input') { type = node.getAttribute('type'); }
97
- return [tag, type];
98
+ return [name, tag, type];
98
99
  }, AllElementHandles[#{frame.handle}]);
99
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1]};
100
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2]};
100
101
  JAVASCRIPT
101
102
  if node_data
102
103
  node_data[:css_selector] = 'body'
@@ -116,12 +117,13 @@ module Isomorfeus
116
117
  node_data = await <<~JAVASCRIPT
117
118
  var tt = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
118
119
  node = frame.contentDocument.head;
120
+ var name = node.nodeName;
119
121
  var tag = node.tagName.toLowerCase();
120
122
  var type = null;
121
123
  if (tag === 'input') { type = node.getAttribute('type'); }
122
- return [tag, type];
124
+ return [name, tag, type];
123
125
  }, AllElementHandles[#{frame.handle}]);
124
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1]};
126
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2]};
125
127
  JAVASCRIPT
126
128
  if node_data
127
129
  node_data[:css_selector] = 'body'
@@ -94,8 +94,9 @@ module Isomorfeus
94
94
  node_data = @context.exec <<~JAVASCRIPT
95
95
  var node = AllDomHandles[#{document.handle}].window.document.body;
96
96
  var node_handle = RegisterElementHandle(node);
97
+ var name = node.nodeName;
97
98
  var tag = node.tagName.toLowerCase();
98
- return {handle: node_handle, tag: tag, type: null, content_editable: node.isContentEditable};
99
+ return {handle: node_handle, name: name, tag: tag, type: null, content_editable: node.isContentEditable};
99
100
  JAVASCRIPT
100
101
  if node_data
101
102
  node_data[:css_selector] = 'body'
@@ -282,8 +283,8 @@ module Isomorfeus
282
283
  def document_evaluate_script(document, script, *args)
283
284
  @context.eval <<~JAVASCRIPT
284
285
  AllDomHandles[#{document.handle}].window.eval(
285
- `var arguments = #{args};
286
- #{script}`
286
+ "var arguments = #{ "#{args}".gsub('"', '\"') };" +
287
+ "#{script.gsub('\\', '\\\\\\').gsub('"', '\"').gsub("\n", "\\n")}"
287
288
  )
288
289
  JAVASCRIPT
289
290
  rescue ExecJS::ProgramError => e
@@ -293,9 +294,9 @@ module Isomorfeus
293
294
  def document_execute_script(document, script, *args)
294
295
  @context.eval <<~JAVASCRIPT
295
296
  AllDomHandles[#{document.handle}].window.eval(
296
- `(function() { var arguments = #{args};
297
- #{script}
298
- })()`
297
+ "(function() { var arguments = #{ "#{args}".gsub('"', '\"') };" +
298
+ "#{script.gsub('\\', '\\\\\\').gsub('"', '\"').gsub("\n", "\\n")}" +
299
+ "})()"
299
300
  )
300
301
  JAVASCRIPT
301
302
  rescue ExecJS::ProgramError => e
@@ -308,10 +309,11 @@ module Isomorfeus
308
309
  var node = AllDomHandles[#{document.handle}].window.document.querySelector("#{js_escaped_selector}");
309
310
  if (node) {
310
311
  var node_handle = RegisterElementHandle(node);
311
- var tag = node.tagName.toLowerCase();
312
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
313
+ var name = node.nodeName;
312
314
  var type = null;
313
315
  if (tag === 'input') { type = node.getAttribute('type'); }
314
- return {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
316
+ return {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
315
317
  }
316
318
  JAVASCRIPT
317
319
  if node_data
@@ -331,11 +333,13 @@ module Isomorfeus
331
333
  var node_data_array = [];
332
334
  if (node_array) {
333
335
  for (var i=0; i<node_array.length; i++) {
336
+ var node = node_array[i];
334
337
  var node_handle = RegisterElementHandle(node_array[i]);
335
- var tag = node.tagName.toLowerCase();
338
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
339
+ var name = node.nodeName;
336
340
  var type = null;
337
341
  if (tag === 'input') { type = node.getAttribute('type'); }
338
- node_data_array.push({handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable});
342
+ node_data_array.push({handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable});
339
343
  }
340
344
  }
341
345
  return node_data_array;
@@ -354,12 +358,13 @@ module Isomorfeus
354
358
  var xpath_result = document.evaluate("#{js_escaped_query}", document, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
355
359
  var node;
356
360
  var node_data_array = [];
357
- while (node = xpath_result.iterateNext) {
361
+ while (node = xpath_result.iterateNext()) {
358
362
  var node_handle = RegisterElementHandle(node);
359
- var tag = node.tagName.toLowerCase();
363
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
364
+ var name = node.nodeName;
360
365
  var type = null;
361
366
  if (tag === 'input') { type = node.getAttribute('type'); }
362
- node_data_array.push({handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable});
367
+ node_data_array.push({handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable});
363
368
  }
364
369
  return node_data_array;
365
370
  JAVASCRIPT
@@ -378,10 +383,11 @@ module Isomorfeus
378
383
  var node = xpath_result.singleNodeValue;
379
384
  if (node) {
380
385
  var node_handle = RegisterElementHandle(node);
381
- var tag = node.tagName.toLowerCase();
386
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
387
+ var name = node.nodeName;
382
388
  var type = null;
383
389
  if (tag === 'input') { type = node.getAttribute('type'); }
384
- return {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
390
+ return {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
385
391
  }
386
392
  JAVASCRIPT
387
393
  if node_data
@@ -467,8 +473,9 @@ module Isomorfeus
467
473
  node_data = @context.exec <<~JAVASCRIPT
468
474
  var node = AllDomHandles[#{document.handle}].window.document.head;
469
475
  var node_handle = RegisterElementHandle(node);
476
+ var name = node.nodeName;
470
477
  var tag = node.tagName.toLowerCase();
471
- return {handle: node_handle, tag: tag, type: null, content_editable: node.isContentEditable};
478
+ return {handle: node_handle, name: name, tag: tag, type: null, content_editable: node.isContentEditable};
472
479
  JAVASCRIPT
473
480
  if node_data
474
481
  node_data[:css_selector] = 'body'
@@ -855,10 +862,11 @@ module Isomorfeus
855
862
  node = AllDomHandles[#{document.handle}].window.document.querySelector("#{js_escaped_selector}");
856
863
  if (node) {
857
864
  var node_handle = RegisterElementHandle(node);
865
+ var name = node.nodeName;
858
866
  var tag = node.tagName.toLowerCase();
859
867
  var type = null;
860
868
  if (tag === 'input') { type = node.getAttribute('type'); }
861
- LastResult = {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
869
+ LastResult = {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
862
870
  resolve(true);
863
871
  }
864
872
  else if ((new Date() - start_time) > #{@jsdom_timeout}) { resolve(true); }
@@ -885,10 +893,11 @@ module Isomorfeus
885
893
  node = xpath_result.singleNodeValue;
886
894
  if (node) {
887
895
  var node_handle = RegisterElementHandle(node);
896
+ var name = node.nodeName;
888
897
  var tag = node.tagName.toLowerCase();
889
898
  var type = null;
890
899
  if (tag === 'input') { type = node.getAttribute('type'); }
891
- LastResult = {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
900
+ LastResult = {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
892
901
  resolve(true);
893
902
  }
894
903
  else if ((new Date() - start_time) > #{@jsdom_timeout}) { resolve(true); }
@@ -228,7 +228,7 @@ module Isomorfeus
228
228
  end
229
229
 
230
230
  def node_execute_script(node, script, *args)
231
- # TODO
231
+ # TODO this wont work yet
232
232
  await <<~JAVASCRIPT
233
233
  var node_handle = #{node.handle};
234
234
  await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
@@ -239,7 +239,7 @@ module Isomorfeus
239
239
  end
240
240
 
241
241
  def node_evaluate_script(node, script, *args)
242
- # TODO
242
+ # TODO this wont work yet
243
243
  await <<~JAVASCRIPT
244
244
  var node_handle = #{node.handle};
245
245
  await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
@@ -256,10 +256,11 @@ module Isomorfeus
256
256
  var node = AllElementHandles[#{node.handle}].querySelector("#{js_escaped_selector}");
257
257
  if (node) {
258
258
  var node_handle = RegisterElementHandle(node);
259
+ var name = node.nodeName;
259
260
  var tag = node.tagName.toLowerCase();
260
261
  var type = null;
261
262
  if (tag === 'input') { type = node.getAttribute('type'); }
262
- return {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
263
+ return {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
263
264
  }
264
265
  JAVASCRIPT
265
266
  if node_data
@@ -280,10 +281,11 @@ module Isomorfeus
280
281
  if (node_array) {
281
282
  for (var i=0; i<node_array.length; i++) {
282
283
  var node_handle = RegisterElementHandle(node_array[i]);
284
+ var name = node_array[i].nodeName;
283
285
  var tag = node_array[i].tagName.toLowerCase();
284
286
  var type = null;
285
287
  if (tag === 'input') { type = node_array[i].getAttribute('type'); }
286
- node_data_array.push({handle: node_handle, tag: tag, type: type, content_editable: node_array[i].isContentEditable});
288
+ node_data_array.push({handle: node_handle, name: name, tag: tag, type: type, content_editable: node_array[i].isContentEditable});
287
289
  }
288
290
  }
289
291
  return node_data_array;
@@ -302,12 +304,13 @@ module Isomorfeus
302
304
  var xpath_result = document.evaluate("#{js_escaped_query}", AllElementHandles[#{node.handle}], null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
303
305
  var node;
304
306
  var node_data_array = [];
305
- while (node = xpath_result.iterateNext) {
307
+ while (node = xpath_result.iterateNext()) {
306
308
  var node_handle = RegisterElementHandle(node);
309
+ var name = node.nodeName;
307
310
  var tag = node.tagName.toLowerCase();
308
311
  var type = null;
309
312
  if (tag === 'input') { type = node.getAttribute('type'); }
310
- node_data_array.push({handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable});
313
+ node_data_array.push({handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable});
311
314
  }
312
315
  return node_data_array;
313
316
  JAVASCRIPT
@@ -326,10 +329,11 @@ module Isomorfeus
326
329
  var node = xpath_result.singleNodeValue;
327
330
  if (node) {
328
331
  var node_handle = RegisterElementHandle(node);
332
+ var name = node.nodeName;
329
333
  var tag = node.tagName.toLowerCase();
330
334
  var type = null;
331
335
  if (tag === 'input') { type = node.getAttribute('type'); }
332
- return {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
336
+ return {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
333
337
  }
334
338
  JAVASCRIPT
335
339
  if node_data
@@ -784,10 +788,11 @@ module Isomorfeus
784
788
  var node = AllElementHandles[#{node.handle}].querySelector("#{js_escaped_selector}");
785
789
  if (node) {
786
790
  var node_handle = RegisterElementHandle(node);
791
+ var name = node.nodeName;
787
792
  var tag = node.tagName.toLowerCase();
788
793
  var type = null;
789
794
  if (tag === 'input') { type = node.getAttribute('type'); }
790
- LastResult = {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
795
+ LastResult = {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
791
796
  resolve(true);
792
797
  }
793
798
  else if ((new Date() - start_time) > #{@jsdom_timeout}) { resolve(true); }
@@ -813,10 +818,11 @@ module Isomorfeus
813
818
  var node = xpath_result.singleNodeValue;
814
819
  if (node) {
815
820
  var node_handle = RegisterElementHandle(node);
821
+ var name = node.nodeName;
816
822
  var tag = node.tagName.toLowerCase();
817
823
  var type = null;
818
824
  if (tag === 'input') { type = node.getAttribute('type'); }
819
- LastResult = {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
825
+ LastResult = {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
820
826
  resolve(true);
821
827
  }
822
828
  else if ((new Date() - start_time) > #{@jsdom_timeout}) { resolve(true); }
@@ -102,12 +102,13 @@ module Isomorfeus
102
102
  node_data = await <<~JAVASCRIPT
103
103
  var tt = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
104
104
  node = frame.contentDocument.body;
105
+ var name = node.nodeName;
105
106
  var tag = node.tagName.toLowerCase();
106
107
  var type = null;
107
108
  if (tag === 'input') { type = node.getAttribute('type'); }
108
- return [tag, type];
109
+ return [name, tag, type];
109
110
  }, AllElementHandles[#{frame.handle}]);
110
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1]};
111
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2]};
111
112
  JAVASCRIPT
112
113
  if node_data
113
114
  node_data[:css_selector] = 'body'
@@ -127,12 +128,13 @@ module Isomorfeus
127
128
  node_data = await <<~JAVASCRIPT
128
129
  var tt = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
129
130
  node = frame.contentDocument.head;
131
+ var name = node.nodeName;
130
132
  var tag = node.tagName.toLowerCase();
131
133
  var type = null;
132
134
  if (tag === 'input') { type = node.getAttribute('type'); }
133
- return [tag, type];
135
+ return [name, tag, type];
134
136
  }, AllElementHandles[#{frame.handle}]);
135
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1]};
137
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2]};
136
138
  JAVASCRIPT
137
139
  if node_data
138
140
  node_data[:css_selector] = 'body'
@@ -371,7 +373,7 @@ module Isomorfeus
371
373
  if (!(BrowserType === 'firefox')) {
372
374
  var target = page.target();
373
375
  var cdp_session = await target.createCDPSession();
374
- await cdp_session.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: '#{Isomorfeus::Puppetmaster.save_path}'});
376
+ await cdp_session.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: '#{Isomorfeus::Puppetmaster.download_path}'});
375
377
  if (#{@url_blacklist}.length > 0) { await cdp_session.send('Network.setBlockedURLs', {urls: #{@url_blacklist}}); }
376
378
  await cdp_session.detach();
377
379
  }
@@ -92,10 +92,11 @@ module Isomorfeus
92
92
  if (element_handle) {
93
93
  var node_handle = RegisterElementHandle(element_handle);
94
94
  var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
95
+ var name = node.nodeName;
95
96
  var tag = node.tagName.toLowerCase();
96
- return [tag, null, node.isContentEditable];
97
+ return [name, tag, null, node.isContentEditable];
97
98
  }, AllElementHandles[node_handle]);
98
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]};
99
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
99
100
  }
100
101
  JAVASCRIPT
101
102
  if node_data
@@ -342,12 +343,13 @@ module Isomorfeus
342
343
  if (element_handle) {
343
344
  var node_handle = RegisterElementHandle(element_handle);
344
345
  var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
345
- var tag = node.tagName.toLowerCase();
346
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
347
+ var name = node.nodeName;
346
348
  var type = null;
347
349
  if (tag === 'input') { type = node.getAttribute('type'); }
348
- return [tag, type, node.isContentEditable];
350
+ return [name, tag, type, node.isContentEditable];
349
351
  }, AllElementHandles[node_handle]);
350
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]};
352
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
351
353
  }
352
354
  JAVASCRIPT
353
355
  if node_data
@@ -367,12 +369,13 @@ module Isomorfeus
367
369
  for (var i=0; i<element_handle_array.length; i++) {
368
370
  var node_handle = RegisterElementHandle(element_handle_array[i]);
369
371
  var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
370
- var tag = node.tagName.toLowerCase();
372
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
373
+ var name = node.nodeName;
371
374
  var type = null;
372
375
  if (tag === 'input') { type = node.getAttribute('type'); }
373
- return [tag, type, node.isContentEditable];
376
+ return [name, tag, type, node.isContentEditable];
374
377
  }, AllElementHandles[node_handle]);
375
- node_data_array.push({handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]});
378
+ node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
376
379
  }
377
380
  }
378
381
  LastResult = node_data_array;
@@ -392,12 +395,13 @@ module Isomorfeus
392
395
  for (var i=0; i<element_handle_array.length; i++) {
393
396
  var node_handle = RegisterElementHandle(element_handle_array[i]);
394
397
  var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
395
- var tag = node.tagName.toLowerCase();
398
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
399
+ var name = node.nodeName;
396
400
  var type = null;
397
401
  if (tag === 'input') { type = node.getAttribute('type'); }
398
- return [tag, type, node.isContentEditable];
402
+ return [name, tag, type, node.isContentEditable];
399
403
  }, AllElementHandles[node_handle]);
400
- node_data_array.push({handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]});
404
+ node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
401
405
  }
402
406
  }
403
407
  LastResult = node_data_array;
@@ -416,12 +420,13 @@ module Isomorfeus
416
420
  if (element_handle) {
417
421
  var node_handle = RegisterElementHandle(element_handle);
418
422
  var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
419
- var tag = node.tagName.toLowerCase();
423
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
424
+ var name = node.nodeName;
420
425
  var type = null;
421
426
  if (tag === 'input') { type = node.getAttribute('type'); }
422
- return [tag, type, node.isContentEditable];
427
+ return [name, tag, type, node.isContentEditable];
423
428
  }, AllElementHandles[node_handle]);
424
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]};
429
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
425
430
  }
426
431
  JAVASCRIPT
427
432
  if node_data
@@ -553,10 +558,11 @@ module Isomorfeus
553
558
  if (element_handle) {
554
559
  var node_handle = RegisterElementHandle(element_handle);
555
560
  var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
561
+ var name = node.nodeName;
556
562
  var tag = node.tagName.toLower();
557
- return [tag, null, node.isContentEditable];
563
+ return [name, tag, null, node.isContentEditable];
558
564
  }, AllElementHandles[node_handle]);
559
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]};
565
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
560
566
  }
561
567
  JAVASCRIPT
562
568
  if node_data
@@ -586,7 +592,7 @@ module Isomorfeus
586
592
  if (!(BrowserType === 'firefox')) {
587
593
  var new_target = new_page.target();
588
594
  var cdp_session = await new_target.createCDPSession();
589
- await cdp_session.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: '#{Isomorfeus::Puppetmaster.save_path}'});
595
+ await cdp_session.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: '#{Isomorfeus::Puppetmaster.download_path}'});
590
596
  if (#{@url_blacklist}.length > 0) { await cdp_session.send('Network.setBlockedURLs', {urls: #{@url_blacklist}}); }
591
597
  await cdp_session.detach();
592
598
  }
@@ -900,12 +906,13 @@ module Isomorfeus
900
906
  if (element_handle) {
901
907
  var node_handle = RegisterElementHandle(element_handle);
902
908
  var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
909
+ var name = node.nodeName;
903
910
  var tag = node.tagName.toLowerCase();
904
911
  var type = null;
905
912
  if (tag === 'input') { type = node.getAttribute('type'); }
906
- return [tag, type, node.isContentEditable];
913
+ return [name, tag, type, node.isContentEditable];
907
914
  }, AllElementHandles[node_handle]);
908
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]};
915
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
909
916
  }
910
917
  JAVASCRIPT
911
918
  if node_data
@@ -923,12 +930,13 @@ module Isomorfeus
923
930
  if (element_handle) {
924
931
  var node_handle = RegisterElementHandle(element_handle);
925
932
  var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
933
+ var name = node.nodeName;
926
934
  var tag = node.tagName.toLowerCase();
927
935
  var type = null;
928
936
  if (tag === 'input') { type = node.getAttribute('type'); }
929
- return [tag, type, node.isContentEditable];
937
+ return [name, tag, type, node.isContentEditable];
930
938
  }, AllElementHandles[node_handle]);
931
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]};
939
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
932
940
  }
933
941
  JAVASCRIPT
934
942
  if node_data
@@ -312,12 +312,13 @@ module Isomorfeus
312
312
  if (element_handle) {
313
313
  var node_handle = RegisterElementHandle(element_handle);
314
314
  var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
315
+ var name = node.nodeName;
315
316
  var tag = node.tagName.toLowerCase();
316
317
  var type = null;
317
318
  if (tag === 'input') { type = node.getAttribute('type'); }
318
- return [tag, type, node.isContentEditable];
319
+ return [name, tag, type, node.isContentEditable];
319
320
  }, AllElementHandles[node_handle]);
320
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]};
321
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
321
322
  }
322
323
  JAVASCRIPT
323
324
  if node_data
@@ -338,12 +339,13 @@ module Isomorfeus
338
339
  for (var i=0; i<element_handle_array.length; i++) {
339
340
  var node_handle = RegisterElementHandle(element_handle_array[i]);
340
341
  var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
342
+ var name = node.nodeName;
341
343
  var tag = node.tagName.toLowerCase();
342
344
  var type = null;
343
345
  if (tag === 'input') { type = node.getAttribute('type'); }
344
- return [tag, type, node.isContentEditable];
346
+ return [name, tag, type, node.isContentEditable];
345
347
  }, AllElementHandles[node_handle]);
346
- node_data_array.push({handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]});
348
+ node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
347
349
  }
348
350
  }
349
351
  LastResult = node_data_array;
@@ -363,12 +365,13 @@ module Isomorfeus
363
365
  for (var i=0; i<element_handle_array.length; i++) {
364
366
  var node_handle = RegisterElementHandle(element_handle_array[i]);
365
367
  var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
368
+ var name = node.nodeName;
366
369
  var tag = node.tagName.toLowerCase();
367
370
  var type = null;
368
371
  if (tag === 'input') { type = node.getAttribute('type'); }
369
- return [tag, type, node.isContentEditable];
372
+ return [name, tag, type, node.isContentEditable];
370
373
  }, AllElementHandles[node_handle]);
371
- node_data_array.push({handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]});
374
+ node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
372
375
  }
373
376
  }
374
377
  LastResult = node_data_array;
@@ -387,12 +390,13 @@ module Isomorfeus
387
390
  if (element_handle) {
388
391
  var node_handle = RegisterElementHandle(element_handle);
389
392
  var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
393
+ var name = node.nodeName;
390
394
  var tag = node.tagName.toLowerCase();
391
395
  var type = null;
392
396
  if (tag === 'input') { type = node.getAttribute('type'); }
393
- return [tag, type, node.isContentEditable];
397
+ return [name, tag, type, node.isContentEditable];
394
398
  }, AllElementHandles[node_handle]);
395
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1], content_editable: tt[2]};
399
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
396
400
  }
397
401
  JAVASCRIPT
398
402
  if node_data
@@ -822,13 +826,14 @@ module Isomorfeus
822
826
  if (element_handle) {
823
827
  var node_handle = RegisterElementHandle(element_handle);
824
828
  var handle = await AllElementHandles[node_handle].evaluate((node) => {
829
+ var name = node.nodeName;
825
830
  var tag = node.tagName.toLower();
826
831
  var type = null;
827
832
  if (tag === 'input') { type = node.getAttribute('type'); }
828
- return [tag, type];
833
+ return [name, tag, type, node.isContentEditable];
829
834
  }, AllElementHandles[node_handle]);
830
835
  var tt = await handle.jsonValue();
831
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1]};
836
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
832
837
  }
833
838
  JAVASCRIPT
834
839
  if node_data
@@ -846,13 +851,14 @@ module Isomorfeus
846
851
  if (element_handle) {
847
852
  var node_handle = RegisterElementHandle(element_handle);
848
853
  var handle = await AllElementHandles[node_handle].evaluate((node) => {
854
+ var name = node.nodeName;
849
855
  var tag = node.tagName.toLower();
850
856
  var type = null;
851
857
  if (tag === 'input') { type = node.getAttribute('type'); }
852
- return [tag, type];
858
+ return [name, tag, type, node.isContentEditable];
853
859
  }, AllElementHandles[node_handle]);
854
860
  var tt = await handle.jsonValue();
855
- LastResult = {handle: node_handle, tag: tt[0], type: tt[1]};
861
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
856
862
  }
857
863
  JAVASCRIPT
858
864
  if node_data
@@ -1,13 +1,24 @@
1
1
  module Isomorfeus
2
2
  module Puppetmaster
3
3
  module DSL
4
+ def default_document
5
+ @puppetmaster_default_document ||= get_default_document
6
+ end
7
+
4
8
  def goto(uri)
5
- puppetmaster_session.document_goto(puppetmaster_default_document, uri)
9
+ puppetmaster_session.document_goto(default_document, uri)
6
10
  @puppetmaster_default_document
7
11
  end
8
-
9
12
  alias_method :visit, :goto
10
13
 
14
+ def on_server(ruby_source = '', &block)
15
+ Isomorfeus::Puppetmaster.served_app.on_server(ruby_source, &block)
16
+ end
17
+
18
+ def open_new_session(app = nil, driver = nil)
19
+ Isomorfeus::Puppetmaster.drivers[driver ? driver : Isomorfeus::Puppetmaster.driver].call(app ? app : Isomorfeus::Puppetmaster.served_app)
20
+ end
21
+
11
22
  def open_new_document(uri = nil)
12
23
  puppetmaster_session.document_open_new_document(uri)
13
24
  end
@@ -24,17 +35,10 @@ module Isomorfeus
24
35
  puppetmaster_session.document_open_new_document('about:blank')
25
36
  end
26
37
 
27
- def puppetmaster_default_document
28
- @puppetmaster_default_document ||= get_default_document
29
- end
30
-
31
38
  def puppetmaster_session
32
- @@puppetmaster_session ||= new_session(Isomorfeus::Puppetmaster.served_app)
39
+ @@puppetmaster_session ||= open_new_session(Isomorfeus::Puppetmaster.served_app)
33
40
  end
34
41
 
35
- def new_session(app = nil, driver = nil)
36
- Isomorfeus::Puppetmaster.drivers[driver ? driver : Isomorfeus::Puppetmaster.driver].call(app ? app : Isomorfeus::Puppetmaster.served_app)
37
- end
38
42
  end
39
43
  end
40
44
  end
@@ -84,7 +84,7 @@ module Isomorfeus
84
84
  wait_for_xpath
85
85
  ]
86
86
 
87
- attr_reader :document, :handle, :css_selector, :tag, :xpath_query
87
+ attr_reader :document, :handle, :css_selector, :name, :tag, :xpath_query
88
88
 
89
89
  SUPPORTED_HTML_ELEMENTS.each do |element|
90
90
  is_name = element == 'a' ? :is_link? : "is_#{element}?".to_sym
@@ -123,6 +123,7 @@ module Isomorfeus
123
123
  @document = document
124
124
  @driver = driver
125
125
  @handle = node_data[:handle] || node_data['handle']
126
+ @name = node_data[:name] || node_data['name']
126
127
  @tag = node_data[:tag] || node_data['tag']
127
128
  @type = node_data[:type] || node_data['type']
128
129
  @xpath_query = node_data[:xpath_query] || node_data['xpath_query']
@@ -137,6 +138,24 @@ module Isomorfeus
137
138
  @driver.node_equal(self, other)
138
139
  end
139
140
 
141
+ def evaluate_ruby(ruby_source = '', &block)
142
+ ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
143
+ compiled_ruby = compile_ruby_source(ruby_source)
144
+ if compiled_ruby.start_with?('/*')
145
+ start_of_code = compiled_ruby.index('*/') + 3
146
+ compiled_ruby = compiled_ruby[start_of_code..-1]
147
+ end
148
+ javascript = <<~JAVASCRIPT
149
+ (function(){
150
+ if (typeof Opal === "undefined") {
151
+ #{Isomorfeus::Puppetmaster.opal_prelude}
152
+ }
153
+ return #{compiled_ruby}
154
+ })()
155
+ JAVASCRIPT
156
+ evaluate_script(javascript)
157
+ end
158
+
140
159
  def get_attribute(attribute)
141
160
  attribute = attribute.to_s
142
161
  if !(attribute.start_with?('aria-') || attribute.start_with?('data-'))
@@ -236,6 +255,13 @@ module Isomorfeus
236
255
  # :assert_none_of_selectors,
237
256
  # :assert_no_text,
238
257
  # :refute_selector
258
+
259
+ protected
260
+
261
+ def compile_ruby_source(source_code)
262
+ # TODO maybe use compile server
263
+ Opal.compile(source_code, parse_comments: false)
264
+ end
239
265
  end
240
266
  end
241
267
  end
@@ -40,6 +40,12 @@ module Isomorfeus
40
40
  extra_middleware: [])
41
41
  @app = app
42
42
  @extra_middleware = extra_middleware
43
+ @request_key = Isomorfeus::Puppetmaster::Server::ExecutorMiddleware.class_variable_get(:@@request_key)
44
+ unless @request_key
45
+ @request_key = SecureRandom.alphanumeric(128)
46
+ Isomorfeus::Puppetmaster::Server::ExecutorMiddleware.class_variable_set(:@@request_key, @request_key)
47
+ end
48
+ @extra_middleware << Isomorfeus::Puppetmaster::Server::ExecutorMiddleware
43
49
  @server_thread = nil # suppress warnings
44
50
  @host = host
45
51
  @port = port
@@ -56,6 +62,25 @@ module Isomorfeus
56
62
  middleware.error
57
63
  end
58
64
 
65
+ def on_server(ruby_source = '', &block)
66
+ ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
67
+ request_hash = { 'key' => @request_key, 'code' => ruby_source }
68
+ response = if using_ssl?
69
+ http = Net::HTTP.start(@host, @port, { use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE })
70
+ http.post('/__executor__', Oj.dump(request_hash, {}))
71
+ else
72
+ http = Net::HTTP.start(@host, @port)
73
+ http.post('/__executor__', Oj.dump(request_hash, {}))
74
+ end
75
+ if response.code == '200'
76
+ result_hash = Oj.load(response.body, {})
77
+ raise result_hash['error'] if result_hash.has_key?('error')
78
+ result_hash['result']
79
+ else
80
+ raise 'A error occured.'
81
+ end
82
+ end
83
+
59
84
  def using_ssl?
60
85
  @checker.ssl?
61
86
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Isomorfeus
4
+ module Puppetmaster
5
+ class Server
6
+ class ExecutorMiddleware
7
+ @@request_key = nil
8
+
9
+ def initialize(app)
10
+ raise '@@request_key not set!' unless @@request_key
11
+ @app = app
12
+ end
13
+
14
+ def call(env)
15
+ if env['PATH_INFO'] == '/__executor__' && env['REQUEST_METHOD'] == 'POST'
16
+ request = Rack::Request.new(env)
17
+ unless request.body.nil?
18
+ request_hash = Oj.load(request.body.read, {})
19
+ if request_hash['key'] != @@request_key
20
+ Rack::Response.new(Oj.dump({ 'error' => 'wrong key given, execution denied' }, {}), 401, 'Content-Type' => 'application/json').finish
21
+ end
22
+ begin
23
+ result = Object.instance_eval(request_hash['code']) if request_hash['code']
24
+ rescue Exception => e
25
+ Rack::Response.new(Oj.dump({ 'error' => "#{e.class}: #{e.message}" }, {}), 200, 'Content-Type' => 'application/json').finish
26
+ end
27
+ Rack::Response.new(Oj.dump({ 'result' => result }, {}), 200, 'Content-Type' => 'application/json').finish
28
+ end
29
+ else
30
+ @app.call(env)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
1
  module Isomorfeus
2
- PUPPETMASTER_VERSION = '0.1.0'
2
+ PUPPETMASTER_VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isomorfeus-puppetmaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-28 00:00:00.000000000 Z
11
+ date: 2019-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -38,6 +38,76 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: method_source
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: opal
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.11.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.11.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: opal-browser
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.2.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.2.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: parser
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: unparser
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
41
111
  - !ruby/object:Gem::Dependency
42
112
  name: agoo
43
113
  requirement: !ruby/object:Gem::Requirement
@@ -253,6 +323,7 @@ files:
253
323
  - lib/isomorfeus/puppetmaster/self_forwardable.rb
254
324
  - lib/isomorfeus/puppetmaster/server.rb
255
325
  - lib/isomorfeus/puppetmaster/server/checker.rb
326
+ - lib/isomorfeus/puppetmaster/server/executor_middleware.rb
256
327
  - lib/isomorfeus/puppetmaster/server/middleware.rb
257
328
  - lib/isomorfeus/puppetmaster/server_registration.rb
258
329
  - lib/isomorfeus/puppetmaster/version.rb