UrgentcareCLI 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (308) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +60 -25
  4. data/Notes +1 -1
  5. data/README.md +5 -5
  6. data/Rakefile +2 -0
  7. data/UrgentCare.gemspec +3 -3
  8. data/background.jpg +0 -0
  9. data/lib/UrgentCare.rb +3 -0
  10. data/lib/UrgentCare/CLI.rb +6 -2
  11. data/lib/UrgentCare/version.rb +1 -1
  12. data/lib/Urgentcare/Scraper.rb +65 -23
  13. data/node_modules/.bin/rimraf +1 -0
  14. data/node_modules/.package-lock.json +250 -0
  15. data/node_modules/balanced-match/.github/FUNDING.yml +2 -0
  16. data/node_modules/balanced-match/LICENSE.md +21 -0
  17. data/node_modules/balanced-match/README.md +97 -0
  18. data/node_modules/balanced-match/index.js +62 -0
  19. data/node_modules/balanced-match/package.json +48 -0
  20. data/node_modules/brace-expansion/LICENSE +21 -0
  21. data/node_modules/brace-expansion/README.md +129 -0
  22. data/node_modules/brace-expansion/index.js +201 -0
  23. data/node_modules/brace-expansion/package.json +47 -0
  24. data/node_modules/concat-map/.travis.yml +4 -0
  25. data/node_modules/concat-map/LICENSE +18 -0
  26. data/node_modules/concat-map/README.markdown +62 -0
  27. data/node_modules/concat-map/example/map.js +6 -0
  28. data/node_modules/concat-map/index.js +13 -0
  29. data/node_modules/concat-map/package.json +43 -0
  30. data/node_modules/concat-map/test/map.js +39 -0
  31. data/node_modules/core-util-is/LICENSE +19 -0
  32. data/node_modules/core-util-is/README.md +3 -0
  33. data/node_modules/core-util-is/float.patch +604 -0
  34. data/node_modules/core-util-is/lib/util.js +107 -0
  35. data/node_modules/core-util-is/package.json +32 -0
  36. data/node_modules/core-util-is/test.js +68 -0
  37. data/node_modules/fs.realpath/LICENSE +43 -0
  38. data/node_modules/fs.realpath/README.md +33 -0
  39. data/node_modules/fs.realpath/index.js +66 -0
  40. data/node_modules/fs.realpath/old.js +303 -0
  41. data/node_modules/fs.realpath/package.json +26 -0
  42. data/node_modules/glob/LICENSE +21 -0
  43. data/node_modules/glob/README.md +375 -0
  44. data/node_modules/glob/changelog.md +67 -0
  45. data/node_modules/glob/common.js +234 -0
  46. data/node_modules/glob/glob.js +788 -0
  47. data/node_modules/glob/package.json +51 -0
  48. data/node_modules/glob/sync.js +484 -0
  49. data/node_modules/immediate/LICENSE.txt +20 -0
  50. data/node_modules/immediate/README.md +93 -0
  51. data/node_modules/immediate/dist/immediate.js +75 -0
  52. data/node_modules/immediate/dist/immediate.min.js +1 -0
  53. data/node_modules/immediate/lib/browser.js +69 -0
  54. data/node_modules/immediate/lib/index.js +73 -0
  55. data/node_modules/immediate/package.json +42 -0
  56. data/node_modules/inflight/LICENSE +15 -0
  57. data/node_modules/inflight/README.md +37 -0
  58. data/node_modules/inflight/inflight.js +54 -0
  59. data/node_modules/inflight/package.json +29 -0
  60. data/node_modules/inherits/LICENSE +16 -0
  61. data/node_modules/inherits/README.md +42 -0
  62. data/node_modules/inherits/inherits.js +9 -0
  63. data/node_modules/inherits/inherits_browser.js +27 -0
  64. data/node_modules/inherits/package.json +29 -0
  65. data/node_modules/isarray/.npmignore +1 -0
  66. data/node_modules/isarray/.travis.yml +4 -0
  67. data/node_modules/isarray/Makefile +6 -0
  68. data/node_modules/isarray/README.md +60 -0
  69. data/node_modules/isarray/component.json +19 -0
  70. data/node_modules/isarray/index.js +5 -0
  71. data/node_modules/isarray/package.json +45 -0
  72. data/node_modules/isarray/test.js +20 -0
  73. data/node_modules/jszip/.codeclimate.yml +16 -0
  74. data/node_modules/jszip/.editorconfig +8 -0
  75. data/node_modules/jszip/.jshintignore +1 -0
  76. data/node_modules/jszip/.jshintrc +21 -0
  77. data/node_modules/jszip/.travis.yml +17 -0
  78. data/node_modules/jszip/CHANGES.md +163 -0
  79. data/node_modules/jszip/LICENSE.markdown +651 -0
  80. data/node_modules/jszip/README.markdown +35 -0
  81. data/node_modules/jszip/dist/jszip.js +30 -0
  82. data/node_modules/jszip/dist/jszip.min.js +13 -0
  83. data/node_modules/jszip/index.d.ts +270 -0
  84. data/node_modules/jszip/lib/base64.js +106 -0
  85. data/node_modules/jszip/lib/compressedObject.js +74 -0
  86. data/node_modules/jszip/lib/compressions.js +14 -0
  87. data/node_modules/jszip/lib/crc32.js +77 -0
  88. data/node_modules/jszip/lib/defaults.js +11 -0
  89. data/node_modules/jszip/lib/external.js +19 -0
  90. data/node_modules/jszip/lib/flate.js +85 -0
  91. data/node_modules/jszip/lib/generate/ZipFileWorker.js +540 -0
  92. data/node_modules/jszip/lib/generate/index.js +57 -0
  93. data/node_modules/jszip/lib/index.js +52 -0
  94. data/node_modules/jszip/lib/license_header.js +11 -0
  95. data/node_modules/jszip/lib/load.js +81 -0
  96. data/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +74 -0
  97. data/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +42 -0
  98. data/node_modules/jszip/lib/nodejsUtils.js +57 -0
  99. data/node_modules/jszip/lib/object.js +389 -0
  100. data/node_modules/jszip/lib/readable-stream-browser.js +9 -0
  101. data/node_modules/jszip/lib/reader/ArrayReader.js +57 -0
  102. data/node_modules/jszip/lib/reader/DataReader.js +116 -0
  103. data/node_modules/jszip/lib/reader/NodeBufferReader.js +19 -0
  104. data/node_modules/jszip/lib/reader/StringReader.js +38 -0
  105. data/node_modules/jszip/lib/reader/Uint8ArrayReader.js +22 -0
  106. data/node_modules/jszip/lib/reader/readerFor.js +28 -0
  107. data/node_modules/jszip/lib/signature.js +7 -0
  108. data/node_modules/jszip/lib/stream/ConvertWorker.js +26 -0
  109. data/node_modules/jszip/lib/stream/Crc32Probe.js +24 -0
  110. data/node_modules/jszip/lib/stream/DataLengthProbe.js +29 -0
  111. data/node_modules/jszip/lib/stream/DataWorker.js +116 -0
  112. data/node_modules/jszip/lib/stream/GenericWorker.js +263 -0
  113. data/node_modules/jszip/lib/stream/StreamHelper.js +212 -0
  114. data/node_modules/jszip/lib/support.js +38 -0
  115. data/node_modules/jszip/lib/utf8.js +275 -0
  116. data/node_modules/jszip/lib/utils.js +476 -0
  117. data/node_modules/jszip/lib/zipEntries.js +262 -0
  118. data/node_modules/jszip/lib/zipEntry.js +294 -0
  119. data/node_modules/jszip/lib/zipObject.js +133 -0
  120. data/node_modules/jszip/package.json +63 -0
  121. data/node_modules/jszip/vendor/FileSaver.js +247 -0
  122. data/node_modules/lie/README.md +62 -0
  123. data/node_modules/lie/dist/lie.js +350 -0
  124. data/node_modules/lie/dist/lie.min.js +1 -0
  125. data/node_modules/lie/dist/lie.polyfill.js +358 -0
  126. data/node_modules/lie/dist/lie.polyfill.min.js +1 -0
  127. data/node_modules/lie/lib/browser.js +273 -0
  128. data/node_modules/lie/lib/index.js +298 -0
  129. data/node_modules/lie/license.md +7 -0
  130. data/node_modules/lie/lie.d.ts +244 -0
  131. data/node_modules/lie/package.json +69 -0
  132. data/node_modules/lie/polyfill.js +4 -0
  133. data/node_modules/minimatch/LICENSE +15 -0
  134. data/node_modules/minimatch/README.md +209 -0
  135. data/node_modules/minimatch/minimatch.js +923 -0
  136. data/node_modules/minimatch/package.json +30 -0
  137. data/node_modules/once/LICENSE +15 -0
  138. data/node_modules/once/README.md +79 -0
  139. data/node_modules/once/once.js +42 -0
  140. data/node_modules/once/package.json +33 -0
  141. data/node_modules/pako/CHANGELOG.md +164 -0
  142. data/node_modules/pako/LICENSE +21 -0
  143. data/node_modules/pako/README.md +191 -0
  144. data/node_modules/pako/dist/pako.js +6818 -0
  145. data/node_modules/pako/dist/pako.min.js +1 -0
  146. data/node_modules/pako/dist/pako_deflate.js +3997 -0
  147. data/node_modules/pako/dist/pako_deflate.min.js +1 -0
  148. data/node_modules/pako/dist/pako_inflate.js +3300 -0
  149. data/node_modules/pako/dist/pako_inflate.min.js +1 -0
  150. data/node_modules/pako/index.js +14 -0
  151. data/node_modules/pako/lib/deflate.js +400 -0
  152. data/node_modules/pako/lib/inflate.js +423 -0
  153. data/node_modules/pako/lib/utils/common.js +105 -0
  154. data/node_modules/pako/lib/utils/strings.js +187 -0
  155. data/node_modules/pako/lib/zlib/README +59 -0
  156. data/node_modules/pako/lib/zlib/adler32.js +51 -0
  157. data/node_modules/pako/lib/zlib/constants.js +68 -0
  158. data/node_modules/pako/lib/zlib/crc32.js +59 -0
  159. data/node_modules/pako/lib/zlib/deflate.js +1874 -0
  160. data/node_modules/pako/lib/zlib/gzheader.js +58 -0
  161. data/node_modules/pako/lib/zlib/inffast.js +345 -0
  162. data/node_modules/pako/lib/zlib/inflate.js +1556 -0
  163. data/node_modules/pako/lib/zlib/inftrees.js +343 -0
  164. data/node_modules/pako/lib/zlib/messages.js +32 -0
  165. data/node_modules/pako/lib/zlib/trees.js +1222 -0
  166. data/node_modules/pako/lib/zlib/zstream.js +47 -0
  167. data/node_modules/pako/package.json +44 -0
  168. data/node_modules/path-is-absolute/index.js +20 -0
  169. data/node_modules/path-is-absolute/license +21 -0
  170. data/node_modules/path-is-absolute/package.json +43 -0
  171. data/node_modules/path-is-absolute/readme.md +59 -0
  172. data/node_modules/process-nextick-args/index.js +45 -0
  173. data/node_modules/process-nextick-args/license.md +19 -0
  174. data/node_modules/process-nextick-args/package.json +25 -0
  175. data/node_modules/process-nextick-args/readme.md +18 -0
  176. data/node_modules/readable-stream/.travis.yml +34 -0
  177. data/node_modules/readable-stream/CONTRIBUTING.md +38 -0
  178. data/node_modules/readable-stream/GOVERNANCE.md +136 -0
  179. data/node_modules/readable-stream/LICENSE +47 -0
  180. data/node_modules/readable-stream/README.md +58 -0
  181. data/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +60 -0
  182. data/node_modules/readable-stream/duplex-browser.js +1 -0
  183. data/node_modules/readable-stream/duplex.js +1 -0
  184. data/node_modules/readable-stream/lib/_stream_duplex.js +131 -0
  185. data/node_modules/readable-stream/lib/_stream_passthrough.js +47 -0
  186. data/node_modules/readable-stream/lib/_stream_readable.js +1019 -0
  187. data/node_modules/readable-stream/lib/_stream_transform.js +214 -0
  188. data/node_modules/readable-stream/lib/_stream_writable.js +687 -0
  189. data/node_modules/readable-stream/lib/internal/streams/BufferList.js +79 -0
  190. data/node_modules/readable-stream/lib/internal/streams/destroy.js +74 -0
  191. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  192. data/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  193. data/node_modules/readable-stream/package.json +52 -0
  194. data/node_modules/readable-stream/passthrough.js +1 -0
  195. data/node_modules/readable-stream/readable-browser.js +7 -0
  196. data/node_modules/readable-stream/readable.js +19 -0
  197. data/node_modules/readable-stream/transform.js +1 -0
  198. data/node_modules/readable-stream/writable-browser.js +1 -0
  199. data/node_modules/readable-stream/writable.js +8 -0
  200. data/node_modules/rimraf/LICENSE +15 -0
  201. data/node_modules/rimraf/README.md +101 -0
  202. data/node_modules/rimraf/bin.js +50 -0
  203. data/node_modules/rimraf/package.json +29 -0
  204. data/node_modules/rimraf/rimraf.js +372 -0
  205. data/node_modules/safe-buffer/LICENSE +21 -0
  206. data/node_modules/safe-buffer/README.md +584 -0
  207. data/node_modules/safe-buffer/index.d.ts +187 -0
  208. data/node_modules/safe-buffer/index.js +62 -0
  209. data/node_modules/safe-buffer/package.json +37 -0
  210. data/node_modules/selenium-webdriver/CHANGES.md +1114 -0
  211. data/node_modules/selenium-webdriver/LICENSE +202 -0
  212. data/node_modules/selenium-webdriver/NOTICE +2 -0
  213. data/node_modules/selenium-webdriver/README.md +229 -0
  214. data/node_modules/selenium-webdriver/chrome.js +295 -0
  215. data/node_modules/selenium-webdriver/chromium.js +829 -0
  216. data/node_modules/selenium-webdriver/devtools/CDPConnection.js +35 -0
  217. data/node_modules/selenium-webdriver/edge.js +224 -0
  218. data/node_modules/selenium-webdriver/example/chrome_android.js +45 -0
  219. data/node_modules/selenium-webdriver/example/chrome_mobile_emulation.js +46 -0
  220. data/node_modules/selenium-webdriver/example/firefox_channels.js +84 -0
  221. data/node_modules/selenium-webdriver/example/google_search.js +50 -0
  222. data/node_modules/selenium-webdriver/example/google_search_test.js +70 -0
  223. data/node_modules/selenium-webdriver/example/headless.js +63 -0
  224. data/node_modules/selenium-webdriver/example/logging.js +64 -0
  225. data/node_modules/selenium-webdriver/firefox.js +789 -0
  226. data/node_modules/selenium-webdriver/http/index.js +324 -0
  227. data/node_modules/selenium-webdriver/http/util.js +172 -0
  228. data/node_modules/selenium-webdriver/ie.js +503 -0
  229. data/node_modules/selenium-webdriver/index.js +825 -0
  230. data/node_modules/selenium-webdriver/io/exec.js +162 -0
  231. data/node_modules/selenium-webdriver/io/index.js +348 -0
  232. data/node_modules/selenium-webdriver/io/zip.js +223 -0
  233. data/node_modules/selenium-webdriver/lib/atoms/find-elements.js +123 -0
  234. data/node_modules/selenium-webdriver/lib/atoms/get-attribute.js +101 -0
  235. data/node_modules/selenium-webdriver/lib/atoms/is-displayed.js +101 -0
  236. data/node_modules/selenium-webdriver/lib/atoms/mutation-listener.js +55 -0
  237. data/node_modules/selenium-webdriver/lib/by.js +415 -0
  238. data/node_modules/selenium-webdriver/lib/capabilities.js +553 -0
  239. data/node_modules/selenium-webdriver/lib/command.js +206 -0
  240. data/node_modules/selenium-webdriver/lib/error.js +605 -0
  241. data/node_modules/selenium-webdriver/lib/http.js +704 -0
  242. data/node_modules/selenium-webdriver/lib/input.js +946 -0
  243. data/node_modules/selenium-webdriver/lib/logging.js +661 -0
  244. data/node_modules/selenium-webdriver/lib/promise.js +285 -0
  245. data/node_modules/selenium-webdriver/lib/proxy.js +212 -0
  246. data/node_modules/selenium-webdriver/lib/session.js +77 -0
  247. data/node_modules/selenium-webdriver/lib/symbols.js +37 -0
  248. data/node_modules/selenium-webdriver/lib/until.js +429 -0
  249. data/node_modules/selenium-webdriver/lib/webdriver.js +2919 -0
  250. data/node_modules/selenium-webdriver/net/index.js +107 -0
  251. data/node_modules/selenium-webdriver/net/portprober.js +75 -0
  252. data/node_modules/selenium-webdriver/opera.js +406 -0
  253. data/node_modules/selenium-webdriver/package.json +54 -0
  254. data/node_modules/selenium-webdriver/proxy.js +32 -0
  255. data/node_modules/selenium-webdriver/remote/index.js +624 -0
  256. data/node_modules/selenium-webdriver/safari.js +168 -0
  257. data/node_modules/selenium-webdriver/testing/index.js +504 -0
  258. data/node_modules/set-immediate-shim/index.js +7 -0
  259. data/node_modules/set-immediate-shim/package.json +34 -0
  260. data/node_modules/set-immediate-shim/readme.md +31 -0
  261. data/node_modules/string_decoder/.travis.yml +50 -0
  262. data/node_modules/string_decoder/LICENSE +48 -0
  263. data/node_modules/string_decoder/README.md +47 -0
  264. data/node_modules/string_decoder/lib/string_decoder.js +296 -0
  265. data/node_modules/string_decoder/package.json +31 -0
  266. data/node_modules/tmp/CHANGELOG.md +288 -0
  267. data/node_modules/tmp/LICENSE +21 -0
  268. data/node_modules/tmp/README.md +365 -0
  269. data/node_modules/tmp/lib/tmp.js +780 -0
  270. data/node_modules/tmp/node_modules/.bin/rimraf +1 -0
  271. data/node_modules/tmp/node_modules/rimraf/CHANGELOG.md +65 -0
  272. data/node_modules/tmp/node_modules/rimraf/LICENSE +15 -0
  273. data/node_modules/tmp/node_modules/rimraf/README.md +101 -0
  274. data/node_modules/tmp/node_modules/rimraf/bin.js +68 -0
  275. data/node_modules/tmp/node_modules/rimraf/package.json +32 -0
  276. data/node_modules/tmp/node_modules/rimraf/rimraf.js +360 -0
  277. data/node_modules/tmp/package.json +58 -0
  278. data/node_modules/util-deprecate/History.md +16 -0
  279. data/node_modules/util-deprecate/LICENSE +24 -0
  280. data/node_modules/util-deprecate/README.md +53 -0
  281. data/node_modules/util-deprecate/browser.js +67 -0
  282. data/node_modules/util-deprecate/node.js +6 -0
  283. data/node_modules/util-deprecate/package.json +27 -0
  284. data/node_modules/wrappy/LICENSE +15 -0
  285. data/node_modules/wrappy/README.md +36 -0
  286. data/node_modules/wrappy/package.json +29 -0
  287. data/node_modules/wrappy/wrappy.js +33 -0
  288. data/node_modules/ws/LICENSE +21 -0
  289. data/node_modules/ws/README.md +496 -0
  290. data/node_modules/ws/browser.js +8 -0
  291. data/node_modules/ws/index.js +10 -0
  292. data/node_modules/ws/lib/buffer-util.js +129 -0
  293. data/node_modules/ws/lib/constants.js +10 -0
  294. data/node_modules/ws/lib/event-target.js +184 -0
  295. data/node_modules/ws/lib/extension.js +223 -0
  296. data/node_modules/ws/lib/limiter.js +55 -0
  297. data/node_modules/ws/lib/permessage-deflate.js +517 -0
  298. data/node_modules/ws/lib/receiver.js +507 -0
  299. data/node_modules/ws/lib/sender.js +405 -0
  300. data/node_modules/ws/lib/stream.js +165 -0
  301. data/node_modules/ws/lib/validation.js +104 -0
  302. data/node_modules/ws/lib/websocket-server.js +418 -0
  303. data/node_modules/ws/lib/websocket.js +942 -0
  304. data/node_modules/ws/package.json +56 -0
  305. data/package-lock.json +458 -0
  306. data/package.json +5 -0
  307. data/selenium.log +1 -0
  308. metadata +314 -19
@@ -0,0 +1,107 @@
1
+ // Licensed to the Software Freedom Conservancy (SFC) under one
2
+ // or more contributor license agreements. See the NOTICE file
3
+ // distributed with this work for additional information
4
+ // regarding copyright ownership. The SFC licenses this file
5
+ // to you under the Apache License, Version 2.0 (the
6
+ // "License"); you may not use this file except in compliance
7
+ // with the License. You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing,
12
+ // software distributed under the License is distributed on an
13
+ // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ // KIND, either express or implied. See the License for the
15
+ // specific language governing permissions and limitations
16
+ // under the License.
17
+
18
+ 'use strict'
19
+
20
+ const os = require('os')
21
+
22
+ function getLoInterface() {
23
+ let name
24
+ if (process.platform === 'darwin') {
25
+ name = 'lo0'
26
+ } else if (process.platform === 'linux') {
27
+ name = 'lo'
28
+ }
29
+ return name ? os.networkInterfaces()[name] : null
30
+ }
31
+
32
+ /**
33
+ * Queries the system network interfaces for an IP address.
34
+ * @param {boolean} loopback Whether to find a loopback address.
35
+ * @param {string} family The IP family (IPv4 or IPv6). Defaults to IPv4.
36
+ * @return {(string|undefined)} The located IP address or undefined.
37
+ */
38
+ function getAddress(loopback, family) {
39
+ let interfaces
40
+ if (loopback) {
41
+ let lo = getLoInterface()
42
+ interfaces = lo ? [lo] : null
43
+ }
44
+ interfaces = interfaces || os.networkInterfaces()
45
+ for (let key in interfaces) {
46
+ if (!Object.prototype.hasOwnProperty.call(interfaces, key)) {
47
+ continue
48
+ }
49
+
50
+ for (let ipAddress of interfaces[key]) {
51
+ if (ipAddress.family === family && ipAddress.internal === loopback) {
52
+ return ipAddress.address
53
+ }
54
+ }
55
+ }
56
+ return undefined
57
+ }
58
+
59
+ // PUBLIC API
60
+
61
+ /**
62
+ * Retrieves the external IP address for this host.
63
+ * @param {string=} family The IP family to retrieve. Defaults to "IPv4".
64
+ * @return {(string|undefined)} The IP address or undefined if not available.
65
+ */
66
+ exports.getAddress = function (family = 'IPv4') {
67
+ return getAddress(false, family)
68
+ }
69
+
70
+ /**
71
+ * Retrieves a loopback address for this machine.
72
+ * @param {string=} family The IP family to retrieve. Defaults to "IPv4".
73
+ * @return {(string|undefined)} The IP address or undefined if not available.
74
+ */
75
+ exports.getLoopbackAddress = function (family = 'IPv4') {
76
+ return getAddress(true, family)
77
+ }
78
+
79
+ /**
80
+ * Splits a hostport string, e.g. "www.example.com:80", into its component
81
+ * parts.
82
+ *
83
+ * @param {string} hostport The string to split.
84
+ * @return {{host: string, port: ?number}} A host and port. If no port is
85
+ * present in the argument `hostport`, port is null.
86
+ */
87
+ exports.splitHostAndPort = function (hostport) {
88
+ let lastIndex = hostport.lastIndexOf(':')
89
+ if (lastIndex < 0) {
90
+ return { host: hostport, port: null }
91
+ }
92
+
93
+ let firstIndex = hostport.indexOf(':')
94
+ if (firstIndex != lastIndex && !hostport.includes('[')) {
95
+ // Multiple colons but no brackets, so assume the string is an IPv6 address
96
+ // with no port (e.g. "1234:5678:9:0:1234:5678:9:0").
97
+ return { host: hostport, port: null }
98
+ }
99
+
100
+ let host = hostport.slice(0, lastIndex)
101
+ if (host.startsWith('[') && host.endsWith(']')) {
102
+ host = host.slice(1, -1)
103
+ }
104
+
105
+ let port = parseInt(hostport.slice(lastIndex + 1), 10)
106
+ return { host, port }
107
+ }
@@ -0,0 +1,75 @@
1
+ // Licensed to the Software Freedom Conservancy (SFC) under one
2
+ // or more contributor license agreements. See the NOTICE file
3
+ // distributed with this work for additional information
4
+ // regarding copyright ownership. The SFC licenses this file
5
+ // to you under the Apache License, Version 2.0 (the
6
+ // "License"); you may not use this file except in compliance
7
+ // with the License. You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing,
12
+ // software distributed under the License is distributed on an
13
+ // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ // KIND, either express or implied. See the License for the
15
+ // specific language governing permissions and limitations
16
+ // under the License.
17
+
18
+ 'use strict'
19
+
20
+ const net = require('net')
21
+
22
+ /**
23
+ * Tests if a port is free.
24
+ * @param {number} port The port to test.
25
+ * @param {string=} opt_host The bound host to test the {@code port} against.
26
+ * Defaults to {@code INADDR_ANY}.
27
+ * @return {!Promise<boolean>} A promise that will resolve with whether the port
28
+ * is free.
29
+ */
30
+ function isFree(port, opt_host) {
31
+ return new Promise((resolve, reject) => {
32
+ let server = net.createServer().on('error', function (e) {
33
+ if (e.code === 'EADDRINUSE' || e.code === 'EACCES') {
34
+ resolve(false)
35
+ } else {
36
+ reject(e)
37
+ }
38
+ })
39
+
40
+ server.listen(port, opt_host, function () {
41
+ server.close(() => resolve(true))
42
+ })
43
+ })
44
+ }
45
+
46
+ /**
47
+ * @param {string=} opt_host The bound host to test the {@code port} against.
48
+ * Defaults to {@code INADDR_ANY}.
49
+ * @return {!Promise<number>} A promise that will resolve to a free port. If a
50
+ * port cannot be found, the promise will be rejected.
51
+ */
52
+
53
+ function findFreePort(opt_host) {
54
+ return new Promise((resolve, reject) => {
55
+ const server = net.createServer()
56
+ server.on('listening', function () {
57
+ resolve(server.address().port)
58
+ server.close()
59
+ })
60
+ server.on('error', (e) => {
61
+ if (e.code === 'EADDRINUSE' || e.code === 'EACCES') {
62
+ resolve('Unable to find a free port')
63
+ } else {
64
+ reject(e)
65
+ }
66
+ })
67
+ // By providing 0 we let the operative system find an arbitrary port
68
+ server.listen(0, opt_host)
69
+ })
70
+ }
71
+
72
+ // PUBLIC API
73
+
74
+ exports.findFreePort = findFreePort
75
+ exports.isFree = isFree
@@ -0,0 +1,406 @@
1
+ // Licensed to the Software Freedom Conservancy (SFC) under one
2
+ // or more contributor license agreements. See the NOTICE file
3
+ // distributed with this work for additional information
4
+ // regarding copyright ownership. The SFC licenses this file
5
+ // to you under the Apache License, Version 2.0 (the
6
+ // "License"); you may not use this file except in compliance
7
+ // with the License. You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing,
12
+ // software distributed under the License is distributed on an
13
+ // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ // KIND, either express or implied. See the License for the
15
+ // specific language governing permissions and limitations
16
+ // under the License.
17
+
18
+ /**
19
+ * @fileoverview Defines a {@linkplain Driver WebDriver} client for the
20
+ * Opera web browser (v26+). Before using this module, you must download the
21
+ * latest OperaDriver
22
+ * [release](https://github.com/operasoftware/operachromiumdriver/releases) and
23
+ * ensure it can be found on your system
24
+ * [PATH](http://en.wikipedia.org/wiki/PATH_%28variable%29).
25
+ *
26
+ * There are three primary classes exported by this module:
27
+ *
28
+ * 1. {@linkplain ServiceBuilder}: configures the
29
+ * {@link ./remote.DriverService remote.DriverService}
30
+ * that manages the
31
+ * [OperaDriver](https://github.com/operasoftware/operachromiumdriver)
32
+ * child process.
33
+ *
34
+ * 2. {@linkplain Options}: defines configuration options for each new Opera
35
+ * session, such as which {@linkplain Options#setProxy proxy} to use,
36
+ * what {@linkplain Options#addExtensions extensions} to install, or
37
+ * what {@linkplain Options#addArguments command-line switches} to use when
38
+ * starting the browser.Service
39
+ *
40
+ * 3. {@linkplain Driver}: the WebDriver client; each new instance will control
41
+ * a unique browser session with a clean user profile (unless otherwise
42
+ * configured through the {@link Options} class).
43
+ *
44
+ * By default, every Opera session will use a single driver service, which is
45
+ * started the first time a {@link Driver} instance is created and terminated
46
+ * when this process exits. The default service will inherit its environment
47
+ * from the current process and direct all output to /dev/null. You may obtain
48
+ * a handle to this default service using
49
+ * {@link #getDefaultService getDefaultService()} and change its configuration
50
+ * with {@link #setDefaultService setDefaultService()}.
51
+ *
52
+ * You may also create a {@link Driver} with its own driver service. This is
53
+ * useful if you need to capture the server's log output for a specific session:
54
+ *
55
+ * var opera = require('selenium-webdriver/opera');
56
+ *
57
+ * var service = new opera.ServiceBuilder()
58
+ * .loggingTo('/my/log/file.txt')
59
+ * .enableVerboseLogging()
60
+ * .build();
61
+ *
62
+ * var options = new opera.Options();
63
+ * // configure browser options ...
64
+ *
65
+ * var driver = opera.Driver.createSession(options, service);
66
+ *
67
+ * Users should only instantiate the {@link Driver} class directly when they
68
+ * need a custom driver service configuration (as shown above). For normal
69
+ * operation, users should start Opera using the
70
+ * {@link ./builder.Builder selenium-webdriver.Builder}.
71
+ */
72
+
73
+ 'use strict'
74
+
75
+ const http = require('./http'),
76
+ io = require('./io'),
77
+ capabilities = require('./lib/capabilities'),
78
+ Symbols = require('./lib/symbols'),
79
+ webdriver = require('./lib/webdriver'),
80
+ remote = require('./remote')
81
+
82
+ /**
83
+ * Name of the OperaDriver executable.
84
+ * @type {string}
85
+ * @const
86
+ */
87
+ const OPERADRIVER_EXE =
88
+ process.platform === 'win32' ? 'operadriver.exe' : 'operadriver'
89
+
90
+ /**
91
+ * _Synchronously_ attempts to locate the operadriver executable on the current
92
+ * system.
93
+ *
94
+ * @return {?string} the located executable, or `null`.
95
+ */
96
+ function locateSynchronously() {
97
+ return io.findInPath(OPERADRIVER_EXE, true)
98
+ }
99
+
100
+ /**
101
+ * Creates {@link remote.DriverService} instances that manages an
102
+ * [OperaDriver](https://github.com/operasoftware/operachromiumdriver)
103
+ * server in a child process.
104
+ */
105
+ class ServiceBuilder extends remote.DriverService.Builder {
106
+ /**
107
+ * @param {string=} opt_exe Path to the server executable to use. If omitted,
108
+ * the builder will attempt to locate the operadriver on the current
109
+ * PATH.
110
+ * @throws {Error} If provided executable does not exist, or the operadriver
111
+ * cannot be found on the PATH.
112
+ */
113
+ constructor(opt_exe) {
114
+ let exe = opt_exe || locateSynchronously()
115
+ if (!exe) {
116
+ throw Error(
117
+ 'The OperaDriver could not be found on the current PATH. Please ' +
118
+ 'download the latest version of the OperaDriver from ' +
119
+ 'https://github.com/operasoftware/operachromiumdriver/releases and ' +
120
+ 'ensure it can be found on your PATH.'
121
+ )
122
+ }
123
+
124
+ super(exe)
125
+ this.setLoopback(true)
126
+ }
127
+
128
+ /**
129
+ * Sets the path of the log file the driver should log to. If a log file is
130
+ * not specified, the driver will log to stderr.
131
+ * @param {string} path Path of the log file to use.
132
+ * @return {!ServiceBuilder} A self reference.
133
+ */
134
+ loggingTo(path) {
135
+ return this.addArguments('--log-path=' + path)
136
+ }
137
+
138
+ /**
139
+ * Enables verbose logging.
140
+ * @return {!ServiceBuilder} A self reference.
141
+ */
142
+ enableVerboseLogging() {
143
+ return this.addArguments('--verbose')
144
+ }
145
+
146
+ /**
147
+ * Silence sthe drivers output.
148
+ * @return {!ServiceBuilder} A self reference.
149
+ */
150
+ silent() {
151
+ return this.addArguments('--silent')
152
+ }
153
+ }
154
+
155
+ /** @type {remote.DriverService} */
156
+ var defaultService = null
157
+
158
+ /**
159
+ * Sets the default service to use for new OperaDriver instances.
160
+ * @param {!remote.DriverService} service The service to use.
161
+ * @throws {Error} If the default service is currently running.
162
+ */
163
+ function setDefaultService(service) {
164
+ if (defaultService && defaultService.isRunning()) {
165
+ throw Error(
166
+ 'The previously configured OperaDriver service is still running. ' +
167
+ 'You must shut it down before you may adjust its configuration.'
168
+ )
169
+ }
170
+ defaultService = service
171
+ }
172
+
173
+ /**
174
+ * Returns the default OperaDriver service. If such a service has not been
175
+ * configured, one will be constructed using the default configuration for
176
+ * a OperaDriver executable found on the system PATH.
177
+ * @return {!remote.DriverService} The default OperaDriver service.
178
+ */
179
+ function getDefaultService() {
180
+ if (!defaultService) {
181
+ defaultService = new ServiceBuilder().build()
182
+ }
183
+ return defaultService
184
+ }
185
+
186
+ /**
187
+ * @type {string}
188
+ * @const
189
+ */
190
+ var OPTIONS_CAPABILITY_KEY = 'chromeOptions'
191
+
192
+ /**
193
+ * Class for managing {@linkplain Driver OperaDriver} specific options.
194
+ */
195
+ class Options {
196
+ constructor() {
197
+ /** @private {!Array.<string>} */
198
+ this.args_ = []
199
+
200
+ /** @private {?string} */
201
+ this.binary_ = null
202
+
203
+ /** @private {!Array.<(string|!Buffer)>} */
204
+ this.extensions_ = []
205
+
206
+ /** @private {./lib/logging.Preferences} */
207
+ this.logPrefs_ = null
208
+
209
+ /** @private {?capabilities.ProxyConfig} */
210
+ this.proxy_ = null
211
+ }
212
+
213
+ /**
214
+ * Extracts the OperaDriver specific options from the given capabilities
215
+ * object.
216
+ * @param {!capabilities.Capabilities} caps The capabilities object.
217
+ * @return {!Options} The OperaDriver options.
218
+ */
219
+ static fromCapabilities(caps) {
220
+ var options
221
+ var o = caps.get(OPTIONS_CAPABILITY_KEY)
222
+ if (o instanceof Options) {
223
+ options = o
224
+ } else if (o) {
225
+ options = new Options()
226
+ .addArguments(o.args || [])
227
+ .addExtensions(o.extensions || [])
228
+ .setOperaBinaryPath(o.binary)
229
+ } else {
230
+ options = new Options()
231
+ }
232
+
233
+ if (caps.has(capabilities.Capability.PROXY)) {
234
+ options.setProxy(caps.get(capabilities.Capability.PROXY))
235
+ }
236
+
237
+ if (caps.has(capabilities.Capability.LOGGING_PREFS)) {
238
+ options.setLoggingPrefs(caps.get(capabilities.Capability.LOGGING_PREFS))
239
+ }
240
+
241
+ return options
242
+ }
243
+
244
+ /**
245
+ * Add additional command line arguments to use when launching the Opera
246
+ * browser. Each argument may be specified with or without the "--" prefix
247
+ * (e.g. "--foo" and "foo"). Arguments with an associated value should be
248
+ * delimited by an "=": "foo=bar".
249
+ * @param {...(string|!Array.<string>)} var_args The arguments to add.
250
+ * @return {!Options} A self reference.
251
+ */
252
+ addArguments(var_args) { // eslint-disable-line
253
+ this.args_ = this.args_.concat.apply(this.args_, arguments)
254
+ return this
255
+ }
256
+
257
+ /**
258
+ * Add additional extensions to install when launching Opera. Each extension
259
+ * should be specified as the path to the packed CRX file, or a Buffer for an
260
+ * extension.
261
+ * @param {...(string|!Buffer|!Array.<(string|!Buffer)>)} var_args The
262
+ * extensions to add.
263
+ * @return {!Options} A self reference.
264
+ */
265
+ addExtensions(var_args) { // eslint-disable-line
266
+ this.extensions_ = this.extensions_.concat.apply(
267
+ this.extensions_,
268
+ arguments
269
+ )
270
+ return this
271
+ }
272
+
273
+ /**
274
+ * Sets the path to the Opera binary to use. On Mac OS X, this path should
275
+ * reference the actual Opera executable, not just the application binary. The
276
+ * binary path be absolute or relative to the operadriver server executable, but
277
+ * it must exist on the machine that will launch Opera.
278
+ *
279
+ * @param {string} path The path to the Opera binary to use.
280
+ * @return {!Options} A self reference.
281
+ */
282
+ setOperaBinaryPath(path) {
283
+ this.binary_ = path
284
+ return this
285
+ }
286
+
287
+ /**
288
+ * Sets the logging preferences for the new session.
289
+ * @param {!./lib/logging.Preferences} prefs The logging preferences.
290
+ * @return {!Options} A self reference.
291
+ */
292
+ setLoggingPrefs(prefs) {
293
+ this.logPrefs_ = prefs
294
+ return this
295
+ }
296
+
297
+ /**
298
+ * Sets the proxy settings for the new session.
299
+ * @param {capabilities.ProxyConfig} proxy The proxy configuration to use.
300
+ * @return {!Options} A self reference.
301
+ */
302
+ setProxy(proxy) {
303
+ this.proxy_ = proxy
304
+ return this
305
+ }
306
+
307
+ /**
308
+ * Converts this options instance to a {@link capabilities.Capabilities}
309
+ * object.
310
+ * @param {capabilities.Capabilities=} opt_capabilities The capabilities to
311
+ * merge these options into, if any.
312
+ * @return {!capabilities.Capabilities} The capabilities.
313
+ */
314
+ toCapabilities(opt_capabilities) {
315
+ var caps = opt_capabilities || capabilities.Capabilities.opera()
316
+ caps
317
+ .set(capabilities.Capability.PROXY, this.proxy_)
318
+ .set(capabilities.Capability.LOGGING_PREFS, this.logPrefs_)
319
+ .set(OPTIONS_CAPABILITY_KEY, this)
320
+ return caps
321
+ }
322
+
323
+ /**
324
+ * Converts this instance to its JSON wire protocol representation. Note this
325
+ * function is an implementation not intended for general use.
326
+ * @return {!Object} The JSON wire protocol representation of this instance.
327
+ */
328
+ [Symbols.serialize]() {
329
+ var json = {
330
+ args: this.args_,
331
+ extensions: this.extensions_.map(function (extension) {
332
+ if (Buffer.isBuffer(extension)) {
333
+ return extension.toString('base64')
334
+ }
335
+ return io
336
+ .read(/** @type {string} */ (extension))
337
+ .then((buffer) => buffer.toString('base64'))
338
+ }),
339
+ }
340
+ if (this.binary_) {
341
+ json.binary = this.binary_
342
+ }
343
+ return json
344
+ }
345
+ }
346
+
347
+ /**
348
+ * Creates a new WebDriver client for Opera.
349
+ */
350
+ class Driver extends webdriver.WebDriver {
351
+ /**
352
+ * Creates a new session for Opera.
353
+ *
354
+ * @param {(Capabilities|Options)=} opt_config The configuration
355
+ * options.
356
+ * @param {remote.DriverService=} opt_service The session to use; will use
357
+ * the {@link getDefaultService default service} by default.
358
+ * @return {!Driver} A new driver instance.
359
+ */
360
+ static createSession(opt_config, opt_service) {
361
+ var service = opt_service || getDefaultService()
362
+ var client = service.start().then((url) => new http.HttpClient(url))
363
+ var executor = new http.Executor(client)
364
+
365
+ var caps =
366
+ opt_config instanceof Options
367
+ ? opt_config.toCapabilities()
368
+ : opt_config || capabilities.Capabilities.opera()
369
+
370
+ // On Linux, the OperaDriver does not look for Opera on the PATH, so we
371
+ // must explicitly find it. See: operachromiumdriver #9.
372
+ if (process.platform === 'linux') {
373
+ var options = Options.fromCapabilities(caps)
374
+ if (!options.binary_) {
375
+ let exe = io.findInPath('opera', true)
376
+ if (!exe) {
377
+ throw Error(
378
+ 'The opera executable could not be found on the current PATH'
379
+ )
380
+ }
381
+ options.setOperaBinaryPath(exe)
382
+ }
383
+ caps = options.toCapabilities(caps)
384
+ }
385
+
386
+ return /** @type {!Driver} */ (super.createSession(executor, caps, () =>
387
+ service.kill()
388
+ ))
389
+ }
390
+
391
+ /**
392
+ * This function is a no-op as file detectors are not supported by this
393
+ * implementation.
394
+ * @override
395
+ */
396
+ setFileDetector() {}
397
+ }
398
+
399
+ // PUBLIC API
400
+
401
+ exports.Driver = Driver
402
+ exports.Options = Options
403
+ exports.ServiceBuilder = ServiceBuilder
404
+ exports.getDefaultService = getDefaultService
405
+ exports.setDefaultService = setDefaultService
406
+ exports.locateSynchronously = locateSynchronously