rego 3.1.0 → 3.2.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.
Files changed (8) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +147 -151
  3. data/bin/rego +78 -303
  4. data/lib/rego/_lib.rb +12 -12
  5. data/lib/rego/utils.rb +40 -33
  6. data/lib/rego.rb +3 -2
  7. data/rego.gemspec +3 -13
  8. metadata +6 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 738b5c494fd8dd07635d1e6602d898cd79877e4c0f9681d58a7063e15bb2fb06
4
- data.tar.gz: f7c8175cee2dfdca458668d645fef5cbedec4e98d95c8a05313448211c3f6261
3
+ metadata.gz: 109c640a020a86cc42d4713fba6d20e91d5e287d4e51c9741c28ffc85b014161
4
+ data.tar.gz: 5b49788c8776d6447aba2403a2ae351eb936630c919c27dce7ed38542fa5a5b7
5
5
  SHA512:
6
- metadata.gz: 8fba73063ba506990915c357a9c14a8b67ca267fa113da53f013301207ffce16a5b39dafc5d72ff2fe802556181361291905bde7707ee5a16fb151f47121999b
7
- data.tar.gz: 61465a39a564df08a505fa9c35984b35edd7360f46e757dfea5c8a70fd27517d34950f31b4f11c7cbc8a162e6f406a7369b235e890961c5e4d31620c85cc8101
6
+ metadata.gz: 00d6c2e1ed14a6e74a285f1f707508c2b50646de0bdbfaa5bbacea0b1798c4baec145beb4bb5e93c41f4f5910eec14d0a1ede8648bb8edf196e2e5ca2ad47eee
7
+ data.tar.gz: 01a24a9972e11e6125901e043e0d63f2b972d3d505e612344ee345115e910602549e8f289242f3a16507705d055b11766280150065ffa63fbe0093e6f5b1c4d9
data/Rakefile CHANGED
@@ -1,13 +1,13 @@
1
- This.author = "Ara T. Howard"
2
- This.email = "ara.t.howard@gmail.com"
3
- This.homepage = "https://github.com/ahoward/#{ This.lib }"
1
+ This.author = 'Ara T. Howard'
2
+ This.email = 'ara.t.howard@gmail.com'
3
+ This.homepage = "https://github.com/ahoward/#{This.lib}"
4
4
 
5
5
  task :license do
6
- open('LICENSE', 'w'){|fd| fd.puts "Ruby"}
6
+ open('LICENSE', 'w') { |fd| fd.puts 'Ruby' }
7
7
  end
8
8
 
9
9
  task :default do
10
- puts((Rake::Task.tasks.map{|task| task.name.gsub(/::/,':')} - ['default']).sort)
10
+ puts((Rake::Task.tasks.map { |task| task.name.gsub(/::/, ':') } - ['default']).sort)
11
11
  end
12
12
 
13
13
  task :test do
@@ -15,90 +15,92 @@ task :test do
15
15
  end
16
16
 
17
17
  namespace :test do
18
- task(:unit){ run_tests!(:unit) }
19
- task(:functional){ run_tests!(:functional) }
20
- task(:integration){ run_tests!(:integration) }
18
+ task(:unit) { run_tests!(:unit) }
19
+ task(:functional) { run_tests!(:functional) }
20
+ task(:integration) { run_tests!(:integration) }
21
21
  end
22
22
 
23
23
  def run_tests!(which = nil)
24
24
  which ||= '**'
25
- test_dir = File.join(This.dir, "test")
26
- test_glob ||= File.join(test_dir, "#{ which }/**_test.rb")
25
+ test_dir = File.join(This.dir, 'test')
26
+ test_glob ||= File.join(test_dir, "#{which}/**_test.rb")
27
27
  test_rbs = Dir.glob(test_glob).sort
28
-
28
+
29
29
  div = ('=' * 119)
30
30
  line = ('-' * 119)
31
31
 
32
32
  test_rbs.each_with_index do |test_rb, index|
33
33
  testno = index + 1
34
- command = "#{ This.ruby } -w -I ./lib -I ./test/lib #{ test_rb }"
34
+ command = "#{This.ruby} -w -I ./lib -I ./test/lib #{test_rb}"
35
35
 
36
36
  puts
37
- say(div, :color => :cyan, :bold => true)
38
- say("@#{ testno } => ", :bold => true, :method => :print)
39
- say(command, :color => :cyan, :bold => true)
40
- say(line, :color => :cyan, :bold => true)
37
+ say(div, color: :cyan, bold: true)
38
+ say("@#{testno} => ", bold: true, method: :print)
39
+ say(command, color: :cyan, bold: true)
40
+ say(line, color: :cyan, bold: true)
41
41
 
42
42
  system(command)
43
43
 
44
- say(line, :color => :cyan, :bold => true)
44
+ say(line, color: :cyan, bold: true)
45
45
 
46
46
  status = $?.exitstatus
47
47
 
48
- if status.zero?
49
- say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
50
- say("SUCCESS", :color => :green, :bold => true)
48
+ if status.zero?
49
+ say("@#{testno} <= ", bold: true, color: :white, method: :print)
50
+ say('SUCCESS', color: :green, bold: true)
51
51
  else
52
- say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
53
- say("FAILURE", :color => :red, :bold => true)
52
+ say("@#{testno} <= ", bold: true, color: :white, method: :print)
53
+ say('FAILURE', color: :red, bold: true)
54
54
  end
55
- say(line, :color => :cyan, :bold => true)
55
+ say(line, color: :cyan, bold: true)
56
56
 
57
57
  exit(status) unless status.zero?
58
58
  end
59
59
  end
60
60
 
61
-
62
61
  task :gemspec do
63
62
  ignore_extensions = ['git', 'svn', 'tmp', /sw./, 'bak', 'gem']
64
63
  ignore_directories = ['pkg']
65
64
  ignore_files = ['test/log']
66
65
 
67
- shiteless =
66
+ shiteless =
68
67
  lambda do |list|
69
68
  list.delete_if do |entry|
70
- next unless test(?e, entry)
71
- extension = File.basename(entry).split(%r/[.]/).last
72
- ignore_extensions.any?{|ext| ext === extension}
69
+ next unless test('e', entry)
70
+
71
+ extension = File.basename(entry).split(/[.]/).last
72
+ ignore_extensions.any? { |ext| ext === extension }
73
73
  end
74
74
  list.delete_if do |entry|
75
- next unless test(?d, entry)
75
+ next unless test('d', entry)
76
+
76
77
  dirname = File.expand_path(entry)
77
- ignore_directories.any?{|dir| File.expand_path(dir) == dirname}
78
+ ignore_directories.any? { |dir| File.expand_path(dir) == dirname }
78
79
  end
79
80
  list.delete_if do |entry|
80
- next unless test(?f, entry)
81
+ next unless test('f', entry)
82
+
81
83
  filename = File.expand_path(entry)
82
- ignore_files.any?{|file| File.expand_path(file) == filename}
84
+ ignore_files.any? { |file| File.expand_path(file) == filename }
83
85
  end
84
86
  end
85
87
 
86
88
  lib = This.lib
87
89
  object = This.object
88
90
  version = This.version
89
- files = shiteless[Dir::glob("**/**")]
90
- executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
91
- #has_rdoc = true #File.exist?('doc')
92
- test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
93
- summary = object.respond_to?(:summary) ? object.summary : "summary: #{ lib } kicks the ass"
94
- description = object.respond_to?(:description) ? object.description : "description: #{ lib } kicks the ass"
95
- license = object.respond_to?(:license) ? object.license : "Ruby"
91
+ files = shiteless[Dir.glob('**/**')]
92
+ executables = shiteless[Dir.glob('bin/*')].map { |exe| File.basename(exe) }
93
+ # has_rdoc = true #File.exist?('doc')
94
+ test_files = "test/#{lib}.rb" if File.file?("test/#{lib}.rb")
95
+ summary = object.respond_to?(:summary) ? object.summary : "summary: #{lib} kicks the ass"
96
+ description = object.respond_to?(:description) ? object.description : "description: #{lib} kicks the ass"
97
+ license = object.respond_to?(:license) ? object.license : 'Ruby'
96
98
 
97
99
  if This.extensions.nil?
98
100
  This.extensions = []
99
101
  extensions = This.extensions
100
- %w( Makefile configure extconf.rb ).each do |ext|
101
- extensions << ext if File.exists?(ext)
102
+ %w[Makefile configure extconf.rb].each do |ext|
103
+ extensions << ext if File.exist?(ext)
102
104
  end
103
105
  end
104
106
  extensions = [extensions].flatten.compact
@@ -107,18 +109,18 @@ task :gemspec do
107
109
  dependencies = []
108
110
  else
109
111
  case This.dependencies
110
- when Hash
111
- dependencies = This.dependencies.values
112
- when Array
113
- dependencies = This.dependencies
112
+ when Hash
113
+ dependencies = This.dependencies.values
114
+ when Array
115
+ dependencies = This.dependencies
114
116
  end
115
117
  end
116
118
 
117
- template =
118
- if test(?e, 'gemspec.erb')
119
- Template{ IO.read('gemspec.erb') }
119
+ template =
120
+ if test('e', 'gemspec.erb')
121
+ Template { IO.read('gemspec.erb') }
120
122
  else
121
- Template {
123
+ Template do
122
124
  <<-__
123
125
  ## <%= lib %>.gemspec
124
126
  #
@@ -131,9 +133,9 @@ task :gemspec do
131
133
  spec.description = <%= description.inspect %>
132
134
  spec.license = <%= license.inspect %>
133
135
 
134
- spec.files =\n<%= files.sort.pretty_inspect %>
136
+ spec.files =\n<%= files.sort.inspect %>
135
137
  spec.executables = <%= executables.inspect %>
136
-
138
+ #{' '}
137
139
  spec.require_path = "lib"
138
140
 
139
141
  spec.test_files = <%= test_files.inspect %>
@@ -149,20 +151,20 @@ task :gemspec do
149
151
  spec.homepage = <%= This.homepage.inspect %>
150
152
  end
151
153
  __
152
- }
154
+ end
153
155
  end
154
156
 
155
157
  Fu.mkdir_p(This.pkgdir)
156
- gemspec = "#{ lib }.gemspec"
157
- open(gemspec, "w"){|fd| fd.puts(template)}
158
+ gemspec = "#{lib}.gemspec"
159
+ open(gemspec, 'w') { |fd| fd.puts(template) }
158
160
  This.gemspec = gemspec
159
161
  end
160
162
 
161
- task :gem => [:clean, :gemspec] do
163
+ task gem: %i[clean gemspec] do
162
164
  Fu.mkdir_p(This.pkgdir)
163
165
  before = Dir['*.gem']
164
- cmd = "gem build #{ This.gemspec }"
165
- `#{ cmd }`
166
+ cmd = "gem build #{This.gemspec}"
167
+ `#{cmd}`
166
168
  after = Dir['*.gem']
167
169
  gem = ((after - before).first || after.first) or abort('no gem!')
168
170
  Fu.mv(gem, This.pkgdir)
@@ -176,81 +178,74 @@ task :readme do
176
178
  version = This.version
177
179
 
178
180
  Dir['sample*/*'].sort.each do |sample|
179
- samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
181
+ samples << "\n" << " <========< #{sample} >========>" << "\n\n"
180
182
 
181
- cmd = "cat #{ sample }"
183
+ cmd = "cat #{sample}"
182
184
  samples << Util.indent(prompt + cmd, 2) << "\n\n"
183
- samples << Util.indent(`#{ cmd }`, 4) << "\n"
185
+ samples << Util.indent(`#{cmd}`, 4) << "\n"
184
186
 
185
- cmd = "ruby #{ sample }"
187
+ cmd = "ruby #{sample}"
186
188
  samples << Util.indent(prompt + cmd, 2) << "\n\n"
187
189
 
188
- cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -I ./lib #{ sample })'"
189
- samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
190
+ cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -I ./lib #{sample})'"
191
+ samples << Util.indent(`#{cmd} 2>&1`, 4) << "\n"
190
192
  end
191
193
 
192
- template =
193
- if test(?e, 'README.erb')
194
- Template{ IO.read('README.erb') }
194
+ template =
195
+ if test('e', 'README.erb')
196
+ Template { IO.read('README.erb') }
195
197
  else
196
- Template {
198
+ Template do
197
199
  <<-__
198
200
  NAME
199
- #{ lib }
201
+ #{lib}
200
202
 
201
203
  DESCRIPTION
202
204
 
203
205
  INSTALL
204
- gem install #{ lib }
206
+ gem install #{lib}
205
207
 
206
208
  SAMPLES
207
- #{ samples }
209
+ #{samples}
208
210
  __
209
- }
211
+ end
210
212
  end
211
213
 
212
- open("README", "w"){|fd| fd.puts template}
214
+ open('README', 'w') { |fd| fd.puts template }
213
215
  end
214
216
 
215
-
216
217
  task :clean do
217
- Dir[File.join(This.pkgdir, '**/**')].each{|entry| Fu.rm_rf(entry)}
218
+ Dir[File.join(This.pkgdir, '**/**')].each { |entry| Fu.rm_rf(entry) }
218
219
  end
219
220
 
220
-
221
- task :release => [:clean, :gemspec, :gem] do
221
+ task release: %i[clean gemspec gem] do
222
222
  gems = Dir[File.join(This.pkgdir, '*.gem')].flatten
223
- raise "which one? : #{ gems.inspect }" if gems.size > 1
224
- raise "no gems?" if gems.size < 1
223
+ raise "which one? : #{gems.inspect}" if gems.size > 1
224
+ raise 'no gems?' if gems.size < 1
225
225
 
226
- cmd = "gem push #{ This.gem }"
226
+ cmd = "gem push #{This.gem}"
227
227
  puts cmd
228
228
  puts
229
229
  system(cmd)
230
- abort("cmd(#{ cmd }) failed with (#{ $?.inspect })") unless $?.exitstatus.zero?
230
+ abort("cmd(#{cmd}) failed with (#{$?.inspect})") unless $?.exitstatus.zero?
231
231
  end
232
232
 
233
-
234
-
235
-
236
-
237
233
  BEGIN {
238
- # support for this rakefile
239
- #
234
+ # support for this rakefile
235
+ #
240
236
  $VERBOSE = nil
241
237
 
242
238
  require 'ostruct'
243
239
  require 'erb'
244
240
  require 'fileutils'
245
241
  require 'rbconfig'
246
- require 'pp'
247
242
 
248
- # fu shortcut
249
- #
243
+ # fu shortcut
244
+ #
250
245
  Fu = FileUtils
251
246
 
252
- # cache a bunch of stuff about this rakefile/environment
253
- #
247
+ # cache a bunch of stuff about this rakefile/environment
248
+ #
254
249
  This = OpenStruct.new
255
250
 
256
251
  This.file = File.expand_path(__FILE__)
@@ -258,115 +253,116 @@ BEGIN {
258
253
  This.pkgdir = File.join(This.dir, 'pkg')
259
254
 
260
255
  This.lib = File.basename(Dir.pwd)
261
- This._lib = "#{ This.dir }/lib/#{ This.lib }/_lib.rb"
256
+ This._lib = "#{This.dir}/lib/#{This.lib}/_lib.rb"
262
257
 
263
- # load meta lib info
264
- #
258
+ # load meta lib info
259
+ #
265
260
  a = Object.constants.dup
266
261
  require This._lib
267
262
  b = Object.constants.dup
268
263
  added = b - a
269
264
  const = added.first
270
265
 
271
- if added.size > 1
272
- STDERR.puts "WARNING: defined multiple constants #{ added.inspect } in #{ _lib }, using #{ const } !!!"
273
- end
266
+ warn "WARNING: defined multiple constants #{added.inspect} in #{_lib}, using #{const} !!!" if added.size > 1
274
267
 
275
268
  This.const = const
276
269
  This.object = Object.const_get(This.const)
277
270
  This.name = This.object.name
278
271
  This.version = This.object.send(:version)
279
272
 
280
- # see if dependencies are export by the module
281
- #
282
- if This.object.respond_to?(:dependencies)
283
- This.dependencies = This.object.dependencies
284
- end
273
+ # see if dependencies are export by the module
274
+ #
275
+ This.dependencies = This.object.dependencies if This.object.respond_to?(:dependencies)
285
276
 
286
- # we need to know the name of the lib an it's version
287
- #
277
+ # we need to know the name of the lib an it's version
278
+ #
288
279
  abort('no lib') unless This.lib
289
280
  abort('no version') unless This.version
290
281
 
291
- # discover full path to this ruby executable
292
- #
282
+ # discover full path to this ruby executable
283
+ #
293
284
  c = RbConfig::CONFIG
294
- bindir = c["bindir"] || c['BINDIR']
285
+ bindir = c['bindir'] || c['BINDIR']
295
286
  ruby_install_name = c['ruby_install_name'] || c['RUBY_INSTALL_NAME'] || 'ruby'
296
287
  ruby_ext = c['EXEEXT'] || ''
297
288
  ruby = File.join(bindir, (ruby_install_name + ruby_ext))
298
289
  This.ruby = ruby
299
290
 
300
- # some utils
301
- #
291
+ # some utils
292
+ #
302
293
  module Util
303
294
  def indent(s, n = 2)
304
295
  s = unindent(s)
305
296
  ws = ' ' * n
306
- s.gsub(%r/^/, ws)
297
+ s.gsub(/^/, ws)
307
298
  end
308
299
 
309
300
  def unindent(s)
310
301
  indent = nil
311
302
  s.each_line do |line|
312
- next if line =~ %r/^\s*$/
313
- indent = line[%r/^\s*/] and break
303
+ next if line =~ /^\s*$/
304
+
305
+ indent = line[/^\s*/] and break
306
+ end
307
+ indent ? s.gsub(/^#{indent}/, '') : s
314
308
  end
315
- indent ? s.gsub(%r/^#{ indent }/, "") : s
316
- end
317
309
  extend self
318
310
  end
319
311
 
320
- # template support
321
- #
312
+ # template support
313
+ #
322
314
  class Template
323
315
  def initialize(&block)
324
316
  @block = block
325
317
  @template = block.call.to_s
326
318
  end
327
- def expand(b=nil)
328
- ERB.new(Util.unindent(@template)).result((b||@block).binding)
319
+
320
+ def expand(b = nil)
321
+ ERB.new(Util.unindent(@template)).result((b || @block).binding)
329
322
  end
330
323
  alias_method 'to_s', 'expand'
331
324
  end
332
- def Template(*args, &block) Template.new(*args, &block) end
333
325
 
334
- # colored console output support
335
- #
326
+ def Template(*args, &block)
327
+ Template.new(*args, &block)
328
+ end
329
+
330
+ # colored console output support
331
+ #
336
332
  This.ansi = {
337
- :clear => "\e[0m",
338
- :reset => "\e[0m",
339
- :erase_line => "\e[K",
340
- :erase_char => "\e[P",
341
- :bold => "\e[1m",
342
- :dark => "\e[2m",
343
- :underline => "\e[4m",
344
- :underscore => "\e[4m",
345
- :blink => "\e[5m",
346
- :reverse => "\e[7m",
347
- :concealed => "\e[8m",
348
- :black => "\e[30m",
349
- :red => "\e[31m",
350
- :green => "\e[32m",
351
- :yellow => "\e[33m",
352
- :blue => "\e[34m",
353
- :magenta => "\e[35m",
354
- :cyan => "\e[36m",
355
- :white => "\e[37m",
356
- :on_black => "\e[40m",
357
- :on_red => "\e[41m",
358
- :on_green => "\e[42m",
359
- :on_yellow => "\e[43m",
360
- :on_blue => "\e[44m",
361
- :on_magenta => "\e[45m",
362
- :on_cyan => "\e[46m",
363
- :on_white => "\e[47m"
333
+ clear: "\e[0m",
334
+ reset: "\e[0m",
335
+ erase_line: "\e[K",
336
+ erase_char: "\e[P",
337
+ bold: "\e[1m",
338
+ dark: "\e[2m",
339
+ underline: "\e[4m",
340
+ underscore: "\e[4m",
341
+ blink: "\e[5m",
342
+ reverse: "\e[7m",
343
+ concealed: "\e[8m",
344
+ black: "\e[30m",
345
+ red: "\e[31m",
346
+ green: "\e[32m",
347
+ yellow: "\e[33m",
348
+ blue: "\e[34m",
349
+ magenta: "\e[35m",
350
+ cyan: "\e[36m",
351
+ white: "\e[37m",
352
+ on_black: "\e[40m",
353
+ on_red: "\e[41m",
354
+ on_green: "\e[42m",
355
+ on_yellow: "\e[43m",
356
+ on_blue: "\e[44m",
357
+ on_magenta: "\e[45m",
358
+ on_cyan: "\e[46m",
359
+ on_white: "\e[47m"
364
360
  }
365
361
  def say(phrase, *args)
366
362
  options = args.last.is_a?(Hash) ? args.pop : {}
367
363
  options[:color] = args.shift.to_s.to_sym unless args.empty?
368
364
  keys = options.keys
369
- keys.each{|key| options[key.to_s.to_sym] = options.delete(key)}
365
+ keys.each { |key| options[key.to_s.to_sym] = options.delete(key) }
370
366
 
371
367
  color = options[:color]
372
368
  bold = options.has_key?(:bold)
@@ -381,7 +377,7 @@ BEGIN {
381
377
  Kernel.send(method, parts.join)
382
378
  end
383
379
 
384
- # always run out of the project dir
385
- #
380
+ # always run out of the project dir
381
+ #
386
382
  Dir.chdir(This.dir)
387
383
  }
data/bin/rego CHANGED
@@ -1,24 +1,15 @@
1
1
  #! /usr/bin/env ruby
2
2
 
3
- Main {
3
+ Main do
4
+ name 'rego'
4
5
 
5
- name <<-__
6
-
7
- rego
8
-
9
- __
6
+ version Rego.version
10
7
 
11
8
  description <<-__
12
-
13
9
  run arbitrary commands easily when files change
14
-
15
10
  __
16
11
 
17
12
  examples <<-__
18
-
19
- ### gem install rego
20
-
21
-
22
13
  # say hai whenever the file foo.txt changes
23
14
  #
24
15
  ~> rego foo.txt -- echo hai
@@ -40,344 +31,128 @@ Main {
40
31
  ~> rego ./test -- ruby -Itest @
41
32
  __
42
33
 
43
- option('--replacement=replacement', '-r'){
44
- default '@'
45
- }
46
-
47
- option('--no-replacement', '-n'){
48
- }
34
+ option('--path=path', '-p')
35
+ option('--paths=paths')
36
+ option('--command=command', '-c')
49
37
 
50
38
  def run
51
- parse_the_command_line
52
- print_a_summary_of_watched_files
53
- loop_watching_files_and_running_commands
39
+ parse_the_command_line!
40
+ print_a_summary_of_watched_files!
41
+ loop_watching_files_and_running_commands!
54
42
  end
55
43
 
56
- def parse_the_command_line
57
- # FIXME - this works around main.rb dropping '--' on the floor in @argv so
58
- # we restore it and re-parse params to restore valid state. should be
59
- # forward compatible if main fixes this though...
60
- #
61
- argv, command = ARGV.join(' ').split(/\s+--\s+/).map{|value| value.to_s.strip}
62
- @argv = argv.scan(/[^\s]+/)
63
- parse_parameters()
44
+ def parse_the_command_line!
45
+ @paths = @params[:paths].values + @params[:path].values
46
+ @command = @params[:command].values
64
47
 
65
- @replacement = params[:replacement].value
66
-
67
- if params['no-replacement'].given?
68
- @replacement = false
69
- end
48
+ state = :paths
70
49
 
71
- @paths, @command = @argv, command
72
-
73
- @paths = @paths.join(' ').strip.scan(/[^\s]+/)
74
- @command = @command.to_s.strip
50
+ @argv.each do |arg|
51
+ if arg.strip == '--'
52
+ state = :commands
53
+ next
54
+ end
75
55
 
76
- if @paths.empty?
77
- @paths.push('.')
56
+ if state == :paths
57
+ @paths << arg
58
+ else
59
+ @command << arg
60
+ end
78
61
  end
79
62
 
80
- if @command.empty?
81
- @command = false
82
- end
63
+ @paths.push(Dir.pwd) if @paths.empty?
64
+ @command.push('ls') if @command.empty?
83
65
 
84
- @paths.map! do |path|
85
- if test(?d, path)
86
- globbed =
87
- Dir.glob(
88
- File.join(path, '**/**'),
89
- File::FNM_DOTMATCH
90
- ).delete_if{|path| %w[ .. ].include?(File.basename(path))}
66
+ @pretty = {
67
+ command: @command.map { |token| Shellwords.escape(token) }.join(' '),
68
+ paths: @paths.map { |path| Rego.relative_path(path, from: Dir.pwd) }.join(', ')
69
+ }
91
70
 
92
- [path, globbed]
93
- else
94
- path
95
- end
96
- end
71
+ return unless @paths.empty?
97
72
 
98
- @paths.flatten!
99
- @paths.compact!
100
- @paths.uniq!
101
- @paths.map! do |path|
102
- begin
103
- Rego.realpath(path)
104
- rescue Object
105
- nil
106
- end
107
- end
108
- @paths.compact!
73
+ abort "no paths to watch found in `#{$0} #{@argv.join(' ')}`"
109
74
  end
110
75
 
111
- def print_a_summary_of_watched_files
112
- puts "## #{ @command }"
113
- puts "#"
114
- puts @paths.join("\n")
76
+ def print_a_summary_of_watched_files!
77
+ Rego.say("#=> rego.command: #{@pretty[:command]}", color: :cyan)
78
+ Rego.say("#=> rego.paths: #{@pretty[:paths]}", color: :cyan)
115
79
  puts
116
80
  end
117
81
 
118
- def loop_watching_files_and_running_commands
119
- @initial_directories = []
120
- @directories = []
121
- @files = []
122
-
123
- @paths.each do |path|
124
- if test(?d, path)
125
- @directories.push(Rego.realpath(path))
126
- @initial_directories.push(Rego.realpath(path))
127
- else
128
- @files.push(Rego.realpath(path))
129
- @directories.push(Rego.realpath(File.dirname(path)))
130
- end
131
- end
132
-
133
- @directories.uniq!
134
- @files.uniq!
135
-
136
- stats = {}
137
-
138
- (@directories + @files).each do |file|
139
- begin
140
- stats[file] = File.stat(file)
141
- rescue
142
- nil
143
- end
144
- end
145
-
146
- #
147
- n = '0'
148
- line = '#' * 42
149
- $running = false
82
+ def loop_watching_files_and_running_commands!
83
+ cmdno = '0'
150
84
 
151
- #
152
85
  rego =
153
- proc do |*args|
154
- path = args.flatten.compact.shift.to_s
155
-
156
- cmd =
157
- if @command
158
- @replacement ? @command.gsub(@replacement, path) : @command
159
- else
160
- "echo #{ path.inspect }"
161
- end
162
-
163
- puts line
164
-
165
- Rego.say("# rego.#{ n } @ #{ Time.now.strftime('%H:%M:%S') } - #{ cmd }", :color => :magenta)
86
+ proc do
166
87
  puts
88
+ Rego.say("#=> rego.#{cmdno} @ #{Time.now.strftime('%H:%M:%S')} -> #{@pretty[:command]}", color: :yellow)
167
89
 
168
- system(cmd)
90
+ success = system(*@command)
169
91
  puts
170
92
 
171
- Rego.say("# rego.#{ n } @ #{ Time.now.strftime('%H:%M:%S') } - #{ $?.exitstatus }", :color => :yellow)
93
+ Rego.say("#=> rego.#{cmdno} @ #{Time.now.strftime('%H:%M:%S')} -> #{$?.exitstatus}",
94
+ color: (success ? :green : :red))
172
95
  puts
173
96
 
174
- n.succ!
175
- end
176
-
177
- #
178
- q = Queue.new
179
-
180
- Thread.new do
181
- loop do
182
- args = q.pop
183
-
184
- begin
185
- rego.call(*args)
186
- rescue Object
187
- end
97
+ cmdno.succ!
188
98
  end
189
- end
190
-
191
- rego.call(:__START__)
192
-
193
- #
194
- fsevent = FSEvent.new
195
-
196
- options = {
197
- :latency => 0.01,
198
- :no_defer => true,
199
- :file_events => true,
200
- :since_when => 0
201
- }
202
-
203
- watchlist = (@files + @directories).uniq
204
99
 
205
- watching = watchlist.inject(Hash.new){|hash, path| hash.update(path => true)}
206
-
207
- fsevent.watch(watchlist, options) do |directories, meta|
208
- meta = Map.for(meta)
209
- events = meta.events
210
- paths = []
211
-
212
- meta.events.each do |event|
213
- paths << event.path
214
- end
215
-
216
- paths.flatten.compact.sort.uniq.each do |path|
217
- path =
218
- begin
219
- Rego.realpath(path)
220
- rescue Object
221
- next
222
- end
223
-
224
- ignore = false # TODO
225
-
226
- unless ignore
227
- @initial_directories.each do |directory|
228
- if path =~ /^#{ Regexp.escape(directory) }\b/
229
- watching[path] = true
230
- end
231
- end
232
-
233
- if watching[path]
234
- before = stats[path]
235
- after = File.stat(path)
236
-
237
- if before.nil? or after.mtime > before.mtime
238
- stats[path] = after
239
- @started_at ||= Time.now.to_f
240
- q.push(path)
241
- end
242
- end
243
- end
244
- end
245
-
246
- =begin
247
- unless $running
248
- $running = true
249
-
250
- args.flatten.each do |dir|
251
- glob = File.join(dir, '**/**')
252
- entries = Dir.glob(glob)
253
-
254
- entries.each do |entry|
255
- entry = File.expand_path(entry)
256
- next unless stats.has_key?(entry)
257
-
258
- begin
259
- stats[entry] ||= File.stat(entry)
260
- before = stats[entry]
261
- after = File.stat(entry)
262
- rescue
263
- next
264
- end
265
-
266
- unless before.mtime == after.mtime
267
- stats[entry] = after
268
- rego[ entry ]
269
- end
270
- end
271
- end
272
- end
273
- $running = false
274
- =end
100
+ listener = Listen.to(*@paths) do |_modified, _added, _removed|
101
+ rego.call
275
102
  end
276
103
 
277
104
  begin
278
- fsevent.run
105
+ rego.call
106
+ listener.start
107
+ sleep
279
108
  rescue SignalException
280
109
  exit(0)
281
110
  end
282
111
  end
283
- =begin
284
- fsevent = FSEvent.new
285
-
286
- fsevent.watch(
287
-
288
- @directories,
289
- :latency => 0.42,
290
- :no_defer => true,
291
- :file_events => true,
292
- :watch_root => true,
293
- :since_when => 0
294
-
295
- ) do |*args|
296
- unless $running
297
- $running = true
298
-
299
- args.flatten.each do |dir|
300
- glob = File.join(dir, '**/**')
301
- entries = Dir.glob(glob)
302
-
303
- entries.each do |entry|
304
- entry = File.expand_path(entry)
305
- next unless stats.has_key?(entry)
306
-
307
- begin
308
- stats[entry] ||= File.stat(entry)
309
- before = stats[entry]
310
- after = File.stat(entry)
311
- rescue
312
- next
313
- end
314
-
315
- unless before.mtime == after.mtime
316
- stats[entry] = after
317
- rego[ entry ]
318
- end
319
- end
320
- end
321
- end
322
- $running = false
323
- end
324
-
325
- begin
326
- fsevent.run
327
- rescue SignalException
328
- exit(0)
329
- end
330
- end
331
- =end
332
- }
333
-
112
+ end
334
113
 
335
114
  BEGIN {
336
115
  # setup a child process to catch signals and brutally shut down the parent as
337
116
  # a monkey-patch to listen/rb-fsevent's busted ctrl-c handling...
338
117
  #
339
- if false
340
- unless((pid = fork))
341
- ppid = Process.ppid
342
-
343
- begin
344
- trap('SIGINT'){
345
- %w(
346
- SIGTERM SIGINT SIGQUIT SIGKILL
347
- ).each do |signal|
348
-
349
- begin
350
- Process.kill("-#{ signal }", ppid)
351
- rescue Object
352
- nil
353
- end
354
-
355
- sleep(rand)
118
+ unless (pid = fork)
119
+ ppid = Process.ppid
120
+
121
+ begin
122
+ trap('SIGINT') do
123
+ %w[
124
+ SIGTERM SIGINT SIGQUIT SIGKILL
125
+ ].each do |signal|
126
+ begin
127
+ Process.kill("-#{signal}", ppid)
128
+ rescue Object
129
+ nil
356
130
  end
357
- }
358
131
 
359
- loop do
360
- Process.kill(0, ppid)
361
- sleep(1)
132
+ sleep(rand)
362
133
  end
363
- rescue Object => e
364
- exit!(0)
365
134
  end
135
+
136
+ loop do
137
+ Process.kill(0, ppid)
138
+ sleep(1)
139
+ end
140
+ rescue Object => e
141
+ exit!(0)
366
142
  end
367
143
  end
368
144
 
369
- require 'pathname'
370
- require 'thread'
145
+ require 'pathname'
371
146
 
372
- this = Pathname.new(__FILE__).realpath.to_s
373
- bindir = File.dirname(this)
374
- rootdir = File.dirname(bindir)
375
- libdir = File.join(rootdir, 'lib')
376
- rego = File.join(libdir, 'rego.rb')
147
+ this = Pathname.new(__FILE__).realpath.to_s
148
+ bindir = File.dirname(this)
149
+ rootdir = File.dirname(bindir)
150
+ libdir = File.join(rootdir, 'lib')
151
+ lib = File.join(libdir, 'rego.rb')
377
152
 
378
- require(rego)
153
+ require(lib)
379
154
 
380
- STDOUT.sync = true
381
- STDERR.sync = true
382
- STDIN.sync = true
155
+ STDOUT.sync = true
156
+ STDERR.sync = true
157
+ STDIN.sync = true
383
158
  }
data/lib/rego/_lib.rb CHANGED
@@ -1,34 +1,34 @@
1
1
  module Rego
2
- Version = '3.1.0' unless defined?(Version)
2
+ Version = '3.2.0' unless defined?(Version)
3
3
 
4
- def Rego.version
4
+ def self.version
5
5
  Rego::Version
6
6
  end
7
7
 
8
- def Rego.dependencies
8
+ def self.dependencies
9
9
  {
10
- 'main' => [ 'main' , ' ~> 6.3.0' ] ,
11
- 'map' => [ 'map' , ' ~> 6.6.0' ] ,
12
- 'rb-fsevent' => [ 'rb-fsevent' , ' ~> 0.11.2' ] ,
10
+ 'main' => ['main', ' ~> 6.3.0'],
11
+ 'map' => ['map', ' ~> 6.6.0'],
12
+ 'listen' => ['listen', ' ~> 3.8.0']
13
13
  }
14
14
  end
15
15
 
16
- def Rego.libdir(*args, &block)
17
- @libdir ||= File.basename(File.expand_path(__FILE__).sub(/\.rb$/,''))
16
+ def self.libdir(*args, &block)
17
+ @libdir ||= File.basename(File.expand_path(__FILE__).sub(/\.rb$/, ''))
18
18
  args.empty? ? @libdir : File.join(@libdir, *args)
19
19
  ensure
20
20
  if block
21
21
  begin
22
22
  $LOAD_PATH.unshift(@libdir)
23
- block.call()
23
+ block.call
24
24
  ensure
25
- $LOAD_PATH.shift()
25
+ $LOAD_PATH.shift
26
26
  end
27
27
  end
28
28
  end
29
29
 
30
- def Rego.load(*libs)
30
+ def self.load(*libs)
31
31
  libs = libs.join(' ').scan(/[^\s+]+/)
32
- Rego.libdir{ libs.each{|lib| Kernel.load(lib) } }
32
+ Rego.libdir { libs.each { |lib| Kernel.load(lib) } }
33
33
  end
34
34
  end
data/lib/rego/utils.rb CHANGED
@@ -1,10 +1,17 @@
1
1
  module Rego
2
- def Rego.realpath(path)
2
+ def self.realpath(path)
3
3
  Pathname.new(path).realpath.to_s
4
4
  end
5
5
 
6
- def Rego.tmpdir(&block)
7
- tmpdir = File.join(Dir.tmpdir, ['rego', Process.ppid.to_s, Process.pid.to_s, Thread.current.object_id.to_s].join('-') + '.d')
6
+ def self.relative_path(path, options = {})
7
+ path = File.expand_path(String(path))
8
+ relative = File.expand_path(String(options[:from]))
9
+ Pathname.new(path).relative_path_from(Pathname.new(relative)).to_s
10
+ end
11
+
12
+ def self.tmpdir(&block)
13
+ tmpdir = File.join(Dir.tmpdir,
14
+ ['rego', Process.ppid.to_s, Process.pid.to_s, Thread.current.object_id.to_s].join('-') + '.d')
8
15
 
9
16
  FileUtils.mkdir_p(tmpdir)
10
17
 
@@ -13,18 +20,18 @@ module Rego
13
20
  Dir.chdir(tmpdir, &block)
14
21
  ensure
15
22
  FileUtils.rm_rf(tmpdir)
16
- at_exit{ `rm -rf #{ tmpdir }` }
23
+ at_exit { `rm -rf #{tmpdir}` }
17
24
  end
18
25
  else
19
26
  tmpdir
20
27
  end
21
28
  end
22
29
 
23
- def Rego.say(phrase, *args)
30
+ def self.say(phrase, *args)
24
31
  options = args.last.is_a?(Hash) ? args.pop : {}
25
32
  options[:color] = args.shift.to_s.to_sym unless args.empty?
26
33
  keys = options.keys
27
- keys.each{|key| options[key.to_s.to_sym] = options.delete(key)}
34
+ keys.each { |key| options[key.to_s.to_sym] = options.delete(key) }
28
35
 
29
36
  color = options[:color]
30
37
  bold = options.has_key?(:bold)
@@ -43,32 +50,32 @@ module Rego
43
50
  end
44
51
 
45
52
  ANSI = {
46
- :clear => "\e[0m",
47
- :reset => "\e[0m",
48
- :erase_line => "\e[K",
49
- :erase_char => "\e[P",
50
- :bold => "\e[1m",
51
- :dark => "\e[2m",
52
- :underline => "\e[4m",
53
- :underscore => "\e[4m",
54
- :blink => "\e[5m",
55
- :reverse => "\e[7m",
56
- :concealed => "\e[8m",
57
- :black => "\e[30m",
58
- :red => "\e[31m",
59
- :green => "\e[32m",
60
- :yellow => "\e[33m",
61
- :blue => "\e[34m",
62
- :magenta => "\e[35m",
63
- :cyan => "\e[36m",
64
- :white => "\e[37m",
65
- :on_black => "\e[40m",
66
- :on_red => "\e[41m",
67
- :on_green => "\e[42m",
68
- :on_yellow => "\e[43m",
69
- :on_blue => "\e[44m",
70
- :on_magenta => "\e[45m",
71
- :on_cyan => "\e[46m",
72
- :on_white => "\e[47m"
53
+ clear: "\e[0m",
54
+ reset: "\e[0m",
55
+ erase_line: "\e[K",
56
+ erase_char: "\e[P",
57
+ bold: "\e[1m",
58
+ dark: "\e[2m",
59
+ underline: "\e[4m",
60
+ underscore: "\e[4m",
61
+ blink: "\e[5m",
62
+ reverse: "\e[7m",
63
+ concealed: "\e[8m",
64
+ black: "\e[30m",
65
+ red: "\e[31m",
66
+ green: "\e[32m",
67
+ yellow: "\e[33m",
68
+ blue: "\e[34m",
69
+ magenta: "\e[35m",
70
+ cyan: "\e[36m",
71
+ white: "\e[37m",
72
+ on_black: "\e[40m",
73
+ on_red: "\e[41m",
74
+ on_green: "\e[42m",
75
+ on_yellow: "\e[43m",
76
+ on_blue: "\e[44m",
77
+ on_magenta: "\e[45m",
78
+ on_cyan: "\e[46m",
79
+ on_white: "\e[47m"
73
80
  }
74
81
  end
data/lib/rego.rb CHANGED
@@ -2,10 +2,11 @@ require 'time'
2
2
  require 'pathname'
3
3
  require 'yaml'
4
4
  require 'tmpdir'
5
+ require 'shellwords'
5
6
 
6
7
  module Rego
7
- require_relative 'rego/_lib.rb'
8
- require_relative 'rego/utils.rb'
8
+ require_relative 'rego/_lib'
9
+ require_relative 'rego/utils'
9
10
  end
10
11
 
11
12
  # gems
data/rego.gemspec CHANGED
@@ -3,24 +3,14 @@
3
3
 
4
4
  Gem::Specification::new do |spec|
5
5
  spec.name = "rego"
6
- spec.version = "3.1.0"
6
+ spec.version = "3.2.0"
7
7
  spec.platform = Gem::Platform::RUBY
8
8
  spec.summary = "rego"
9
9
  spec.description = "description: rego kicks the ass"
10
10
  spec.license = "Ruby"
11
11
 
12
12
  spec.files =
13
- ["README.md",
14
- "Rakefile",
15
- "bin",
16
- "bin/rego",
17
- "lib",
18
- "lib/rego",
19
- "lib/rego.rb",
20
- "lib/rego/_lib.rb",
21
- "lib/rego/utils.rb",
22
- "rego.gemspec"]
23
-
13
+ ["README.md", "Rakefile", "bin", "bin/rego", "lib", "lib/rego", "lib/rego.rb", "lib/rego/_lib.rb", "lib/rego/utils.rb", "rego.gemspec"]
24
14
  spec.executables = ["rego"]
25
15
 
26
16
  spec.require_path = "lib"
@@ -32,7 +22,7 @@ Gem::Specification::new do |spec|
32
22
 
33
23
  spec.add_dependency(*["map", " ~> 6.6.0"])
34
24
 
35
- spec.add_dependency(*["rb-fsevent", " ~> 0.11.2"])
25
+ spec.add_dependency(*["listen", " ~> 3.8.0"])
36
26
 
37
27
 
38
28
  spec.extensions.push(*[])
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rego
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ara T. Howard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-24 00:00:00.000000000 Z
11
+ date: 2023-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: main
@@ -39,19 +39,19 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: 6.6.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: rb-fsevent
42
+ name: listen
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.11.2
47
+ version: 3.8.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.11.2
54
+ version: 3.8.0
55
55
  description: 'description: rego kicks the ass'
56
56
  email: ara.t.howard@gmail.com
57
57
  executables:
@@ -85,7 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
85
  - !ruby/object:Gem::Version
86
86
  version: '0'
87
87
  requirements: []
88
- rubygems_version: 3.3.7
88
+ rubygems_version: 3.4.1
89
89
  signing_key:
90
90
  specification_version: 4
91
91
  summary: rego