isomorfeus-puppetmaster 0.1.0 → 0.2.0

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: 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