mushy 0.18.0 → 0.21.0

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: 88a3578100f93b47791d83299597e4b6a1d1ccabfaa8628eb5172617facf9b95
4
- data.tar.gz: fa722d8dd776c1e311bea24ad94303785fd93ccc16eeebcd93783f9d25c3e0f5
3
+ metadata.gz: cfd4d2f868fa9bd4c147f4cd9c7af24cea6ad38934d2e2bec53a6c8c9e396345
4
+ data.tar.gz: bf919c0d4f927dbc8ef6705b183fea9aa8d2fa73f61354603e83d2c8d01e3842
5
5
  SHA512:
6
- metadata.gz: 4eafe788eccb281c1e15bdc0cfae4dca68f1146894a7d28569347673f28ef265b5b8aa90f7fb6c21245e1ba15fceac2f2677420cc643dd535c8cd54062c7642d
7
- data.tar.gz: 2568f50f7cdf5569605d89fe7e088036d48f106d10f2b45c2b29a25038f145d29bb2566f9d7271f642b11307cb5e9259e72ac4fb1f1b3826178e977532e7c8b3
6
+ metadata.gz: 9de7dae32eb11e0ae5448c0990e6a4be38483f3f38552e4bf519e6bdec047de6694c86734e57f2b3fe002a1ca263f9b0ed7232b1b42cc5290a2e99ee3d34745f
7
+ data.tar.gz: da103a79f76baa1cadc52d6a0f5100cfdb848212c9e6e1ac3b9dcb79fa14a527a8f1e7af8a4dc0d91e0e5d7ff77a142f8258308ecba819bfcf517a5772b03b68
@@ -62,7 +62,9 @@ module Mushy
62
62
  </header>
63
63
  <section class="modal-card-body">
64
64
  <div class="content">
65
- <div v-for="(fluxType, id) in fluxTypes">
65
+ <div v-for="(fluxGroup) in fluxGroups">
66
+ <h2 style="font-style:italic">{{fluxGroup.name}}</h2>
67
+ <div v-for="(fluxType, id) in fluxGroup.fluxs">
66
68
  <div class="level">
67
69
  <div class="level-left"><h2>{{fluxType.title || fluxType.name}}</h2></div>
68
70
  <div class="level-right">
@@ -87,6 +89,7 @@ module Mushy
87
89
  <div v-for="(a, b) in fluxType.documentation" v-if="fluxType['detailsTab'] == b" v-html="a"></div>
88
90
  </div>
89
91
  </div>
92
+ </div>
90
93
  </div>
91
94
  </section>
92
95
  <footer class="modal-card-foot">
@@ -236,7 +239,7 @@ module Mushy
236
239
  };
237
240
  },
238
241
  props: ['label', 'value', 'options', 'description', 'shrink'],
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>'
242
+ 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> <div class="control"><select :name="id" v-if="value || !shrink" v-on:input="selectedValue=$event.target.value;" class="select" v-on:change.prevent.stop="doit(selectedValue, value);$emit(\\'update:value\\', value);$event.target.value=\\'\\';"><option v-for="option in options" v-bind:value="option.id">{{option.name}}</option></select></div></div>'
240
243
  },
241
244
  boolean: {
242
245
  props: ['label', 'value', 'options', 'description', 'shrink'],
@@ -324,7 +327,7 @@ module Mushy
324
327
  });
325
328
  }
326
329
 
327
- var thingTemplate = '<div v-bind:class="{ \\\'ml-3\\\': data.foghat==\\\'free\\\', \\\'column\\\': data.foghat!=\\\'free\\\', \\\'is-full\\\': data.foghat!=\\\'half\\\' && data.foghat!=\\\'free\\\', \\\'is-half\\\': data.foghat==\\\'half\\\' }">';
330
+ var thingTemplate = '<div v-show="data.hide != true" v-bind:class="{ \\\'ml-3\\\': data.foghat==\\\'free\\\', \\\'column\\\': data.foghat!=\\\'free\\\', \\\'is-full\\\': data.foghat!=\\\'half\\\' && data.foghat!=\\\'free\\\', \\\'is-half\\\': data.foghat==\\\'half\\\' }">';
328
331
  for (var property in components)
329
332
  thingTemplate = thingTemplate + '<mip-' + property + ' v-if="data.type == \\'' + property + '\\'" :id="id" ' + components[property].props.map(function(x){ return ':' + x + '.sync="data.' + x + '"';}).join(' ') + '></mip-' + property + '>'
330
333
  thingTemplate = thingTemplate + '</div>';
@@ -335,7 +338,7 @@ module Mushy
335
338
  console: console,
336
339
  }
337
340
  },
338
- props: ['data', 'value', 'id', 'model', 'foghat'],
341
+ props: ['data', 'value', 'id', 'model', 'foghat', 'hide'],
339
342
  template: thingTemplate
340
343
  });
341
344
 
@@ -385,6 +388,16 @@ module Mushy
385
388
  x['detailsTab'] = Object.getOwnPropertyNames(x.documentation)[0];
386
389
  } );
387
390
 
391
+ fluxGroups = []
392
+ fluxdata.fluxs.map(function(x) {
393
+ if (x.fluxGroup) {} else { x.fluxGroup = { name: 'Others', position: 999999 } };
394
+ rowboat = fluxGroups.filter(function(y) { return y.name == x.fluxGroup.name })[0];
395
+ if (rowboat) {} else { fluxGroups.push(x.fluxGroup); x.fluxGroup.fluxs = [] }
396
+ rowboat = fluxGroups.filter(function(y) { return y.name == x.fluxGroup.name })[0];
397
+ rowboat.fluxs.push(x);
398
+ } );
399
+ fluxGroups = fluxGroups.sort(function(x, y) { return (x.position || 1000) - (y.position || 1000); })
400
+
388
401
  var configs = {};
389
402
  fluxdata.fluxs.map(function(x){
390
403
  configs[x.name] = x.config;
@@ -446,7 +459,7 @@ module Mushy
446
459
  },
447
460
  id: { type: 'hide', value: '' },
448
461
  name: { type: 'text', value: '' },
449
- flux: { type: 'select', value: fluxdata.fluxs[0].name, options: options},
462
+ flux: { type: 'select', value: fluxdata.fluxs[0].name, options: options, hide: true },
450
463
  open_flux: { type: 'button', name: 'Select a Flux', foghat: 'free', medium: 'hey', color: 'is-primary',
451
464
  click: function() {
452
465
  Vue.set(app.setup.fluxTypeSelect, 'is-active', true);
@@ -566,6 +579,7 @@ module Mushy
566
579
  },
567
580
  configs: configs,
568
581
  fluxTypes: fluxTypesWithDetails,
582
+ fluxGroups: fluxGroups,
569
583
  setup: setup,
570
584
  flux_name_for: function(ids, fluxes) {
571
585
  var fluxs = fluxes.filter(function(x){ return ids.includes(x.id) });
@@ -5,7 +5,9 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'Bash',
8
+ title: 'Execute a command via bash',
8
9
  description: 'Run a bash command.',
10
+ fluxGroup: { name: 'Execute' },
9
11
  config: {
10
12
  command: {
11
13
  description: 'The command to run in bash.',
@@ -7,6 +7,8 @@ module Mushy
7
7
  def self.details
8
8
  {
9
9
  name: 'Browser',
10
+ title: 'Use a browser',
11
+ fluxGroup: { name: 'Web' },
10
12
  description: 'Visit a page in a browser.',
11
13
  config: {
12
14
  url: {
@@ -9,6 +9,7 @@ module Mushy
9
9
  name: 'BuildCsv',
10
10
  title: "Build CSV",
11
11
  description: 'Build a CSV.',
12
+ fluxGroup: { name: 'CSV' },
12
13
  config: {
13
14
  input_path: {
14
15
  description: 'The path to the set of records to include in the CSV.',
@@ -5,7 +5,8 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'Cli',
8
- title: 'Command Line Interface',
8
+ title: 'Start a flow via command line',
9
+ fluxGroup: { name: 'Starters', position: 0 },
9
10
  description: 'Accept CLI arguments from the run command.',
10
11
  config: {
11
12
  },
@@ -5,7 +5,9 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'Collection',
8
- description: 'Collects events.',
8
+ title: 'Collect and retrieve events',
9
+ description: 'Collect and retrieve events for the flow.',
10
+ fluxGroup: { name: 'Flows' },
9
11
  config: {
10
12
  id: {
11
13
  description: 'The path to the unique id in the body of the element.',
@@ -5,7 +5,9 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'Document',
8
+ title: 'Make a multi-line liquid value',
8
9
  description: 'Create a multi-line document.',
10
+ fluxGroup: { name: 'Flows' },
9
11
  config: {
10
12
  document: {
11
13
  description: 'The multi-line document you wish to create.',
@@ -5,8 +5,9 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'Environment',
8
- title: 'Environment Variables',
8
+ title: 'Pull environment variables',
9
9
  description: 'Pull environment variables.',
10
+ fluxGroup: { name: 'Environment' },
10
11
  config: {
11
12
  variables: {
12
13
  description: 'Map the environment variables to a new event.',
@@ -7,7 +7,8 @@ module Mushy
7
7
  def self.details
8
8
  {
9
9
  name: 'FileWatch',
10
- title: 'File Watcher',
10
+ title: 'Start a flow when files change',
11
+ fluxGroup: { name: 'Starters', position: 0 },
11
12
  description: 'Watch for file changes.',
12
13
  config: {
13
14
  directory: {
@@ -16,6 +17,12 @@ module Mushy
16
17
  shrink: true,
17
18
  value: '',
18
19
  },
20
+ include_all_file_details: {
21
+ description: 'If true, returns all details for the file. If false, just path & name are returned',
22
+ type: 'boolean',
23
+ shrink: true,
24
+ value: '',
25
+ }
19
26
  },
20
27
  examples: {
21
28
  "Files Added" => {
@@ -46,15 +53,14 @@ module Mushy
46
53
  }
47
54
  end
48
55
 
49
- def loop &block
50
-
56
+ def loop(&block)
51
57
  directory = config[:directory].to_s != '' ? config[:directory] : Dir.pwd
52
58
 
53
59
  listener = Listen.to(directory) do |modified, added, removed|
54
60
  the_event = {
55
- modified: modified,
56
- added: added,
57
- removed: removed,
61
+ modified: modified.map { |f| get_the_details_for(f) },
62
+ added: added.map { |f| get_the_details_for(f) },
63
+ removed: removed.map { |f| get_the_details_for(f) }
58
64
  }
59
65
  block.call the_event
60
66
  end
@@ -69,6 +75,17 @@ module Mushy
69
75
  event
70
76
  end
71
77
 
78
+ def get_the_details_for(file)
79
+ if config[:include_all_file_details].to_s == 'true'
80
+ Mushy::Ls.new.process({}, { path: file })[0]
81
+ else
82
+ {
83
+ path: file,
84
+ name: file.split("\/").pop
85
+ }
86
+ end
87
+ end
88
+
72
89
  end
73
90
 
74
91
  end
@@ -5,7 +5,9 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'Filter',
8
+ title: 'Filter events',
8
9
  description: 'Filters events based on criteria.',
10
+ fluxGroup: { name: 'Flows' },
9
11
  config: {
10
12
  equal: {
11
13
  description: 'Provide key/value pairs that must match in the event.',
@@ -5,7 +5,9 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'Format',
8
+ title: 'Alter the format of an event',
8
9
  description: 'Return the event passed to it. This opens the opportunity to use the common fluxing to alter the event.',
10
+ fluxGroup: { name: 'Flows' },
9
11
  config: {},
10
12
  examples: {
11
13
  "Simplest Example" => {
@@ -5,7 +5,9 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'GitLog',
8
+ title: 'Get git logs',
8
9
  description: 'Return git logs.',
10
+ fluxGroup: { name: 'Git' },
9
11
  config: {
10
12
  directory: {
11
13
  description: 'The working directory in which the command will be run.',
@@ -7,7 +7,8 @@ module Mushy
7
7
  def self.details
8
8
  {
9
9
  name: 'GlobalVariables',
10
- title: 'Global Variables',
10
+ title: 'Set global variables',
11
+ fluxGroup: { name: 'Flows' },
11
12
  description: 'Add global variables to use in any future flux. Returns what was passed to it.',
12
13
  config: {
13
14
  values: {
@@ -17,6 +17,8 @@ module Mushy
17
17
  def self.details
18
18
  {
19
19
  name: 'Interval',
20
+ title: 'Start a flow on a regular interval',
21
+ fluxGroup: { name: 'Starters', position: 0 },
20
22
  description: 'Fire an event every X minutes.',
21
23
  config: {},
22
24
  }.tap do |c|
@@ -2,10 +2,30 @@ module Mushy
2
2
 
3
3
  class Ls < Bash
4
4
 
5
+ def self.the_ls_command
6
+ @the_ls_command ||= find_the_right_ls_command_to_use
7
+ end
8
+
9
+ def self.find_the_right_ls_command_to_use
10
+ commands = [
11
+ 'ls', # the normal method used to pull file information
12
+ 'gls' # BSD users don't get the version of ls this needs,
13
+ # so we might need to use gls after the user runs (brew install coreutils)
14
+ ]
15
+
16
+ the_command_to_use = nil
17
+ while the_command_to_use.nil? && (command = commands.shift) # keep trying till we find one that works
18
+ the_command_to_use = command if Mushy::Bash.new.process({}, { command: "#{command} --full-time" })[:success]
19
+ end
20
+ the_command_to_use || -1
21
+ end
22
+
5
23
  def self.details
6
24
  {
7
25
  name: 'Ls',
26
+ title: 'List Files',
8
27
  description: 'Run the "ls" command.',
28
+ fluxGroup: { name: 'Files' },
9
29
  config: Mushy::Bash.details[:config].tap { |c| c.delete :command },
10
30
  }.tap do |c|
11
31
  c[:config][:recursive] = {
@@ -132,6 +152,8 @@ module Mushy
132
152
  end
133
153
 
134
154
  def process event, config
155
+ raise 'ls is not available' if self.class.the_ls_command == -1
156
+
135
157
  arguments = build_the_arguments_from config
136
158
 
137
159
  config[:command] = build_the_command_from arguments
@@ -142,7 +164,8 @@ module Mushy
142
164
  end
143
165
 
144
166
  def build_the_command_from arguments
145
- "ls #{arguments.join(' ')}"
167
+ command = self.class.the_ls_command
168
+ "#{command} #{arguments.join(' ')}"
146
169
  end
147
170
 
148
171
  def build_the_arguments_from config
@@ -230,6 +253,10 @@ module Mushy
230
253
 
231
254
  result[:date] = Mushy::DateParts.parse result[:date]
232
255
 
256
+ if File.exist?(result[:name]) && result[:name].start_with?(directory)
257
+ result[:name] = result[:name].split("\/")[-1]
258
+ end
259
+
233
260
  result[:directory] = directory
234
261
 
235
262
  if result[:type] == 'd' && result[:directory] == result[:name]
@@ -8,6 +8,7 @@ module Mushy
8
8
  {
9
9
  name: 'ParseHtml',
10
10
  title: 'Parse HTML',
11
+ fluxGroup: { name: 'Web' },
11
12
  description: 'Extract data from HTML.',
12
13
  config: {
13
14
  path: {
@@ -90,6 +90,7 @@ module Mushy
90
90
  }
91
91
  },
92
92
  }
93
+ config[:fluxGroup] = { name: 'Export' }
93
94
  end
94
95
  end
95
96
 
@@ -5,7 +5,9 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'Pwd',
8
+ title: 'Get the working directory',
8
9
  description: 'Run the "pwd" command.',
10
+ fluxGroup: { name: 'Environment' },
9
11
  config: Mushy::Bash.details[:config].tap { |c| c.delete :command },
10
12
  }.tap do |c|
11
13
  c[:examples] = {
@@ -8,6 +8,7 @@ module Mushy
8
8
  {
9
9
  name: 'ReadCsv',
10
10
  title: 'Read CSV',
11
+ fluxGroup: { name: 'CSV' },
11
12
  description: 'Read CSV content into events.',
12
13
  config: {
13
14
  data: {
@@ -6,6 +6,7 @@ module Mushy
6
6
  {
7
7
  name: 'ReadFile',
8
8
  title: 'Read File',
9
+ fluxGroup: { name: 'Files' },
9
10
  description: 'Read a file.',
10
11
  config: {
11
12
  file: {
@@ -8,6 +8,7 @@ module Mushy
8
8
  {
9
9
  name: 'ReadJson',
10
10
  title: 'Deserialize JSON',
11
+ fluxGroup: { name: 'JSON' },
11
12
  description: 'Read JSON and output it as an event.',
12
13
  config: {
13
14
  key: {
@@ -0,0 +1,64 @@
1
+ module Mushy
2
+ class RegexMatches < Flux
3
+ def self.details
4
+ {
5
+ name: 'RegexMatches',
6
+ title: 'Find regex matches',
7
+ description: 'Use a regex to search content.',
8
+ fluxGroup: { name: 'Regex' },
9
+ config: {
10
+ regex: { description: 'The regular expression to use.',
11
+ type: 'text',
12
+ value: '(\w+)' },
13
+ value: { description: 'The value against which to use the regular expression.',
14
+ type: 'text',
15
+ value: '{{value}}' }
16
+ },
17
+ examples: {
18
+ 'Simple Example' => {
19
+ description: 'The simplest regex.',
20
+ input: { text: 'apple orange' },
21
+ config: {
22
+ regex: '(\w+)',
23
+ value: 'apple orange'
24
+ },
25
+ result: [ { match1: 'apple' }, { match2: 'orange' } ]
26
+ },
27
+ 'Named Parameters' => {
28
+ description: 'Named Parameters.',
29
+ input: {
30
+ text: 'apple 1 orange 2'
31
+ },
32
+ config: {
33
+ regex: '(?&lt;name&gt;\w+) (?&lt;count&gt;\d+)',
34
+ value: '{{text}}'
35
+ },
36
+ result: [ { name: 'apple', count: '1' }, { name: 'orange', count: '2' } ]
37
+ },
38
+ }
39
+ }
40
+ end
41
+
42
+ def process(_, config)
43
+ return [] unless config[:value]
44
+ return [] if (config[:regex] || '').strip == ''
45
+
46
+ keys = config[:regex].scan(/\?<(\w+)>/).flatten
47
+
48
+ regex = Regexp.new config[:regex]
49
+
50
+ config[:value].scan(regex).map do |match|
51
+ convert_the_match_to_a_hash match, keys
52
+ end
53
+ end
54
+
55
+ def convert_the_match_to_a_hash(match, keys)
56
+ {}.tap do |hash|
57
+ match.each_with_index do |item, index|
58
+ key = (keys[index] || "match#{index + 1}").to_sym
59
+ hash[key] = item
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -92,6 +92,7 @@ module Mushy
92
92
  }
93
93
  },
94
94
  }
95
+ config[:fluxGroup] = { name: 'Export' }
95
96
  end
96
97
  end
97
98
 
@@ -5,7 +5,9 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'SenseHatEnvironmentalSensors',
8
+ title: 'Read Environmental Sensors',
8
9
  description: 'Pull values from the Sense HAT environmental sensors.',
10
+ fluxGroup: { name: 'SenseHAT' },
9
11
  config: Mushy::SimplePythonProgram.default_config,
10
12
  }.tap do |c|
11
13
  measurements
@@ -5,7 +5,9 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'SenseHatLedMatrix',
8
+ title: 'Use LED Matrix',
8
9
  description: 'Interface with the LED Matrix.',
10
+ fluxGroup: { name: 'SenseHAT' },
9
11
  config: Mushy::SimplePythonProgram.default_config.tap do |config|
10
12
  config[:get_pixels] = {
11
13
  description: 'Specify the pixels you want returned as events. Use "all" to return all 64, 3,3 to return x:3 y:3, or "none" to return none.',
@@ -6,6 +6,7 @@ module Mushy
6
6
  Mushy::Bash.details[:config].tap do |config|
7
7
  config.delete :command
8
8
  config.delete :directory
9
+ config[:fluxGroup] = { name: 'Execute' }
9
10
  end
10
11
  end
11
12
 
@@ -48,8 +48,9 @@ module Mushy
48
48
 
49
49
  def self.details
50
50
  {
51
- name: 'Smtp',
51
+ name: 'Send Email Using SMTP',
52
52
  description: 'Send email through SMTP.',
53
+ fluxGroup: { name: 'Email' },
53
54
  config: {
54
55
  from: {
55
56
  description: 'From whom the email will be sent.',
@@ -5,7 +5,8 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'Stdout',
8
- title: 'Stdout / Print',
8
+ title: 'Export text to stdout',
9
+ fluxGroup: { name: 'Environment' },
9
10
  description: 'Standard Out',
10
11
  config: {
11
12
  message: {
@@ -5,7 +5,9 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'Times',
8
+ title: 'Repeat an event X times',
8
9
  description: 'Return the event passed to it, X times.',
10
+ fluxGroup: { name: 'Flows' },
9
11
  config: {
10
12
  times: {
11
13
  description: 'The number of times this event should be returned.',
@@ -5,7 +5,8 @@ module Mushy
5
5
  def self.details
6
6
  {
7
7
  name: 'TwilioMessage',
8
- title: 'Twilio Message',
8
+ title: 'Send SMS',
9
+ fluxGroup: { name: 'Twilio' },
9
10
  description: 'Send a Twilio Message.',
10
11
  config: {
11
12
  account_sid: {
@@ -7,6 +7,7 @@ module Mushy
7
7
  name: 'WriteFile',
8
8
  title: 'Write File',
9
9
  description: 'Write a file.',
10
+ fluxGroup: { name: 'Files' },
10
11
  config: file_saving_config.merge({
11
12
  data: {
12
13
  description: 'The text to write. You can use Liquid templating here to pull data from the event, or write hardcoded data.',
@@ -9,6 +9,7 @@ module Mushy
9
9
  name: 'WriteJson',
10
10
  title: 'Serialize as JSON',
11
11
  description: 'Write the incoming event as JSON.',
12
+ fluxGroup: { name: 'JSON' },
12
13
  config: {
13
14
  key: {
14
15
  description: 'The key of the outgoing field that will contain the JSON.',
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.18.0'
7
+ s.version = '0.21.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.18.0
4
+ version: 0.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darren Cauthon
@@ -205,6 +205,7 @@ files:
205
205
  - lib/mushy/fluxs/read_csv.rb
206
206
  - lib/mushy/fluxs/read_file.rb
207
207
  - lib/mushy/fluxs/read_json.rb
208
+ - lib/mushy/fluxs/regex_matches.rb
208
209
  - lib/mushy/fluxs/screenshot.rb
209
210
  - lib/mushy/fluxs/sense_hat_environmental_sensors.rb
210
211
  - lib/mushy/fluxs/sense_hat_led_matrix.rb