mushy 0.4.1 → 0.6.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 +4 -4
- data/bin/mushy +2 -1
- data/lib/mushy/builder/api.rb +38 -7
- data/lib/mushy/date_parts.rb +2 -0
- data/lib/mushy/flux.rb +12 -1
- data/lib/mushy/fluxs/bash.rb +1 -0
- data/lib/mushy/fluxs/browser.rb +3 -0
- data/lib/mushy/fluxs/document.rb +27 -0
- data/lib/mushy/fluxs/file_watch.rb +46 -0
- data/lib/mushy/fluxs/ls.rb +63 -11
- data/lib/mushy/fluxs/pwd.rb +3 -1
- data/lib/mushy/fluxs/screenshot.rb +5 -2
- data/lib/mushy/fluxs/times.rb +29 -0
- data/lib/mushy/fluxs/write_file.rb +3 -1
- data/mushy.gemspec +2 -1
- metadata +18 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dcfab01a12d0d1a59c024265891b2851943755a0cdb9468768dd71c3fbcc1c63
|
4
|
+
data.tar.gz: ed387d7e22cc0368e1d309326dd646cb284256b030ced1da44106a6dad3f1979
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d633be32aec24e036a0c8b6ffc185b743f95d78a9b986304dabaff72a642fdfe09a48ca86d3753b1e1dfb722347cccf33392fb651befbae28177e9dcc9889808
|
7
|
+
data.tar.gz: 0d54c907f8ec088f928fc0cd4ca88c72203e6080e0ccb5bc96b23b31dca329fa673b84168017effdc19a33dd8f5598100039675b34db20adfb7ee5c282cc7cd7
|
data/bin/mushy
CHANGED
data/lib/mushy/builder/api.rb
CHANGED
@@ -40,16 +40,25 @@ module Mushy
|
|
40
40
|
pwd = Dir.pwd
|
41
41
|
|
42
42
|
if service_fluxes.any?
|
43
|
-
|
43
|
+
|
44
|
+
things = service_fluxes
|
44
45
|
.map { |s| { flux: s, proc: ->(e) do
|
45
46
|
Dir.chdir pwd
|
46
47
|
Mushy::Runner.new.start e, s, flow
|
47
|
-
end
|
48
|
+
end,
|
49
|
+
run_method: (s.config[:run_strategy] == 'daemon' ? :run_this_as_a_daemon : :run_this_inline),
|
50
|
+
}
|
51
|
+
}.group_by { |x| x[:run_method] }
|
52
|
+
|
53
|
+
calls = (things[:run_this_as_a_daemon] || [])
|
48
54
|
.map { |p| ->() { p[:flux].loop &p[:proc] } }
|
49
55
|
.map { |x| ->() { loop &x } }
|
50
|
-
.map { |x|
|
56
|
+
.map { |x| run_this_as_a_daemon &x }
|
51
57
|
|
52
|
-
|
58
|
+
(things[:run_this_inline] || [])
|
59
|
+
.map { |p| ->() { p[:flux].loop &p[:proc] } }
|
60
|
+
.map { |x| ->() { loop &x } }
|
61
|
+
.map { |x| run_this_inline &x }
|
53
62
|
|
54
63
|
exit
|
55
64
|
end
|
@@ -59,8 +68,11 @@ module Mushy
|
|
59
68
|
Mushy::Runner.new.start event, cli_flux, flow
|
60
69
|
end
|
61
70
|
|
62
|
-
def self.
|
63
|
-
|
71
|
+
def self.run_this_inline &block
|
72
|
+
block.call
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.run_this_as_a_daemon &block
|
64
76
|
Daemons.call(&block).pid.pid
|
65
77
|
end
|
66
78
|
|
@@ -93,8 +105,27 @@ module Mushy
|
|
93
105
|
details[:config][:limit] = { type: 'integer', shrink: true, description: 'Limit the number of events to this number.', default: '' }
|
94
106
|
details[:config][:join] = { type: 'text', shrink: true, description: 'Join all of the events from this flux into one event, under this name.', default: '' }
|
95
107
|
details[:config][:sort] = { type: 'text', shrink: true, description: 'Sort by this key.', default: '' }
|
108
|
+
details[:config][:ignore] = { type: 'text', shrink: true, description: 'Ignore these keys.', value: '', default: '' }
|
96
109
|
details[:config][:model] = { type: 'keyvalue', shrink: true, description: 'Reshape the outgoing events.', value: {}, default: {} }
|
97
110
|
|
111
|
+
details[:config][:error_strategy] = {
|
112
|
+
description: 'Error strategy. (return to return an event with "exception" returning the error, or ignore to ignore the exception)',
|
113
|
+
type: 'select',
|
114
|
+
options: ['', 'return', 'ignore'],
|
115
|
+
value: '',
|
116
|
+
shrink: true,
|
117
|
+
}
|
118
|
+
|
119
|
+
if flux.new.respond_to? :loop
|
120
|
+
details[:config][:run_strategy] = {
|
121
|
+
description: 'Run this using this strategy. (select "daemon" if this should be run in the background)',
|
122
|
+
type: 'select',
|
123
|
+
options: ['', 'inline', 'daemon'],
|
124
|
+
value: '',
|
125
|
+
shrink: true,
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
98
129
|
details[:config]
|
99
130
|
.select { |_, v| v[:type] == 'keyvalue' }
|
100
131
|
.select { |_, v| v[:editors].nil? }
|
@@ -106,7 +137,7 @@ module Mushy
|
|
106
137
|
end
|
107
138
|
|
108
139
|
details
|
109
|
-
end
|
140
|
+
end.sort_by { |x| x[:name] }
|
110
141
|
}
|
111
142
|
end
|
112
143
|
|
data/lib/mushy/date_parts.rb
CHANGED
data/lib/mushy/flux.rb
CHANGED
@@ -77,6 +77,10 @@ module Mushy
|
|
77
77
|
|
78
78
|
returned_one_result ? results.first : results
|
79
79
|
|
80
|
+
rescue Exception => e
|
81
|
+
raise e if config[:error_strategy].to_s == ''
|
82
|
+
return [] if config[:error_strategy] == 'ignore'
|
83
|
+
{ exception: e.message }
|
80
84
|
end
|
81
85
|
|
82
86
|
def standardize_these results
|
@@ -87,7 +91,7 @@ module Mushy
|
|
87
91
|
end
|
88
92
|
|
89
93
|
def shape_these results, event, config
|
90
|
-
supported_shaping = [:merge, :outgoing_split, :group, :model, :join, :sort, :limit]
|
94
|
+
supported_shaping = [:merge, :outgoing_split, :group, :model, :ignore, :join, :sort, :limit]
|
91
95
|
|
92
96
|
shaping = supported_shaping
|
93
97
|
if (config[:shaping])
|
@@ -132,6 +136,13 @@ module Mushy
|
|
132
136
|
results.map { |x| masher.mash by, x }
|
133
137
|
end
|
134
138
|
|
139
|
+
def ignore_these_results results, event, by
|
140
|
+
return results if by.to_s == ''
|
141
|
+
ignore_fields = by.split ','
|
142
|
+
results.each { |r| ignore_fields.each { |f| r.delete f } }
|
143
|
+
results
|
144
|
+
end
|
145
|
+
|
135
146
|
def merge_these_results results, event, by
|
136
147
|
keys_to_merge = convert_this_to_an_array by
|
137
148
|
keys_to_merge = event.keys.map { |x| x.to_s } if (keys_to_merge[0] == '*')
|
data/lib/mushy/fluxs/bash.rb
CHANGED
data/lib/mushy/fluxs/browser.rb
CHANGED
@@ -90,7 +90,9 @@ module Mushy
|
|
90
90
|
|
91
91
|
browser.headers.add get_the_headers_from(event, config)
|
92
92
|
|
93
|
+
the_start = Time.now
|
93
94
|
browser.goto config[:url]
|
95
|
+
time = Time.now - the_start
|
94
96
|
|
95
97
|
browser.execute(config[:execute]) if config[:execute]
|
96
98
|
|
@@ -102,6 +104,7 @@ module Mushy
|
|
102
104
|
title: browser.frames[0].title,
|
103
105
|
cookies: browser.cookies.all.map { |k, v| v.instance_variable_get('@attributes') },
|
104
106
|
headers: browser.headers.get,
|
107
|
+
time: time,
|
105
108
|
body: browser.body
|
106
109
|
}
|
107
110
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Mushy
|
2
|
+
|
3
|
+
class Document < Flux
|
4
|
+
|
5
|
+
def self.details
|
6
|
+
{
|
7
|
+
name: 'Document',
|
8
|
+
description: 'Create a multi-line document.',
|
9
|
+
config: {
|
10
|
+
document: {
|
11
|
+
description: 'The multi-line document you wish to create.',
|
12
|
+
type: 'textarea',
|
13
|
+
value: '',
|
14
|
+
},
|
15
|
+
},
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def process event, config
|
20
|
+
{
|
21
|
+
document: config[:document],
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'listen'
|
2
|
+
|
3
|
+
module Mushy
|
4
|
+
|
5
|
+
class FileWatch < Flux
|
6
|
+
|
7
|
+
def self.details
|
8
|
+
{
|
9
|
+
name: 'FileWatch',
|
10
|
+
description: 'Watch for file changes.',
|
11
|
+
config: {
|
12
|
+
directory: {
|
13
|
+
description: 'The directory to watch.',
|
14
|
+
type: 'text',
|
15
|
+
value: '',
|
16
|
+
},
|
17
|
+
},
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def loop &block
|
22
|
+
|
23
|
+
directory = config[:directory].to_s != '' ? config[:directory] : Dir.pwd
|
24
|
+
|
25
|
+
listener = Listen.to(directory) do |modified, added, removed|
|
26
|
+
the_event = {
|
27
|
+
modified: modified,
|
28
|
+
added: added,
|
29
|
+
removed: removed,
|
30
|
+
}
|
31
|
+
block.call the_event
|
32
|
+
end
|
33
|
+
|
34
|
+
listener.start
|
35
|
+
|
36
|
+
sleep
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
def process event, config
|
41
|
+
event
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/lib/mushy/fluxs/ls.rb
CHANGED
@@ -14,31 +14,62 @@ module Mushy
|
|
14
14
|
shrink: true,
|
15
15
|
value: '',
|
16
16
|
}
|
17
|
+
c[:config][:path] = {
|
18
|
+
description: 'Path, used to search for specific files.',
|
19
|
+
type: 'text',
|
20
|
+
shrink: true,
|
21
|
+
value: '',
|
22
|
+
}
|
17
23
|
end
|
18
24
|
end
|
19
25
|
|
20
26
|
def process event, config
|
27
|
+
arguments = build_the_arguments_from config
|
21
28
|
|
29
|
+
config[:command] = build_the_command_from arguments
|
30
|
+
result = super event, config
|
31
|
+
|
32
|
+
things = turn_the_ls_output_to_events result, config, event
|
33
|
+
things
|
34
|
+
end
|
35
|
+
|
36
|
+
def build_the_command_from arguments
|
37
|
+
"ls #{arguments.join(' ')}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_the_arguments_from config
|
22
41
|
arguments = ['-A', '-l', '--full-time', '-i']
|
23
42
|
arguments << '-R' if config[:recursive].to_s == 'true'
|
24
|
-
config[:
|
25
|
-
|
26
|
-
|
43
|
+
arguments << '-d' if config[:directory_only].to_s == 'true'
|
44
|
+
arguments << "'#{config[:path]}'" if config[:path].to_s != ''
|
45
|
+
arguments
|
46
|
+
end
|
27
47
|
|
28
|
-
|
48
|
+
def turn_the_ls_output_to_events result, config, event
|
29
49
|
|
30
50
|
lines = result[:text].split("\n")
|
31
|
-
|
51
|
+
|
52
|
+
needs_special_work_for_path = config[:directory_only].to_s != 'true' &&
|
53
|
+
config[:path].to_s != '' &&
|
54
|
+
lines[0] &&
|
55
|
+
lines[0].start_with?('total ')
|
32
56
|
|
33
57
|
origin = config[:directory] || Dir.pwd
|
34
|
-
directory = origin
|
35
|
-
|
58
|
+
directory = needs_special_work_for_path ? '||DIRECTORY||' : origin
|
59
|
+
|
60
|
+
things = lines.map do |x|
|
36
61
|
segments = x.split ' '
|
37
62
|
result = if segments.count > 5
|
38
63
|
pull_file segments, directory
|
39
64
|
elsif segments.count == 1
|
40
65
|
dir_segments = segments[0].split("\/")
|
41
|
-
|
66
|
+
|
67
|
+
if dir_segments[0] == '.'
|
68
|
+
dir_segments[0] = origin
|
69
|
+
else
|
70
|
+
dir_segments.unshift origin
|
71
|
+
end
|
72
|
+
|
42
73
|
dir_segments[-1] = dir_segments[-1].sub ':', ''
|
43
74
|
directory = dir_segments.join("\/")
|
44
75
|
nil
|
@@ -47,6 +78,19 @@ module Mushy
|
|
47
78
|
end
|
48
79
|
end.select { |x| x }
|
49
80
|
|
81
|
+
if needs_special_work_for_path
|
82
|
+
config[:directory_only] = true
|
83
|
+
special_name = process(event, config)[0][:name]
|
84
|
+
things.each do |x|
|
85
|
+
[:directory, :path].each do |key|
|
86
|
+
if x[key].include?('||DIRECTORY||')
|
87
|
+
x[key].sub!('||DIRECTORY||', File.join(Dir.pwd, special_name))
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
things
|
50
94
|
end
|
51
95
|
|
52
96
|
def pull_file segments, directory
|
@@ -63,7 +107,7 @@ module Mushy
|
|
63
107
|
r[:date] = Time.parse r[:date]
|
64
108
|
end
|
65
109
|
|
66
|
-
result[:name] = segments.
|
110
|
+
result[:name] = segments.join ' '
|
67
111
|
|
68
112
|
result.tap do |r|
|
69
113
|
help_segments = r[:help].split ''
|
@@ -76,10 +120,18 @@ module Mushy
|
|
76
120
|
|
77
121
|
[:hard_links, :size].each { |x| result[x] = result[x].to_i }
|
78
122
|
|
79
|
-
result[:
|
123
|
+
result[:date] = Mushy::DateParts.parse result[:date]
|
80
124
|
|
81
125
|
result[:directory] = directory
|
82
|
-
|
126
|
+
|
127
|
+
if result[:type] == 'd' && result[:directory] == result[:name]
|
128
|
+
result[:path] = result[:directory]
|
129
|
+
name_segments = result[:name].split "\/"
|
130
|
+
result[:name] = name_segments.pop
|
131
|
+
result[:directory] = name_segments.join "\/"
|
132
|
+
else
|
133
|
+
result[:path] = File.join result[:directory], result[:name]
|
134
|
+
end
|
83
135
|
|
84
136
|
result
|
85
137
|
end
|
data/lib/mushy/fluxs/pwd.rb
CHANGED
@@ -32,7 +32,7 @@ module Mushy
|
|
32
32
|
the_result = input[:result]
|
33
33
|
the_config = input[:config]
|
34
34
|
|
35
|
-
file = Mushy::WriteFile.get_file_from
|
35
|
+
file = Mushy::WriteFile.get_file_from the_config
|
36
36
|
options = {
|
37
37
|
path: file,
|
38
38
|
full: ['true', ''].include?(the_config[:full].to_s),
|
@@ -41,7 +41,10 @@ module Mushy
|
|
41
41
|
|
42
42
|
the_browser.screenshot options
|
43
43
|
|
44
|
-
options
|
44
|
+
the_result[:options] = options
|
45
|
+
the_result[:file] = Mushy::Ls.new.process({}, { path: file })[0]
|
46
|
+
|
47
|
+
the_result
|
45
48
|
|
46
49
|
end
|
47
50
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Mushy
|
2
|
+
|
3
|
+
class Times < Flux
|
4
|
+
|
5
|
+
def self.details
|
6
|
+
{
|
7
|
+
name: 'Times',
|
8
|
+
description: 'Return the event passed to it, X times.',
|
9
|
+
config: {
|
10
|
+
times: {
|
11
|
+
description: 'The number of times this event should be returned.',
|
12
|
+
type: 'integer',
|
13
|
+
value: '1',
|
14
|
+
},
|
15
|
+
}
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def process event, config
|
20
|
+
config[:times]
|
21
|
+
.to_i
|
22
|
+
.times
|
23
|
+
.each_with_index
|
24
|
+
.map { |x, i| event.dup.tap { |e| e[:index] = i } }
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
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.6.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.'
|
@@ -26,4 +26,5 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_runtime_dependency 'faraday'
|
27
27
|
s.add_runtime_dependency 'pony'
|
28
28
|
s.add_runtime_dependency 'daemons'
|
29
|
+
s.add_runtime_dependency 'listen'
|
29
30
|
end
|
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.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darren Cauthon
|
@@ -150,6 +150,20 @@ dependencies:
|
|
150
150
|
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: listen
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
153
167
|
description: This tool assists in the creation and processing of workflows.
|
154
168
|
email: darren@cauthon.com
|
155
169
|
executables:
|
@@ -173,7 +187,9 @@ files:
|
|
173
187
|
- lib/mushy/fluxs/build_csv.rb
|
174
188
|
- lib/mushy/fluxs/cli.rb
|
175
189
|
- lib/mushy/fluxs/collection.rb
|
190
|
+
- lib/mushy/fluxs/document.rb
|
176
191
|
- lib/mushy/fluxs/environment.rb
|
192
|
+
- lib/mushy/fluxs/file_watch.rb
|
177
193
|
- lib/mushy/fluxs/filter.rb
|
178
194
|
- lib/mushy/fluxs/format.rb
|
179
195
|
- lib/mushy/fluxs/get.rb
|
@@ -188,6 +204,7 @@ files:
|
|
188
204
|
- lib/mushy/fluxs/read_file.rb
|
189
205
|
- lib/mushy/fluxs/screenshot.rb
|
190
206
|
- lib/mushy/fluxs/smtp.rb
|
207
|
+
- lib/mushy/fluxs/times.rb
|
191
208
|
- lib/mushy/fluxs/write_file.rb
|
192
209
|
- lib/mushy/masher.rb
|
193
210
|
- lib/mushy/run.rb
|