wisp-schema 0.16.0 → 1.0.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: '0969953deb28f10886f8cffa74216aa4c86d3a39ec95888205b9a12b31aa61a9'
4
- data.tar.gz: 13b9e77adf29c6ea2fd654018f11831680caa685f3f32c4841e1f0cd49dcdd05
3
+ metadata.gz: d0daa69d643e44686ba49c08d4a23d292675cbf8ed8ebcc06edb717baf8a66c7
4
+ data.tar.gz: f2fa4b9202c00dfb4fd283c007fafe1d328902efa3106107d479da48b7a0adc5
5
5
  SHA512:
6
- metadata.gz: 206c4d06c894c587be75ec5c1237735ff4214b2e6fb12c4be296d15311779896a92917aa89daf80eabd5935ddd0ddf0b668175aa4daf037289cb91a79080bdb2
7
- data.tar.gz: ac4a825e57de6b57be585dc414bd5325869a75cc97114ecaa32c18cabc63d7ce2c672491aa11031d5bde4536fb9f2d1c4307830f46f619c27ea24d4c7c321881
6
+ metadata.gz: b7deb73f4bbb3f4a5ab23b167bda667bb4f1240db0570dc506b1bdff7c102911d1e7c7e505d8214e9d606d0dd7e4e195dccae081746f42f4b2aac5b6c342bc67
7
+ data.tar.gz: 2cab85011f965738c53a294cbc55bddf9369100b8aa110ea7fa6209eb5baabd4db508c566d6da2b7d0f1fd7fff4999dfdcb43a52ca34d805c9d189004a6c6b8c
@@ -0,0 +1,71 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "definitions": {
4
+ "ui_element": {
5
+ "type": "object",
6
+ "title": "UI Element",
7
+ "description": "Any other UI Element",
8
+ "properties": {
9
+ "type": {
10
+ "enum": ["ui_element"]
11
+ },
12
+ "element": {"title": "Element", "type": "string"},
13
+ "focus_x": {"title": "Focus offset for x-axis from top left corner", "type": "integer", "options": {"hidden": true}},
14
+ "focus_y": {"title": "Focus offset for y-axis from top left corner", "type": "integer", "options": {"hidden": true}},
15
+ "match_mode": {
16
+ "enum": ["pixel", "pixel_and_ocr"]
17
+ },
18
+ "ocr_expression": {
19
+ "title": "Expression to use for text matching",
20
+ "type": "string",
21
+ "maxLength": 999
22
+ },
23
+ "ocr_status": {
24
+ "title": "OCR result description",
25
+ "enum": ["SUCCESS", "TOO_MUCH_TEXT", "NO_TEXT"]
26
+ },
27
+ "ocr_box": {
28
+ "title": "Text content bounding box",
29
+ "type": "object",
30
+ "properties": {
31
+ "x": {"type": "integer"},
32
+ "y": {"type": "integer"},
33
+ "w": {"type": "integer"},
34
+ "h": {"type": "integer"}
35
+ }
36
+ }
37
+ },
38
+ "additionalProperties": false,
39
+ "required": ["type", "element"]
40
+ },
41
+ "ui_element_reference": {
42
+ "type": "object",
43
+ "title": "UI Element Reference",
44
+ "description": "A UI Element stored in the database",
45
+ "properties": {
46
+ "type": {
47
+ "enum": ["ui_element_reference"]
48
+ },
49
+ "id": {"title": "UI Element ID", "type": "integer"}
50
+ },
51
+ "additionalProperties": false,
52
+ "required": ["type", "id"]
53
+ }
54
+ },
55
+ "type": "object",
56
+ "title": "Single Wisp Noun",
57
+ "properties": {
58
+ "version": {
59
+ "type": "string",
60
+ "title": "Version"
61
+ },
62
+ "noun": {
63
+ "oneOf": [
64
+ {"$ref": "#/definitions/ui_element"},
65
+ {"$ref": "#/definitions/ui_element_reference"}
66
+ ]
67
+ }
68
+ },
69
+ "additionalProperties": false,
70
+ "required": ["version", "noun"]
71
+ }
@@ -0,0 +1,379 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "definitions": {
4
+ "noun": {
5
+ "title": "Wisp Noun",
6
+ "oneOf": [
7
+ {"$ref": "#/definitions/ui_element"},
8
+ {"$ref": "#/definitions/ui_element_reference"}
9
+ ]
10
+ },
11
+ "ui_element": {
12
+ "type": "object",
13
+ "title": "UI Element",
14
+ "description": "Any other UI Element",
15
+ "properties": {
16
+ "type": {
17
+ "enum": ["ui_element"]
18
+ },
19
+ "element": {"title": "Element", "type": "string"},
20
+ "focus_x": {"title": "Focus offset for x-axis from top left corner", "type": "integer", "options": {"hidden": true}},
21
+ "focus_y": {"title": "Focus offset for y-axis from top left corner", "type": "integer", "options": {"hidden": true}},
22
+ "match_mode": {
23
+ "enum": ["pixel", "pixel_and_ocr"]
24
+ },
25
+ "ocr_expression": {
26
+ "title": "Expression to use for text matching",
27
+ "type": "string",
28
+ "maxLength": 999
29
+ },
30
+ "ocr_status": {
31
+ "title": "OCR result description",
32
+ "enum": ["SUCCESS", "TOO_MUCH_TEXT", "NO_TEXT"]
33
+ },
34
+ "ocr_box": {
35
+ "title": "Text content bounding box",
36
+ "type": "object",
37
+ "properties": {
38
+ "x": {"type": "integer"},
39
+ "y": {"type": "integer"},
40
+ "w": {"type": "integer"},
41
+ "h": {"type": "integer"}
42
+ }
43
+ }
44
+ },
45
+ "additionalProperties": false,
46
+ "required": ["type", "element"]
47
+ },
48
+ "ui_element_reference": {
49
+ "type": "object",
50
+ "title": "UI Element Reference",
51
+ "description": "A UI Element stored in the database",
52
+ "properties": {
53
+ "type": {
54
+ "enum": ["ui_element_reference"]
55
+ },
56
+ "id": {"title": "UI Element ID", "type": "integer"}
57
+ },
58
+ "additionalProperties": false,
59
+ "required": ["type", "id"]
60
+ },
61
+ "verb": {
62
+ "title": "Wisp Verb",
63
+ "oneOf": [
64
+ {"$ref": "#/definitions/click"},
65
+ {"$ref": "#/definitions/double_click"},
66
+ {"$ref": "#/definitions/fill"},
67
+ {"$ref": "#/definitions/type"},
68
+ {"$ref": "#/definitions/send_key"},
69
+ {"$ref": "#/definitions/hover"},
70
+ {"$ref": "#/definitions/select"},
71
+ {"$ref": "#/definitions/refresh"},
72
+ {"$ref": "#/definitions/navigate"},
73
+ {"$ref": "#/definitions/close_tab"},
74
+ {"$ref": "#/definitions/scroll"},
75
+ {"$ref": "#/definitions/wait"},
76
+ {"$ref": "#/definitions/drag_and_drop"},
77
+ {"$ref": "#/definitions/tester_instruction"},
78
+ {"$ref": "#/definitions/embedded_test"},
79
+ {"$ref": "#/definitions/observe"},
80
+ {"$ref": "#/definitions/tester_confirmation"}
81
+ ]
82
+ },
83
+ "click": {
84
+ "type": "object",
85
+ "title": "Click",
86
+ "description": "Clicks on the UI element",
87
+ "properties": {
88
+ "action": {
89
+ "enum": ["click"]
90
+ },
91
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
92
+ "target": {
93
+ "title": "Target",
94
+ "$ref": "#/definitions/noun"
95
+ },
96
+ "button": {"title": "Mouse Button", "type": "string", "enum": ["left", "middle", "right"]},
97
+ "hold": {"title": "And Hold", "type": "boolean"},
98
+ "hold_seconds": {"title": "Hold seconds", "type": "integer"}
99
+ },
100
+ "additionalProperties": false,
101
+ "required": ["action", "target", "button", "hold"]
102
+ },
103
+ "double_click": {
104
+ "type": "object",
105
+ "title": "Double Click",
106
+ "description": "Double-clicks on the UI element",
107
+ "properties": {
108
+ "action": {
109
+ "enum": ["double_click"]
110
+ },
111
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
112
+ "target": {
113
+ "title": "Target",
114
+ "$ref": "#/definitions/noun"
115
+ }
116
+ },
117
+ "additionalProperties": false,
118
+ "required": ["action", "target"]
119
+ },
120
+ "fill": {
121
+ "type": "object",
122
+ "title": "Fill",
123
+ "description": "Fills the text field with specified content",
124
+ "properties": {
125
+ "action": {
126
+ "enum": ["fill"]
127
+ },
128
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
129
+ "target": {
130
+ "title": "Target",
131
+ "$ref": "#/definitions/noun"
132
+ },
133
+ "text": {"title": "Text", "type": "string"}
134
+ },
135
+ "additionalProperties": false,
136
+ "required": ["action", "target", "text"]
137
+ },
138
+ "type": {
139
+ "type": "object",
140
+ "title": "Type",
141
+ "description": "Types in specified text",
142
+ "properties": {
143
+ "action": {
144
+ "enum": ["type"]
145
+ },
146
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
147
+ "text": {"title": "Text", "type": "string"}
148
+ },
149
+ "additionalProperties": false,
150
+ "required": ["action", "text"]
151
+ },
152
+ "send_key": {
153
+ "type": "object",
154
+ "title": "Press Key",
155
+ "description": "Press specified key or key combination.",
156
+ "properties": {
157
+ "action": {
158
+ "enum": ["send_key"]
159
+ },
160
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
161
+ "key": {"title": "Key", "type": "string"},
162
+ "modifier": {"title": "Modifier", "type": "string"}
163
+ },
164
+ "additionalProperties": false,
165
+ "required": ["action", "key"]
166
+ },
167
+ "hover": {
168
+ "type": "object",
169
+ "title": "Hover",
170
+ "description": "Hovers over specified element",
171
+ "properties": {
172
+ "action": {
173
+ "enum": ["hover"]
174
+ },
175
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
176
+ "target": {
177
+ "title": "Target",
178
+ "$ref": "#/definitions/noun"
179
+ }
180
+ },
181
+ "additionalProperties": false,
182
+ "required": ["action", "target"]
183
+ },
184
+ "select": {
185
+ "type": "object",
186
+ "title": "Select",
187
+ "description": "Selects specified item from the dropdown",
188
+ "properties": {
189
+ "action": {
190
+ "enum": ["select"]
191
+ },
192
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
193
+ "target": {
194
+ "title": "Target",
195
+ "$ref": "#/definitions/noun"
196
+ },
197
+ "option": {
198
+ "title": "Option",
199
+ "$ref": "#/definitions/noun"
200
+ }
201
+ },
202
+ "additionalProperties": false,
203
+ "required": ["action", "target", "option"]
204
+ },
205
+ "refresh": {
206
+ "type": "object",
207
+ "title": "Refresh",
208
+ "description": "Refreshes the webpage",
209
+ "properties": {
210
+ "action": {
211
+ "enum": ["refresh"]
212
+ },
213
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"}
214
+ },
215
+ "additionalProperties": false,
216
+ "required": ["action"]
217
+ },
218
+ "navigate": {
219
+ "type": "object",
220
+ "title": "Navigate",
221
+ "description": "Navigates to specified URL",
222
+ "properties": {
223
+ "action": {
224
+ "enum": ["navigate"]
225
+ },
226
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
227
+ "url": {"title": "URL", "type": "string"},
228
+ "tab": {"title": "Tab", "type": "string", "enum": ["current", "new", "incognito"]}
229
+ },
230
+ "additionalProperties": false,
231
+ "required": ["action", "url"]
232
+ },
233
+ "close_tab": {
234
+ "type": "object",
235
+ "title": "Close Tab",
236
+ "description": "Closes current browser tab",
237
+ "properties": {
238
+ "action": {
239
+ "enum": ["close_tab"]
240
+ },
241
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"}
242
+ },
243
+ "additionalProperties": false,
244
+ "required": ["action"]
245
+ },
246
+ "scroll": {
247
+ "type": "object",
248
+ "title": "Scroll",
249
+ "description": "Scrolls the page into specified direction until target is reached",
250
+ "properties": {
251
+ "action": {
252
+ "enum": ["scroll"]
253
+ },
254
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
255
+ "direction": {"title": "Direction", "type": "string", "enum": ["up", "down", "left", "right"]},
256
+ "target": {
257
+ "title": "Target",
258
+ "$ref": "#/definitions/noun"
259
+ }
260
+ },
261
+ "additionalProperties": false,
262
+ "required": ["action", "direction", "target"]
263
+ },
264
+ "wait": {
265
+ "type": "object",
266
+ "title": "Wait",
267
+ "description": "Waits for a number of seconds",
268
+ "properties": {
269
+ "action": {
270
+ "enum": ["wait"]
271
+ },
272
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
273
+ "seconds": {"title": "seconds", "type": "integer"}
274
+ },
275
+ "additionalProperties": false,
276
+ "required": ["action", "seconds"]
277
+ },
278
+ "drag_and_drop": {
279
+ "type": "object",
280
+ "title": "Drag and drop",
281
+ "description": "Drag and drop",
282
+ "properties": {
283
+ "action": {
284
+ "enum": ["drag_and_drop"]
285
+ },
286
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
287
+ "object": {
288
+ "title": "Object",
289
+ "$ref": "#/definitions/noun"
290
+ },
291
+ "target": {
292
+ "title": "Target",
293
+ "$ref": "#/definitions/noun"
294
+ }
295
+ },
296
+ "additionalProperties": false,
297
+ "required": ["action", "target", "object"]
298
+ },
299
+ "embedded_test": {
300
+ "type": "object",
301
+ "title": "Embedded Test",
302
+ "description": "Embeds a Test",
303
+ "properties": {
304
+ "action": {
305
+ "enum": ["embedded_test"]
306
+ },
307
+ "test_id": {
308
+ "title": "Test ID",
309
+ "type": "integer"
310
+ }
311
+ },
312
+ "additionalProperties": false,
313
+ "required": ["action", "test_id"]
314
+ },
315
+ "tester_instruction": {
316
+ "type": "object",
317
+ "title": "Tester Instruction",
318
+ "description": "Allows to fallback to english",
319
+ "properties": {
320
+ "action": {
321
+ "enum": ["tester_instruction"]
322
+ },
323
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
324
+ "instruction": {"title": "Instruction", "type": "string"}
325
+ },
326
+ "additionalProperties": false,
327
+ "required": ["action", "instruction"]
328
+ },
329
+ "observe": {
330
+ "type": "object",
331
+ "title": "Observe",
332
+ "description": "Checks if element of the UI is visible or not",
333
+ "properties": {
334
+ "assertion": {
335
+ "enum": ["observe"]
336
+ },
337
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
338
+ "object": {
339
+ "title": "Object",
340
+ "$ref": "#/definitions/noun"
341
+ },
342
+ "visiblity": {"title": "Is the element visible?", "type": "boolean"}
343
+ },
344
+ "additionalProperties": false,
345
+ "required": ["assertion", "object"]
346
+ },
347
+ "tester_confirmation": {
348
+ "type": "object",
349
+ "title": "Tester Confirmation",
350
+ "description": "Allows to fallback to english",
351
+ "properties": {
352
+ "assertion": {
353
+ "enum": ["tester_confirmation"]
354
+ },
355
+ "embedded_test_id": {"title": "Embedded Test ID", "type": "integer"},
356
+ "confirmation": {"title": "confirmation", "type": "string"}
357
+ },
358
+ "additionalProperties": false,
359
+ "required": ["assertion", "confirmation"]
360
+ }
361
+ },
362
+ "type": "object",
363
+ "title": "Wisp Test",
364
+ "properties": {
365
+ "version": {
366
+ "type": "string",
367
+ "title": "Version"
368
+ },
369
+ "verbs": {
370
+ "type": "array",
371
+ "title": "Verbs",
372
+ "items": {
373
+ "$ref": "#/definitions/verb"
374
+ }
375
+ }
376
+ },
377
+ "additionalProperties": false,
378
+ "required": ["version", "verbs"]
379
+ }
@@ -1,8 +1,36 @@
1
1
  # frozen_string_literal: true
2
+ require 'json_schemer'
3
+ require 'semantic'
4
+ require_relative 'version'
2
5
 
3
6
  module Wisp
4
- VERSION = '0.16.0'
5
-
6
7
  SCHEMA_PATH = File.expand_path('../wisp.json', __dir__)
7
8
  NOUNS_PATH = File.expand_path('../nouns.json', __dir__)
9
+
10
+ CANARY_SCHEMA_PATH = File.expand_path('../canary-wisp.json', __dir__)
11
+ CANARY_NOUNS_PATH = File.expand_path('../canary-nouns.json', __dir__)
12
+
13
+ SEMANTIC_STABLE_VERSION = Semantic::Version.new(STABLE_VERSION)
14
+
15
+ def wisp_schemer(raw_version)
16
+ version = Semantic::Version.new(raw_version)
17
+
18
+ if version > SEMANTIC_STABLE_VERSION
19
+ JSONSchemer.schema(Pathname.new(Wisp::CANARY_SCHEMA_PATH))
20
+ else
21
+ JSONSchemer.schema(Pathname.new(Wisp::SCHEMA_PATH))
22
+ end
23
+ end
24
+ module_function :wisp_schemer
25
+
26
+ def nouns_schemer(raw_version)
27
+ version = Semantic::Version.new(raw_version)
28
+
29
+ if version > SEMANTIC_STABLE_VERSION
30
+ JSONSchemer.schema(Pathname.new(Wisp::CANARY_NOUNS_PATH))
31
+ else
32
+ JSONSchemer.schema(Pathname.new(Wisp::NOUNS_PATH))
33
+ end
34
+ end
35
+ module_function :nouns_schemer
8
36
  end
data/nouns.json CHANGED
@@ -11,7 +11,29 @@
11
11
  },
12
12
  "element": {"title": "Element", "type": "string"},
13
13
  "focus_x": {"title": "Focus offset for x-axis from top left corner", "type": "integer", "options": {"hidden": true}},
14
- "focus_y": {"title": "Focus offset for y-axis from top left corner", "type": "integer", "options": {"hidden": true}}
14
+ "focus_y": {"title": "Focus offset for y-axis from top left corner", "type": "integer", "options": {"hidden": true}},
15
+ "match_mode": {
16
+ "enum": ["pixel", "pixel_and_ocr"]
17
+ },
18
+ "ocr_expression": {
19
+ "title": "Expression to use for text matching",
20
+ "type": "string",
21
+ "maxLength": 999
22
+ },
23
+ "ocr_status": {
24
+ "title": "OCR result description",
25
+ "enum": ["SUCCESS", "TOO_MUCH_TEXT", "NO_TEXT"]
26
+ },
27
+ "ocr_box": {
28
+ "title": "Text content bounding box",
29
+ "type": "object",
30
+ "properties": {
31
+ "x": {"type": "integer"},
32
+ "y": {"type": "integer"},
33
+ "w": {"type": "integer"},
34
+ "h": {"type": "integer"}
35
+ }
36
+ }
15
37
  },
16
38
  "additionalProperties": false,
17
39
  "required": ["type", "element"]
data/wisp.json CHANGED
@@ -18,7 +18,29 @@
18
18
  },
19
19
  "element": {"title": "Element", "type": "string"},
20
20
  "focus_x": {"title": "Focus offset for x-axis from top left corner", "type": "integer", "options": {"hidden": true}},
21
- "focus_y": {"title": "Focus offset for y-axis from top left corner", "type": "integer", "options": {"hidden": true}}
21
+ "focus_y": {"title": "Focus offset for y-axis from top left corner", "type": "integer", "options": {"hidden": true}},
22
+ "match_mode": {
23
+ "enum": ["pixel", "pixel_and_ocr"]
24
+ },
25
+ "ocr_expression": {
26
+ "title": "Expression to use for text matching",
27
+ "type": "string",
28
+ "maxLength": 999
29
+ },
30
+ "ocr_status": {
31
+ "title": "OCR result description",
32
+ "enum": ["SUCCESS", "TOO_MUCH_TEXT", "NO_TEXT"]
33
+ },
34
+ "ocr_box": {
35
+ "title": "Text content bounding box",
36
+ "type": "object",
37
+ "properties": {
38
+ "x": {"type": "integer"},
39
+ "y": {"type": "integer"},
40
+ "w": {"type": "integer"},
41
+ "h": {"type": "integer"}
42
+ }
43
+ }
22
44
  },
23
45
  "additionalProperties": false,
24
46
  "required": ["type", "element"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wisp-schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Grodowski
@@ -11,13 +11,43 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
  date: 2018-11-15 00:00:00.000000000 Z
14
- dependencies: []
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json_schemer
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: 0.2.17
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: 0.2.17
29
+ - !ruby/object:Gem::Dependency
30
+ name: semantic
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '1.6'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.6'
15
43
  description: This gem contains Wisp's JSON schema definition
16
44
  email:
17
45
  executables: []
18
46
  extensions: []
19
47
  extra_rdoc_files: []
20
48
  files:
49
+ - canary-nouns.json
50
+ - canary-wisp.json
21
51
  - lib/wisp-schema.rb
22
52
  - nouns.json
23
53
  - wisp.json
@@ -40,7 +70,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
40
70
  - !ruby/object:Gem::Version
41
71
  version: '0'
42
72
  requirements: []
43
- rubygems_version: 3.0.3
73
+ rubygems_version: 3.2.3
44
74
  signing_key:
45
75
  specification_version: 4
46
76
  summary: Wisp's schema