mushy 0.3.0 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a41b5499e19c46d620ec9794fb8265224ce142516be73f977cfacc5597a844f
4
- data.tar.gz: c74dfd1f76f24da513947edba159a97f4cf613308775346fcf22d8d8eb69a71e
3
+ metadata.gz: e8d94c18f18225b3d7b04d1c78731a2d1211e444f8685a4c812368b8025b4357
4
+ data.tar.gz: 9df6cbd619217e2d24e8495ad104f49ddb5fc0e68d22ce5098f9a5e39067f85c
5
5
  SHA512:
6
- metadata.gz: b4ca21536b4b8d740c619ce7632d86d33b7b3db3b36d8279839bf1ceeb6fbd67edec6cd9f38bca7ce15d870223034c20b5bc46c7c55d3d15adda794b23e867de
7
- data.tar.gz: 0d0254cabb3bd1943872f3db3afede763b9edf4773cc08b4c1dbe54f86f2c3ce9fa55cd24d42b2a30b53044e58925446a0deb504372b57d3c2905ad0fd18098b
6
+ metadata.gz: 77474ee6b3b8ef571cd3283896c2c9a30bb2b245cc07ad357f2128ab82d5eec3092ae4eb374111b0baffa061b14257ad6daacd9adadf7fb00185c94c032b7bf3
7
+ data.tar.gz: 1a5019513bd3223d4106938518026e1790764bf927e14a776b4d9c42889e1b1e380973efe61fb93e81d25db200ba53bffc51dacb8f571c711e646e7b80edf078
data/bin/mushy CHANGED
@@ -10,7 +10,8 @@ class MushyCLI < Thor
10
10
 
11
11
  desc "start FILE", "Run this workflow file."
12
12
  def start
13
- Mushy::Builder::Api.start file, values
13
+ v = values || {}
14
+ Mushy::Builder::Api.start file, v
14
15
  end
15
16
 
16
17
  desc "build FILE", 'Build a flow.'
@@ -95,6 +95,14 @@ module Mushy
95
95
  details[:config][:sort] = { type: 'text', shrink: true, description: 'Sort by this key.', default: '' }
96
96
  details[:config][:model] = { type: 'keyvalue', shrink: true, description: 'Reshape the outgoing events.', value: {}, default: {} }
97
97
 
98
+ details[:config][:error_strategy] = {
99
+ description: 'Error strategy. (return to return an event with "exception" returning the error, or ignore to ignore the exception)',
100
+ type: 'select',
101
+ options: ['', 'return', 'ignore'],
102
+ value: '',
103
+ shrink: true,
104
+ }
105
+
98
106
  details[:config]
99
107
  .select { |_, v| v[:type] == 'keyvalue' }
100
108
  .select { |_, v| v[:editors].nil? }
@@ -0,0 +1,30 @@
1
+ module Mushy
2
+
3
+ module DateParts
4
+
5
+ def self.parse now
6
+ {
7
+ year: nil,
8
+ month: nil,
9
+ day: nil,
10
+ hour: nil,
11
+ minute: :min,
12
+ second: :sec,
13
+ nanosecond: :nsec,
14
+ utc_offset: nil,
15
+ weekday: :wday,
16
+ day_of_month: :mday,
17
+ day_of_year: :yday,
18
+ string: :to_s,
19
+ epoch_integer: :to_i,
20
+ epoch_float: :to_f,
21
+ }.reduce({}) do |t, i|
22
+ method = i[1] || i[0]
23
+ t[i[0]] = now.send method
24
+ t
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ end
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
@@ -15,6 +15,7 @@ module Mushy
15
15
  directory: {
16
16
  description: 'The working directory in which the command will be run.',
17
17
  type: 'text',
18
+ shrink: true,
18
19
  value: '',
19
20
  },
20
21
  },
@@ -18,7 +18,7 @@ module Mushy
18
18
  description: 'Run this browser headless.',
19
19
  type: 'boolean',
20
20
  shrink: true,
21
- value: 'true',
21
+ value: '',
22
22
  },
23
23
  timeout: {
24
24
  description: 'The default timeout (in seconds) before closing the browser. Default is 5 seconds.',
@@ -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
@@ -48,26 +48,7 @@ module Mushy
48
48
 
49
49
  def process event, config
50
50
  now = Time.now
51
- {
52
- year: nil,
53
- month: nil,
54
- day: nil,
55
- hour: nil,
56
- minute: :min,
57
- second: :sec,
58
- nanosecond: :nsec,
59
- utc_offset: nil,
60
- weekday: :wday,
61
- day_of_month: :mday,
62
- day_of_year: :yday,
63
- string: :to_s,
64
- epoch_integer: :to_i,
65
- epoch_float: :to_f,
66
- }.reduce({}) do |t, i|
67
- method = i[1] || i[0]
68
- t[i[0]] = now.send method
69
- t
70
- end
51
+ Mushy::DateParts.parse now
71
52
  end
72
53
 
73
54
  end
@@ -6,30 +6,134 @@ module Mushy
6
6
  {
7
7
  name: 'Ls',
8
8
  description: 'Run the "ls" command.',
9
- config: {
10
- directory: {
11
- description: 'The working directory in which the command will be run.',
12
- type: 'text',
13
- value: '',
14
- },
15
- },
16
- }
9
+ config: Mushy::Bash.details[:config].tap { |c| c.delete :command },
10
+ }.tap do |c|
11
+ c[:config][:recursive] = {
12
+ description: 'Pull files recursively.',
13
+ type: 'boolean',
14
+ shrink: true,
15
+ value: '',
16
+ }
17
+ c[:config][:path] = {
18
+ description: 'Path, used to search for specific files.',
19
+ type: 'text',
20
+ shrink: true,
21
+ value: '',
22
+ }
23
+ end
17
24
  end
18
25
 
19
26
  def process event, config
27
+ arguments = build_the_arguments_from config
20
28
 
21
- config[:command] = 'ls'
22
-
29
+ config[:command] = build_the_command_from arguments
23
30
  result = super event, config
24
31
 
25
- return result unless result[:success]
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
41
+ arguments = ['-A', '-l', '--full-time', '-i']
42
+ arguments << '-R' if config[:recursive].to_s == 'true'
43
+ arguments << '-d' if config[:directory_only].to_s == 'true'
44
+ arguments << config[:path] if config[:path].to_s != ''
45
+ arguments
46
+ end
47
+
48
+ def turn_the_ls_output_to_events result, config, event
49
+
50
+ lines = result[:text].split("\n")
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 ')
56
+
57
+ origin = config[:directory] || Dir.pwd
58
+ directory = needs_special_work_for_path ? '||DIRECTORY||' : origin
59
+
60
+ things = lines.map do |x|
61
+ segments = x.split ' '
62
+ result = if segments.count > 5
63
+ pull_file segments, directory
64
+ elsif segments.count == 1
65
+ dir_segments = segments[0].split("\/")
66
+
67
+ if dir_segments[0] == '.'
68
+ dir_segments[0] = origin
69
+ else
70
+ dir_segments.unshift origin
71
+ end
72
+
73
+ dir_segments[-1] = dir_segments[-1].sub ':', ''
74
+ directory = dir_segments.join("\/")
75
+ nil
76
+ else
77
+ nil
78
+ end
79
+ end.select { |x| x }
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
94
+ end
95
+
96
+ def pull_file segments, directory
97
+ result = {}
98
+
99
+ [:inode, :help, :hard_links, :owner, :group, :size].each do |key|
100
+ result[key] = segments.shift; x = segments.join ' '
101
+ end
102
+
103
+ result.tap do |r|
104
+ r[:date] = []
105
+ 3.times { r[:date] << segments.shift }
106
+ r[:date] = r[:date].join ' '
107
+ r[:date] = Time.parse r[:date]
108
+ end
109
+
110
+ result[:name] = segments.shift
111
+
112
+ result.tap do |r|
113
+ help_segments = r[:help].split ''
114
+ r[:type] = help_segments[0]
115
+ r[:owner_permission] = [1, 2, 3].map { |i| help_segments[i] }.reduce('') { |t, i| t + i }
116
+ r[:group_permission] = [4, 5, 6].map { |i| help_segments[i] }.reduce('') { |t, i| t + i }
117
+ r[:other_permission] = [7, 8, 9].map { |i| help_segments[i] }.reduce('') { |t, i| t + i }
118
+ r.delete :help
119
+ end
120
+
121
+ [:hard_links, :size].each { |x| result[x] = result[x].to_i }
122
+
123
+ result[:date] = Mushy::DateParts.parse result[:date]
124
+
125
+ result[:directory] = directory
26
126
 
27
- result[:text].split("\n").map do |x|
28
- {
29
- name: x,
30
- }
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]
31
134
  end
32
135
 
136
+ result
33
137
  end
34
138
 
35
139
  end
@@ -0,0 +1,26 @@
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
@@ -0,0 +1,31 @@
1
+ module Mushy
2
+
3
+ class Pwd < Bash
4
+
5
+ def self.details
6
+ {
7
+ name: 'Pwd',
8
+ description: 'Run the "pwd" command.',
9
+ config: Mushy::Bash.details[:config].tap { |c| c.delete :command },
10
+ }
11
+ end
12
+
13
+ def process event, config
14
+
15
+ config[:command] = 'pwd'
16
+
17
+ result = super event, config
18
+
19
+ return result unless result[:success]
20
+
21
+ pwd = result[:text].to_s.strip
22
+
23
+ {
24
+ pwd: Mushy::Ls.new.process({}, { path: pwd, directory_only: true })[0]
25
+ }
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -7,11 +7,10 @@ module Mushy
7
7
  details['name'] = 'Screenshot'
8
8
  details['description'] = 'Take a screenshot of the browser.'
9
9
 
10
- details[:config][:path] = {
11
- description: 'The path of the file to save.',
12
- type: 'text',
13
- value: 'picture.jpg',
14
- }
10
+ details[:config].merge!(Mushy::WriteFile.file_saving_config.tap do |x|
11
+ x[x.keys.first][:value] = 'file.jpg'
12
+ end)
13
+
15
14
  details[:config][:quality] = {
16
15
  description: 'The quality of the image, a value beteen 0-100. Only applies to jpg.',
17
16
  type: 'integer',
@@ -33,15 +32,19 @@ module Mushy
33
32
  the_result = input[:result]
34
33
  the_config = input[:config]
35
34
 
35
+ file = Mushy::WriteFile.get_file_from the_config
36
36
  options = {
37
- path: the_config[:path],
37
+ path: file,
38
38
  full: ['true', ''].include?(the_config[:full].to_s),
39
39
  quality: (the_config[:quality].to_s == '' ? '100' : the_config[:quality]).to_i
40
40
  }
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
 
@@ -6,34 +6,46 @@ module Mushy
6
6
  {
7
7
  name: 'WriteFile',
8
8
  description: 'Write a file.',
9
- config: {
10
- name: {
11
- description: 'The name of the file.',
12
- type: 'text',
13
- value: 'file.csv',
14
- },
15
- directory: {
16
- description: 'The directory in which to write the file. Leave blank for the current directory.',
17
- type: 'text',
18
- value: '',
19
- },
20
- data: {
21
- description: 'The text to write. You can use Liquid templating here to pull data from the event, or write hardcoded data.',
22
- type: 'text',
23
- value: '{{data}}',
24
- },
25
- },
9
+ config: file_saving_config.merge({
10
+ data: {
11
+ description: 'The text to write. You can use Liquid templating here to pull data from the event, or write hardcoded data.',
12
+ type: 'text',
13
+ value: '{{data}}',
14
+ },
15
+ }),
26
16
  }
27
17
  end
28
18
 
29
- def process event, config
30
- file = config[:name]
19
+ def self.file_saving_config
20
+ {
21
+ name: {
22
+ description: 'The name of the file.',
23
+ type: 'text',
24
+ value: 'file.csv',
25
+ },
26
+ directory: {
27
+ description: 'The directory in which to write the file. Leave blank for the current directory.',
28
+ shrink: true,
29
+ type: 'text',
30
+ value: '',
31
+ },
32
+ }
33
+ end
31
34
 
35
+ def self.get_file_from config
36
+ file = config[:name]
32
37
  file = File.join(config[:directory], file) if config[:directory].to_s != ''
38
+ file
39
+ end
40
+
41
+ def process event, config
42
+ file = self.class.get_file_from config
33
43
 
34
44
  File.open(file, 'w') { |f| f.write config[:data] }
35
45
 
36
- {}
46
+ {
47
+ file: Mushy::Ls.new.process({}, { path: file })[0]
48
+ }
37
49
  end
38
50
 
39
51
  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.3.0'
7
+ s.version = '0.5.2'
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.3.0
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darren Cauthon
@@ -164,6 +164,7 @@ files:
164
164
  - lib/mushy/builder/dark.rb
165
165
  - lib/mushy/builder/index.rb
166
166
  - lib/mushy/builder/vue.rb
167
+ - lib/mushy/date_parts.rb
167
168
  - lib/mushy/event.rb
168
169
  - lib/mushy/flow.rb
169
170
  - lib/mushy/flux.rb
@@ -172,6 +173,7 @@ files:
172
173
  - lib/mushy/fluxs/build_csv.rb
173
174
  - lib/mushy/fluxs/cli.rb
174
175
  - lib/mushy/fluxs/collection.rb
176
+ - lib/mushy/fluxs/document.rb
175
177
  - lib/mushy/fluxs/environment.rb
176
178
  - lib/mushy/fluxs/filter.rb
177
179
  - lib/mushy/fluxs/format.rb
@@ -181,6 +183,8 @@ files:
181
183
  - lib/mushy/fluxs/ls.rb
182
184
  - lib/mushy/fluxs/parse_html.rb
183
185
  - lib/mushy/fluxs/pdf.rb
186
+ - lib/mushy/fluxs/print.rb
187
+ - lib/mushy/fluxs/pwd.rb
184
188
  - lib/mushy/fluxs/read_csv.rb
185
189
  - lib/mushy/fluxs/read_file.rb
186
190
  - lib/mushy/fluxs/screenshot.rb