mushy 0.16.0 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mushy/builder/api.rb +1 -2
- data/lib/mushy/builder/index.rb +12 -12
- data/lib/mushy/flux.rb +5 -1
- data/lib/mushy/fluxs/environment.rb +12 -0
- data/lib/mushy/fluxs/file_watch.rb +29 -1
- data/lib/mushy/fluxs/filter.rb +26 -0
- data/lib/mushy/fluxs/format.rb +40 -1
- data/lib/mushy/fluxs/global_variables.rb +16 -1
- data/lib/mushy/fluxs/parse_html.rb +36 -1
- data/lib/mushy/fluxs/pdf.rb +71 -1
- data/lib/mushy/fluxs/read_csv.rb +26 -0
- data/lib/mushy/fluxs/read_file.rb +23 -9
- data/lib/mushy/fluxs/screenshot.rb +71 -2
- data/lib/mushy/fluxs/stdout.rb +1 -0
- data/lib/mushy/fluxs/times.rb +7 -0
- data/lib/mushy/fluxs/write_file.rb +47 -0
- data/mushy.gemspec +1 -1
- metadata +1 -2
- data/lib/mushy/fluxs/print.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a999131659ac9039500b30ed19769e5eefbcd1e8d7d6d17944f60ef498e05ce
|
4
|
+
data.tar.gz: 490b583acb52f7100d62ff77acfb68d12aa49505c5f9a628ff47707e358d93c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 433b4bdb5716d5a035fb9b0b2a244d8d3a368a1338519aeca1e087545d9339baf44635a0562a8d3990115c2f6dc188a3465fb36c6b2f9de8d11126a872725eed
|
7
|
+
data.tar.gz: 77bc7c6ca893188da063935bc6c4178eee03c20d985041ea8b1c170a4452a497ea4df974b6c0747ef65d56d621cfb751763268c6e1b2185d5c67eb064f34781a
|
data/lib/mushy/builder/api.rb
CHANGED
@@ -77,7 +77,6 @@ module Mushy
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def self.get_flow file
|
80
|
-
puts "trying to get: #{file}"
|
81
80
|
file = "#{file}.mushy" unless file.downcase.end_with?('.mushy')
|
82
81
|
data = JSON.parse File.open(file).read
|
83
82
|
|
@@ -135,7 +134,7 @@ module Mushy
|
|
135
134
|
details[:config][:incoming_split] = { type: 'text', shrink: true, description: 'Split an incoming event into multiple events by this key, an each event will be processed independently.', default: '' }
|
136
135
|
details[:config][:outgoing_split] = { type: 'text', shrink: true, description: 'Split an outgoing event into multiple events by this key.', default: '' }
|
137
136
|
details[:config][:merge] = { type: 'text', shrink: true, description: 'A comma-delimited list of fields from the event to carry through. Use * to merge all fields.', default: '' }
|
138
|
-
details[:config][:group] = { type: 'text', shrink: true, description: 'Group events by
|
137
|
+
details[:config][:group] = { type: 'text', shrink: true, description: 'Group events by this key, with the value as the key. If a group key is provided like group_by|group_key, then multiple events with the results under group_key will be returned.', default: '' }
|
139
138
|
details[:config][:limit] = { type: 'integer', shrink: true, description: 'Limit the number of events to this number.', default: '' }
|
140
139
|
details[:config][:join] = { type: 'text', shrink: true, description: 'Join all of the events from this flux into one event, under this name.', default: '' }
|
141
140
|
details[:config][:sort] = { type: 'text', shrink: true, description: 'Sort by this key.', default: '' }
|
data/lib/mushy/builder/index.rb
CHANGED
@@ -167,7 +167,7 @@ module Mushy
|
|
167
167
|
},
|
168
168
|
text: {
|
169
169
|
props: ['label', 'placeholder', 'disabled', 'readonly', 'value', 'description', 'shrink'],
|
170
|
-
|
170
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a></div></div></div> <div class="control"><input type="text" :name="id" v-if="value || !shrink" :placeholder="placeholder" v-bind:value="value" v-on:input="$emit(\\'update:value\\', $event.target.value);" :disabled="disabled == \\'true\\'" :readonly="readonly == \\'true\\'" class="input"></div></div>'
|
171
171
|
},
|
172
172
|
hide: {
|
173
173
|
props: ['label', 'description'],
|
@@ -175,19 +175,19 @@ module Mushy
|
|
175
175
|
},
|
176
176
|
integer: {
|
177
177
|
props: ['label', 'placeholder', 'disabled', 'readonly', 'value', 'description', 'shrink'],
|
178
|
-
template: '<div><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a
|
178
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a></div></div></div> <div class="control"><input type="text" :name="id" v-if="value || !shrink" :placeholder="placeholder" v-bind:value="value" v-on:input="$emit(\\'update:value\\', $event.target.value);" :disabled="disabled == \\'true\\'" :readonly="readonly == \\'true\\'" class="input"></div></div>'
|
179
179
|
},
|
180
180
|
email: {
|
181
181
|
props: ['label', 'placeholder', 'disabled', 'readonly', 'value', 'description', 'shrink'],
|
182
|
-
template: '<div><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a
|
182
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a></div></div></div> <div class="control"><input type="email" :name="id" v-if="value || !shrink" :placeholder="placeholder" v-bind:value="value" v-on:input="$emit(\\'update:value\\', $event.target.value)" :disabled="disabled == \\'true\\'" :readonly="readonly == \\'true\\'" class="input"></div></div>'
|
183
183
|
},
|
184
184
|
textarea: {
|
185
185
|
props: ['label', 'placeholder', 'disabled', 'readonly', 'value', 'description', 'shrink'],
|
186
|
-
template: '<div><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a
|
186
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a></div></div></div> <div class="control"><textarea :name="id" v-if="value || !shrink" :placeholder="placeholder" v-bind:value="value" v-on:input="$emit(\\'update:value\\', $event.target.value)" :disabled="disabled == \\'true\\'" :readonly="readonly == \\'true\\'" class="textarea"></textarea></div></div>'
|
187
187
|
},
|
188
188
|
json: {
|
189
189
|
props: ['label', 'placeholder', 'disabled', 'readonly', 'value', 'description', 'shrink'],
|
190
|
-
template: '<div><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a
|
190
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a></div></div></div> <textarea :name="id" v-if="value || !shrink" :placeholder="placeholder" v-bind:value="value" v-on:input="$emit(\\'update:value\\', $event.target.value)" :disabled="disabled == \\'true\\'" :readonly="readonly == \\'true\\'" class="textarea"></textarea></div>'
|
191
191
|
},
|
192
192
|
jsonview: {
|
193
193
|
data: function() {
|
@@ -202,15 +202,15 @@ module Mushy
|
|
202
202
|
},
|
203
203
|
radio: {
|
204
204
|
props: ['label', 'value', 'options', 'description', 'shrink'],
|
205
|
-
template: '<div><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a
|
205
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a></div></div></div> <div v-for="option in options"><input type="radio" :name="id" v-bind:value="option" v-if="value || !shrink" v-on:input="$emit(\\'update:value\\', $event.target.value)" :checked="value == option"> <label for="option">{{option}}</label></div></div>'
|
206
206
|
},
|
207
207
|
select: {
|
208
208
|
props: ['label', 'value', 'options', 'description', 'shrink'],
|
209
|
-
template: '<div><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a
|
209
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a></div></div></div> <div class="control"><select :name="id" v-if="value || !shrink" v-on:input="$emit(\\'update:value\\', $event.target.value)" class="select"><option v-for="option in options" v-bind:value="option" :selected="value == option">{{option}}</option></select></div></div>'
|
210
210
|
},
|
211
211
|
selectrecord: {
|
212
212
|
props: ['label', 'value', 'options', 'description', 'shrink'],
|
213
|
-
template: '<div><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a
|
213
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a></div></div></div> <div class="control"><select :name="id" v-if="value || !shrink" v-on:input="$emit(\\'update:value\\', $event.target.value)" class="select"><option v-for="option in options" v-bind:value="option.id" :selected="value == option.id">{{option.name}}</option></select></div></div>'
|
214
214
|
},
|
215
215
|
selectmanyrecords: {
|
216
216
|
data: function() {
|
@@ -236,11 +236,11 @@ module Mushy
|
|
236
236
|
};
|
237
237
|
},
|
238
238
|
props: ['label', 'value', 'options', 'description', 'shrink'],
|
239
|
-
template: '<div><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a> <span v-for="option in options" v-if="value && value.includes(option.id)">{{option.name}} <a href="#" v-on:click.prevent.stop="remove(option.id, value);$emit(\\'update:value\\', value)">[X]</a> </span> <a href="#" v-on:click.prevent.stop="doit(selectedValue, value);$emit(\\'update:value\\', value)">ADD</a> <div class="control"><select :name="id" v-if="value || !shrink" v-on:input="selectedValue=$event.target.value;" class="select"><option v-for="option in options" v-bind:value="option.id">{{option.name}}</option></select></div></div>'
|
239
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a></div></div></div> <span v-for="option in options" v-if="value && value.includes(option.id)">{{option.name}} <a href="#" v-on:click.prevent.stop="remove(option.id, value);$emit(\\'update:value\\', value)">[X]</a> </span> <a href="#" v-on:click.prevent.stop="doit(selectedValue, value);$emit(\\'update:value\\', value)">ADD</a> <div class="control"><select :name="id" v-if="value || !shrink" v-on:input="selectedValue=$event.target.value;" class="select"><option v-for="option in options" v-bind:value="option.id">{{option.name}}</option></select></div></div>'
|
240
240
|
},
|
241
241
|
boolean: {
|
242
242
|
props: ['label', 'value', 'options', 'description', 'shrink'],
|
243
|
-
template: '<div><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a
|
243
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && !value">[^]</a></div></div></div> <div class="control"><select :name="id" v-if="(value != undefined && value != null && value != \\'\\') || !shrink" v-on:input="$emit(\\'update:value\\', $event.target.value)" class="select"><option v-for="option in [true, false]" v-bind:value="option" :selected="value == option">{{option}}</option></select></div></div>'
|
244
244
|
},
|
245
245
|
table: {
|
246
246
|
props: ['value', 'description'],
|
@@ -262,7 +262,7 @@ module Mushy
|
|
262
262
|
};
|
263
263
|
},
|
264
264
|
props: ['value', 'editors', 'label', 'description', 'shrink'],
|
265
|
-
template: '<div><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && value.length == 0">[^]</a
|
265
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink && value.length == 0">[^]</a></div></div></div> <table v-if="value.length > 0 || !shrink" class="table"><tr><th v-for="(d, i) in value[0]">{{' + fancyName('i') + '}}</th></tr><tr v-for="(v, z) in value"><td v-for="(d, i) in v">{{d}}</td><td><a href="#" v-on:click.prevent.stop="removeRecord(v, value, z)">[x]</a></td></tr><tr><td v-for="editor in editors"><mip-thing :data="editor.field" :id="editor.id"></mip-thing></td><td><a href="#" v-on:click.prevent.stop="addRecord(editors, value)">[Add]</a></td></tr></table></div>'
|
266
266
|
},
|
267
267
|
keyvalue: {
|
268
268
|
data: function() {
|
@@ -277,7 +277,7 @@ module Mushy
|
|
277
277
|
};
|
278
278
|
},
|
279
279
|
props: ['value', 'label', 'editors', 'description', 'shrink'],
|
280
|
-
template: '<div><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink">[^]</a
|
280
|
+
template: '<div><div class="level"><div class="level-left"><div class="level-item"><mip-label :id="id" :label="label" :description="description" :hide_description="shrink && !value"></mip-label></div><div class="level-item"> <a href="#" v-on:click.prevent.stop="shrink=false" v-show="shrink">[^]</a></div></div></div> <table v-if="JSON.stringify(value) != \\'{}\\' || !shrink" class="table"><tr v-for="(v, k) in value"><td>{{k}}</td><td>{{v}}</td><td><button v-on:click.prevent.stop="removeRecord(value, k)" class="button">Remove {{k}}</button></td></tr><tr><td v-for="editor in editors"><mip-thing :data="editor.field" :id="editor.id"></mip-thing></td><td><button v-on:click.prevent.stop="addRecord(editors, value)" v-show="editors[0].field.value" class="button">{{actionText(editors[0].field.value, value)}} {{editors[0].field.value}}</button></td></tr></table></div>'
|
281
281
|
},
|
282
282
|
button: {
|
283
283
|
data: function() {
|
data/lib/mushy/flux.rb
CHANGED
@@ -119,7 +119,11 @@ module Mushy
|
|
119
119
|
def group_these_results results, event, by
|
120
120
|
group_by = by.split('|')[0]
|
121
121
|
result_key = by.split('|')[1]
|
122
|
-
results.group_by { |x| x[group_by] }
|
122
|
+
grouped_results = results.group_by { |x| x[group_by] }
|
123
|
+
|
124
|
+
return grouped_results unless result_key
|
125
|
+
|
126
|
+
grouped_results.map { |k, v| SymbolizedHash.new( { result_key => v } ) }
|
123
127
|
end
|
124
128
|
|
125
129
|
def outgoing_split_these_results results, event, by
|
@@ -5,6 +5,7 @@ module Mushy
|
|
5
5
|
def self.details
|
6
6
|
{
|
7
7
|
name: 'Environment',
|
8
|
+
title: 'Environment Variables',
|
8
9
|
description: 'Pull environment variables.',
|
9
10
|
config: {
|
10
11
|
variables: {
|
@@ -13,6 +14,17 @@ module Mushy
|
|
13
14
|
value: {},
|
14
15
|
},
|
15
16
|
},
|
17
|
+
examples: {
|
18
|
+
"Example" => {
|
19
|
+
description: 'Get environmental variables.',
|
20
|
+
config: {
|
21
|
+
variables: { text_domain: 'TEXTDOMAIN' }
|
22
|
+
},
|
23
|
+
result: {
|
24
|
+
text_domain: 'Linux-PAM',
|
25
|
+
}
|
26
|
+
},
|
27
|
+
}
|
16
28
|
}
|
17
29
|
end
|
18
30
|
|
@@ -7,14 +7,42 @@ module Mushy
|
|
7
7
|
def self.details
|
8
8
|
{
|
9
9
|
name: 'FileWatch',
|
10
|
+
title: 'File Watcher',
|
10
11
|
description: 'Watch for file changes.',
|
11
12
|
config: {
|
12
13
|
directory: {
|
13
|
-
description: 'The directory to watch.',
|
14
|
+
description: 'The directory to watch, defaults to the current directory.',
|
14
15
|
type: 'text',
|
16
|
+
shrink: true,
|
15
17
|
value: '',
|
16
18
|
},
|
17
19
|
},
|
20
|
+
examples: {
|
21
|
+
"Files Added" => {
|
22
|
+
description: 'When a file is added, this type of result will be returned.',
|
23
|
+
result: {
|
24
|
+
modified: [],
|
25
|
+
added: ["/home/pi/Desktop/mushy/bin/hey.txt"],
|
26
|
+
removed:[]
|
27
|
+
}
|
28
|
+
},
|
29
|
+
"Files Removed" => {
|
30
|
+
description: 'When a file is deleted, this type of result will be returned.',
|
31
|
+
result: {
|
32
|
+
modified: [],
|
33
|
+
added: [],
|
34
|
+
removed:["/home/pi/Desktop/mushy/mushy-0.15.3.gem"]
|
35
|
+
}
|
36
|
+
},
|
37
|
+
"Files Modified" => {
|
38
|
+
description: 'When a file is modified, this type of result will be returned.',
|
39
|
+
result: {
|
40
|
+
modified: ["/home/pi/Desktop/mushy/lib/mushy/fluxs/environment.rb"],
|
41
|
+
added: [],
|
42
|
+
removed:[]
|
43
|
+
}
|
44
|
+
},
|
45
|
+
}
|
18
46
|
}
|
19
47
|
end
|
20
48
|
|
data/lib/mushy/fluxs/filter.rb
CHANGED
@@ -36,6 +36,32 @@ module Mushy
|
|
36
36
|
value: {},
|
37
37
|
},
|
38
38
|
},
|
39
|
+
examples: {
|
40
|
+
"Match On A Value" => {
|
41
|
+
description: 'The input is returned if it matches on a value.',
|
42
|
+
input: {
|
43
|
+
name: "John",
|
44
|
+
},
|
45
|
+
config: {
|
46
|
+
matches: { name: "John" }
|
47
|
+
},
|
48
|
+
result: {
|
49
|
+
name: "John",
|
50
|
+
}
|
51
|
+
},
|
52
|
+
"Contains A Value" => {
|
53
|
+
description: 'The input is returned if it contains a value.',
|
54
|
+
input: {
|
55
|
+
name: "John",
|
56
|
+
},
|
57
|
+
config: {
|
58
|
+
contains: { name: "H" }
|
59
|
+
},
|
60
|
+
result: {
|
61
|
+
name: "John",
|
62
|
+
}
|
63
|
+
},
|
64
|
+
}
|
39
65
|
}
|
40
66
|
end
|
41
67
|
|
data/lib/mushy/fluxs/format.rb
CHANGED
@@ -5,8 +5,47 @@ module Mushy
|
|
5
5
|
def self.details
|
6
6
|
{
|
7
7
|
name: 'Format',
|
8
|
-
description: 'Return the event passed to it. This opens the opportunity to
|
8
|
+
description: 'Return the event passed to it. This opens the opportunity to use the common fluxing to alter the event.',
|
9
9
|
config: {},
|
10
|
+
examples: {
|
11
|
+
"Simplest Example" => {
|
12
|
+
description: 'It only returns what is passed to it.',
|
13
|
+
input: {
|
14
|
+
hello: 'world',
|
15
|
+
},
|
16
|
+
config: {
|
17
|
+
},
|
18
|
+
result: {
|
19
|
+
hello: 'world',
|
20
|
+
}
|
21
|
+
},
|
22
|
+
"Changing The Event" => {
|
23
|
+
description: 'The common fluxing can still be used to alter the event.',
|
24
|
+
input: {
|
25
|
+
things: [
|
26
|
+
{ name: "Elephant", type: "Mammal" },
|
27
|
+
{ name: "Alligator", type: "Reptile" },
|
28
|
+
{ name: "Giraffe", type: "Mammal" }
|
29
|
+
]
|
30
|
+
},
|
31
|
+
config: { outgoing_split:"things",group:"type|animal_type" },
|
32
|
+
result: [
|
33
|
+
{
|
34
|
+
animal_type: [
|
35
|
+
{
|
36
|
+
name: "Elephant",
|
37
|
+
type: "Mammal"
|
38
|
+
},
|
39
|
+
{
|
40
|
+
name: "Giraffe",
|
41
|
+
type: "Mammal"
|
42
|
+
}
|
43
|
+
]
|
44
|
+
},
|
45
|
+
{ animal_type:[ { name:"Alligator",type:"Reptile" } ] }
|
46
|
+
]
|
47
|
+
},
|
48
|
+
}
|
10
49
|
}
|
11
50
|
end
|
12
51
|
|
@@ -7,7 +7,8 @@ module Mushy
|
|
7
7
|
def self.details
|
8
8
|
{
|
9
9
|
name: 'GlobalVariables',
|
10
|
-
|
10
|
+
title: 'Global Variables',
|
11
|
+
description: 'Add global variables to use in any future flux. Returns what was passed to it.',
|
11
12
|
config: {
|
12
13
|
values: {
|
13
14
|
description: 'Provide key/value pairs that will be set as global variables.',
|
@@ -16,6 +17,20 @@ module Mushy
|
|
16
17
|
value: {},
|
17
18
|
},
|
18
19
|
},
|
20
|
+
examples: {
|
21
|
+
"Setting Config Variables" => {
|
22
|
+
description: 'Set a variable to use in any flux. Here, I can use {{api_key}} anywhere.',
|
23
|
+
input: {
|
24
|
+
hey: 'you'
|
25
|
+
},
|
26
|
+
config: {
|
27
|
+
values: { api_key: 'my api key' }
|
28
|
+
},
|
29
|
+
result: {
|
30
|
+
hey: 'you',
|
31
|
+
}
|
32
|
+
},
|
33
|
+
}
|
19
34
|
}
|
20
35
|
end
|
21
36
|
|
@@ -7,7 +7,8 @@ module Mushy
|
|
7
7
|
def self.details
|
8
8
|
{
|
9
9
|
name: 'ParseHtml',
|
10
|
-
|
10
|
+
title: 'Parse HTML',
|
11
|
+
description: 'Extract data from HTML.',
|
11
12
|
config: {
|
12
13
|
path: {
|
13
14
|
description: 'The path to the HTML in the incoming event.',
|
@@ -20,6 +21,40 @@ module Mushy
|
|
20
21
|
value: { url: 'a|@href' },
|
21
22
|
}
|
22
23
|
},
|
24
|
+
examples: {
|
25
|
+
"Example 1" => {
|
26
|
+
description: 'Pulling all links out of HTML.',
|
27
|
+
input: {
|
28
|
+
html: '<a href="one">First</a><a href="two">Second</a>'
|
29
|
+
},
|
30
|
+
config: {
|
31
|
+
path: 'html',
|
32
|
+
extract: {
|
33
|
+
url: "a|@href",
|
34
|
+
name: "a"
|
35
|
+
},
|
36
|
+
},
|
37
|
+
result: [
|
38
|
+
{ url: 'one', name: 'First' },
|
39
|
+
{ url: 'two', name: 'Second' }
|
40
|
+
]
|
41
|
+
},
|
42
|
+
"Example 2" => {
|
43
|
+
description: 'Pulling the contents of a single div.',
|
44
|
+
input: {
|
45
|
+
html: "<div class=\"main\" data-this=\"you\">HEY</a>"
|
46
|
+
},
|
47
|
+
config: {
|
48
|
+
path: 'html',
|
49
|
+
extract: {
|
50
|
+
content: "div.main",
|
51
|
+
class: "div|@class",
|
52
|
+
"data-this" => "div|@data-this",
|
53
|
+
},
|
54
|
+
},
|
55
|
+
result: { content: 'HEY', class: 'main', "data-this" => "you" },
|
56
|
+
},
|
57
|
+
}
|
23
58
|
}
|
24
59
|
end
|
25
60
|
|
data/lib/mushy/fluxs/pdf.rb
CHANGED
@@ -5,6 +5,7 @@ module Mushy
|
|
5
5
|
def self.details
|
6
6
|
details = Browser.details
|
7
7
|
details[:name] = 'Pdf'
|
8
|
+
details[:title] = 'PDF'
|
8
9
|
details[:description] = 'Turn a URL into a PDF.'
|
9
10
|
|
10
11
|
details[:config][:path] = {
|
@@ -20,7 +21,76 @@ module Mushy
|
|
20
21
|
value: '',
|
21
22
|
}
|
22
23
|
|
23
|
-
details
|
24
|
+
details.tap do |config|
|
25
|
+
config[:examples] = {
|
26
|
+
"PDF of google.com" => {
|
27
|
+
description: 'This will open https://www.google.com and take a screenshot.',
|
28
|
+
config: {
|
29
|
+
url: "https://www.google.com",
|
30
|
+
file: 'file.pdf'
|
31
|
+
},
|
32
|
+
result: {
|
33
|
+
url: "https://www.google.com/",
|
34
|
+
status: 200,
|
35
|
+
title: "Google",
|
36
|
+
cookies: [
|
37
|
+
{
|
38
|
+
name: "1P_JAR",
|
39
|
+
value: "2021-10-07-21",
|
40
|
+
domain: ".google.com",
|
41
|
+
path: "/",
|
42
|
+
expires: 1636232420.005369,
|
43
|
+
size: 19,
|
44
|
+
httpOnly: false,
|
45
|
+
secure: true,
|
46
|
+
session: false,
|
47
|
+
sameSite: "None",
|
48
|
+
priority: "Medium"
|
49
|
+
}
|
50
|
+
],
|
51
|
+
headers: {},
|
52
|
+
time: 1.520785498,
|
53
|
+
body: "...",
|
54
|
+
options: {
|
55
|
+
path: "file.pdf",
|
56
|
+
full: true,
|
57
|
+
quality: 100
|
58
|
+
},
|
59
|
+
file: {
|
60
|
+
inode: "439545",
|
61
|
+
hard_links: 1,
|
62
|
+
owner: "pi",
|
63
|
+
group: "pi",
|
64
|
+
size: 54269,
|
65
|
+
date: {
|
66
|
+
year: 2021,
|
67
|
+
month: 10,
|
68
|
+
day: 7,
|
69
|
+
hour: 16,
|
70
|
+
minute: 0,
|
71
|
+
second: 20,
|
72
|
+
nanosecond: 444437482,
|
73
|
+
utc_offset: -18000,
|
74
|
+
weekday: 4,
|
75
|
+
day_of_month: 7,
|
76
|
+
day_of_year: 280,
|
77
|
+
string: "2021-10-07 16:00:20 -0500",
|
78
|
+
epoch_integer: 1633640420,
|
79
|
+
epoch_float: 1633640420.4444375,
|
80
|
+
seconds_ago: 0.016297478
|
81
|
+
},
|
82
|
+
name: "file.pdf",
|
83
|
+
type: "-",
|
84
|
+
owner_permission: "rw-",
|
85
|
+
group_permission: "r--",
|
86
|
+
other_permission: "r--",
|
87
|
+
directory: "/home/pi/Desktop/mushy",
|
88
|
+
path: "/home/pi/Desktop/mushy/file.pdf"
|
89
|
+
}
|
90
|
+
}
|
91
|
+
},
|
92
|
+
}
|
93
|
+
end
|
24
94
|
end
|
25
95
|
|
26
96
|
def adjust input
|
data/lib/mushy/fluxs/read_csv.rb
CHANGED
@@ -7,6 +7,7 @@ module Mushy
|
|
7
7
|
def self.details
|
8
8
|
{
|
9
9
|
name: 'ReadCsv',
|
10
|
+
title: 'Read CSV',
|
10
11
|
description: 'Read CSV content into events.',
|
11
12
|
config: {
|
12
13
|
data: {
|
@@ -21,6 +22,31 @@ module Mushy
|
|
21
22
|
value: '',
|
22
23
|
},
|
23
24
|
},
|
25
|
+
examples: {
|
26
|
+
"With Headers" => {
|
27
|
+
description: 'Using this Flux to read a CSV into many events.',
|
28
|
+
input: {
|
29
|
+
csv: "first,last,height\njane,doe,short"
|
30
|
+
},
|
31
|
+
config: {
|
32
|
+
data: '{{csv}}'
|
33
|
+
},
|
34
|
+
result: { "first": "jane", "last": "doe", "height": "short" }
|
35
|
+
},
|
36
|
+
"No Headers" => {
|
37
|
+
description: 'Using this Flux to read a CSV into many events.',
|
38
|
+
input: {
|
39
|
+
csv: "john,doe,tall\njane,doe,short"
|
40
|
+
},
|
41
|
+
config: {
|
42
|
+
data: '{{csv}}'
|
43
|
+
},
|
44
|
+
result: [
|
45
|
+
{ "a": "john", "b": "doe", "c": "tall" },
|
46
|
+
{ "a": "jane", "b": "doe", "c": "short" }
|
47
|
+
]
|
48
|
+
},
|
49
|
+
}
|
24
50
|
}
|
25
51
|
end
|
26
52
|
|
@@ -5,10 +5,11 @@ module Mushy
|
|
5
5
|
def self.details
|
6
6
|
{
|
7
7
|
name: 'ReadFile',
|
8
|
+
title: 'Read File',
|
8
9
|
description: 'Read a file.',
|
9
10
|
config: {
|
10
|
-
|
11
|
-
description: 'The
|
11
|
+
file: {
|
12
|
+
description: 'The file to read.',
|
12
13
|
type: 'text',
|
13
14
|
value: 'file.csv',
|
14
15
|
},
|
@@ -18,24 +19,37 @@ module Mushy
|
|
18
19
|
shrink: true,
|
19
20
|
value: '',
|
20
21
|
},
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
key: {
|
23
|
+
description: 'The key in the resulting event to return the contents of the file.',
|
24
|
+
type: 'text',
|
25
|
+
value: 'content',
|
26
|
+
},
|
26
27
|
},
|
28
|
+
examples: {
|
29
|
+
"Example" => {
|
30
|
+
description: 'Using this Flux to read the contents of a text file.',
|
31
|
+
input: {
|
32
|
+
file: "data.csv"
|
33
|
+
},
|
34
|
+
config: {
|
35
|
+
file: '{{file}}',
|
36
|
+
key: 'csvdata'
|
37
|
+
},
|
38
|
+
result: { csvdata: 'a,b,c\nd\n\e\f'}
|
39
|
+
},
|
40
|
+
}
|
27
41
|
}
|
28
42
|
end
|
29
43
|
|
30
44
|
def process event, config
|
31
|
-
file = config[:
|
45
|
+
file = config[:file]
|
32
46
|
|
33
47
|
file = File.join(config[:directory], file) if config[:directory].to_s != ''
|
34
48
|
|
35
49
|
content = File.open(file).read
|
36
50
|
|
37
51
|
{
|
38
|
-
config[:
|
52
|
+
config[:key] => content
|
39
53
|
}
|
40
54
|
end
|
41
55
|
|
@@ -5,7 +5,7 @@ module Mushy
|
|
5
5
|
def self.details
|
6
6
|
details = Browser.details
|
7
7
|
details[:name] = 'Screenshot'
|
8
|
-
details[:description] = 'Take a screenshot of the browser.'
|
8
|
+
details[:description] = 'Take a screenshot of the browser. This works the same as the Browser, but with a screenshot at the end.'
|
9
9
|
|
10
10
|
details[:config].merge!(Mushy::WriteFile.file_saving_config.tap do |x|
|
11
11
|
x[x.keys.first][:value] = 'file.jpg'
|
@@ -23,7 +23,76 @@ module Mushy
|
|
23
23
|
shrink: true,
|
24
24
|
value: '',
|
25
25
|
}
|
26
|
-
details
|
26
|
+
details.tap do |config|
|
27
|
+
config[:examples] = {
|
28
|
+
"Screenshot of google.com" => {
|
29
|
+
description: 'This will open https://www.google.com and take a screenshot.',
|
30
|
+
config: {
|
31
|
+
url: "https://www.google.com",
|
32
|
+
file: 'file.jpg'
|
33
|
+
},
|
34
|
+
result: {
|
35
|
+
url: "https://www.google.com/",
|
36
|
+
status: 200,
|
37
|
+
title: "Google",
|
38
|
+
cookies: [
|
39
|
+
{
|
40
|
+
name: "1P_JAR",
|
41
|
+
value: "2021-10-07-21",
|
42
|
+
domain: ".google.com",
|
43
|
+
path: "/",
|
44
|
+
expires: 1636232420.005369,
|
45
|
+
size: 19,
|
46
|
+
httpOnly: false,
|
47
|
+
secure: true,
|
48
|
+
session: false,
|
49
|
+
sameSite: "None",
|
50
|
+
priority: "Medium"
|
51
|
+
}
|
52
|
+
],
|
53
|
+
headers: {},
|
54
|
+
time: 1.520785498,
|
55
|
+
body: "...",
|
56
|
+
options: {
|
57
|
+
path: "file.jpg",
|
58
|
+
full: true,
|
59
|
+
quality: 100
|
60
|
+
},
|
61
|
+
file: {
|
62
|
+
inode: "439545",
|
63
|
+
hard_links: 1,
|
64
|
+
owner: "pi",
|
65
|
+
group: "pi",
|
66
|
+
size: 54269,
|
67
|
+
date: {
|
68
|
+
year: 2021,
|
69
|
+
month: 10,
|
70
|
+
day: 7,
|
71
|
+
hour: 16,
|
72
|
+
minute: 0,
|
73
|
+
second: 20,
|
74
|
+
nanosecond: 444437482,
|
75
|
+
utc_offset: -18000,
|
76
|
+
weekday: 4,
|
77
|
+
day_of_month: 7,
|
78
|
+
day_of_year: 280,
|
79
|
+
string: "2021-10-07 16:00:20 -0500",
|
80
|
+
epoch_integer: 1633640420,
|
81
|
+
epoch_float: 1633640420.4444375,
|
82
|
+
seconds_ago: 0.016297478
|
83
|
+
},
|
84
|
+
name: "file.jpg",
|
85
|
+
type: "-",
|
86
|
+
owner_permission: "rw-",
|
87
|
+
group_permission: "r--",
|
88
|
+
other_permission: "r--",
|
89
|
+
directory: "/home/pi/Desktop/mushy",
|
90
|
+
path: "/home/pi/Desktop/mushy/file.jpg"
|
91
|
+
}
|
92
|
+
}
|
93
|
+
},
|
94
|
+
}
|
95
|
+
end
|
27
96
|
end
|
28
97
|
|
29
98
|
def adjust input
|
data/lib/mushy/fluxs/stdout.rb
CHANGED
data/lib/mushy/fluxs/times.rb
CHANGED
@@ -12,6 +12,13 @@ module Mushy
|
|
12
12
|
type: 'integer',
|
13
13
|
value: '1',
|
14
14
|
},
|
15
|
+
},
|
16
|
+
examples: {
|
17
|
+
"Basic Example" => {
|
18
|
+
input: {name: "Elephant"},
|
19
|
+
config: {times: 2},
|
20
|
+
result: [ { name: "Elephant", index: 0 }, { name: "Elephant", index: 1 } ],
|
21
|
+
}
|
15
22
|
}
|
16
23
|
}
|
17
24
|
end
|
@@ -5,6 +5,7 @@ module Mushy
|
|
5
5
|
def self.details
|
6
6
|
{
|
7
7
|
name: 'WriteFile',
|
8
|
+
title: 'Write File',
|
8
9
|
description: 'Write a file.',
|
9
10
|
config: file_saving_config.merge({
|
10
11
|
data: {
|
@@ -13,6 +14,52 @@ module Mushy
|
|
13
14
|
value: '{{data}}',
|
14
15
|
},
|
15
16
|
}),
|
17
|
+
examples: {
|
18
|
+
"Example" => {
|
19
|
+
description: 'Using this Flux to write the contents of a text file. Details about the file are returned.',
|
20
|
+
input: {
|
21
|
+
file: "data.csv",
|
22
|
+
content: "a,b,c\nd,e,f",
|
23
|
+
},
|
24
|
+
config: {
|
25
|
+
file: '{{file}}',
|
26
|
+
data: '{{content}}'
|
27
|
+
},
|
28
|
+
result: {
|
29
|
+
file: {
|
30
|
+
inode: "439540",
|
31
|
+
hard_links: 1,
|
32
|
+
owner: "pi",
|
33
|
+
group: "pi",
|
34
|
+
size: 3,
|
35
|
+
date: {
|
36
|
+
year: 2021,
|
37
|
+
month: 10,
|
38
|
+
day: 7,
|
39
|
+
hour: 15,
|
40
|
+
minute: 41,
|
41
|
+
second: 14,
|
42
|
+
nanosecond: 163590058,
|
43
|
+
utc_offset: -18000,
|
44
|
+
weekday: 4,
|
45
|
+
day_of_month: 7,
|
46
|
+
day_of_year: 280,
|
47
|
+
string: "2021-10-07 15:41:14 -0500",
|
48
|
+
epoch_integer: 1633639274,
|
49
|
+
epoch_float: 1633639274.1635902,
|
50
|
+
seconds_ago: 0.018665617
|
51
|
+
},
|
52
|
+
name: "file.csv",
|
53
|
+
type: "-",
|
54
|
+
owner_permission: "rw-",
|
55
|
+
group_permission: "r--",
|
56
|
+
other_permission: "r--",
|
57
|
+
directory: "/home/pi/Desktop/mushy",
|
58
|
+
path: "/home/pi/Desktop/mushy/file.csv"
|
59
|
+
}
|
60
|
+
}
|
61
|
+
},
|
62
|
+
}
|
16
63
|
}
|
17
64
|
end
|
18
65
|
|
data/mushy.gemspec
CHANGED
@@ -4,7 +4,7 @@ require 'mushy/version'
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = 'mushy'
|
7
|
-
s.version = '0.
|
7
|
+
s.version = '0.17.0'
|
8
8
|
s.date = '2020-11-23'
|
9
9
|
s.summary = 'Process streams of work using common modules.'
|
10
10
|
s.description = 'This tool assists in the creation and processing of workflows.'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mushy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darren Cauthon
|
@@ -201,7 +201,6 @@ files:
|
|
201
201
|
- lib/mushy/fluxs/ls.rb
|
202
202
|
- lib/mushy/fluxs/parse_html.rb
|
203
203
|
- lib/mushy/fluxs/pdf.rb
|
204
|
-
- lib/mushy/fluxs/print.rb
|
205
204
|
- lib/mushy/fluxs/pwd.rb
|
206
205
|
- lib/mushy/fluxs/read_csv.rb
|
207
206
|
- lib/mushy/fluxs/read_file.rb
|
data/lib/mushy/fluxs/print.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
module Mushy
|
2
|
-
|
3
|
-
class Print < Flux
|
4
|
-
|
5
|
-
def self.details
|
6
|
-
{
|
7
|
-
name: 'Print',
|
8
|
-
description: 'Print output to the screen.',
|
9
|
-
config: {
|
10
|
-
message: {
|
11
|
-
description: 'The message to display',
|
12
|
-
type: 'text',
|
13
|
-
value: '',
|
14
|
-
},
|
15
|
-
}
|
16
|
-
}
|
17
|
-
end
|
18
|
-
|
19
|
-
def process event, config
|
20
|
-
puts config[:message]
|
21
|
-
{}
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|