utils 0.2.4 → 0.6.4

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
  SHA1:
3
- metadata.gz: 89a3df48460cbab73ab5920232f548d286ad1687
4
- data.tar.gz: 34635c93eddf0452bf25e41f1154d62ec6e72082
3
+ metadata.gz: 27961e1f6195cb69054f6b658820b1544d33ab46
4
+ data.tar.gz: e0a540a6f1cb21602322d8741a349212c9330882
5
5
  SHA512:
6
- metadata.gz: 7ab3f1c6025817ac0be2d4b649a1afe085e3bbcb76b41b0596c77023a12be7eea54fc98e8c7297c75704bfc02f62e37790834aed93d7836ec2b8ee3d5e6fe8d2
7
- data.tar.gz: 71f338cd751118381ea9bb1c88581ec68745e9993ceeb046b922e283a45968f614be11197c796b45575e60cf2d3e98652afba03958b9b1c4a47d2b4235fdce00
6
+ metadata.gz: f13ebaa7a97cc7a8067f63149a3ecccfedf237686cdd7864cddee1e8d52fba0e411a0329fb3eb8a764c593cfb49aed8943167c74bb0ed546802511b2b36acda5
7
+ data.tar.gz: 81efb168bb27cd2498147c6b48f18dad0714a575dd4d516d021acd57817a2b8072d1a297890cf172bf93efb807a4879542b8166dd28c5c12e7b9528d385ef1db
data/Rakefile CHANGED
@@ -15,7 +15,7 @@ GemHadar do
15
15
  ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock', '.rvmrc', '.AppleDouble', 'tags', '.bundle'
16
16
  readme 'README.md'
17
17
 
18
- dependency 'tins', '~>1.0'
18
+ dependency 'tins', '~>1.8'
19
19
  dependency 'term-ansicolor', '~>1.3'
20
20
  dependency 'pstree', '~>0.1'
21
21
  dependency 'pry-editline'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.4
1
+ 0.6.4
@@ -4,23 +4,35 @@ require 'tins/go'
4
4
  include Tins::GO
5
5
  require 'tins/xt/string'
6
6
 
7
- $opts = go 'bdts'
7
+ $opts = go 'bdtsn:'
8
8
 
9
9
  string = ARGV.shift or fail "need a class/filepath/filename"
10
10
 
11
+ def path_shifter(string, separator: ?/, n: 0)
12
+ n or return string
13
+ n, path = n.to_i, string.split(separator)
14
+ if n < 0
15
+ path = path.slice(n..-1)
16
+ else
17
+ path.slice!(0...n)
18
+ end
19
+ path * separator
20
+ end
21
+
11
22
  def underscore(string)
12
- string = string.sub(/.*::/, '') if $opts['b']
23
+ string = path_shifter(string, n: $opts['n'], separator: '::')
13
24
  string = string.underscore
14
25
  $opts['s'] and string << '.rb'
15
26
  print string
16
27
  end
17
28
 
18
29
  def camelize(string)
19
- string = File.basename(string) if $opts['b']
30
+ string = path_shifter(string, n: $opts['n'])
20
31
  string = string.gsub(/#{Regexp.quote(File.extname(string))}\Z/, '')
21
32
  print string.camelize
22
33
  end
23
34
 
35
+ $opts['b'] and $opts['n'] = '-1'
24
36
  case
25
37
  when $opts['t']
26
38
  if string[0, 1] =~ /[A-Z]/
@@ -2,14 +2,24 @@
2
2
 
3
3
  require 'utils'
4
4
  include Utils
5
- require 'tins/go'
5
+ require 'tins/xt'
6
6
  include Tins::GO
7
7
 
8
- def edit_files(paths)
9
- editor = Utils::Editor.new do |config|
10
- config.wait = true
8
+ def edit_files(paths, pick: false)
9
+ editor = Utils::Editor.new
10
+ if pick
11
+ if paths.size > 1
12
+ path = complete(prompt: 'Pick? ') do |p|
13
+ paths.grep /#{p}/
14
+ end
15
+ else
16
+ path = paths.first
17
+ end
18
+ editor.edit(path.strip)
19
+ else
20
+ editor.wait = true
21
+ editor.edit(*paths)
11
22
  end
12
- editor.edit(*paths)
13
23
  end
14
24
 
15
25
  def usage
@@ -27,6 +37,7 @@ Options are
27
37
  -c disable color output
28
38
  -i use case insensitive matches
29
39
  -e open the matching files with edit command
40
+ -E pick one file to edit
30
41
  -a CSET use only character set CSET from PATTERN
31
42
  -I SUFFIX only include files with suffix SUFFIX during finding
32
43
  -b match also binary files
@@ -38,7 +49,7 @@ Version is #{File.basename($0)} #{Utils::VERSION}.
38
49
  exit 1
39
50
  end
40
51
 
41
- args = go 'I:a:rdDciebvh'
52
+ args = go 'I:a:rdDcieEbvh'
42
53
  args['h'] and usage
43
54
  pattern = ARGV.shift or usage
44
55
  roots = (ARGV.empty? ? [ Dir.pwd ] : ARGV).map { |f| File.expand_path(f) }
@@ -53,9 +64,13 @@ finder = Finder.new(
53
64
  :args => args,
54
65
  :roots => roots,
55
66
  :config => config
56
- ).search do |output|
57
- puts output
58
- end
59
- if args['e']
67
+ ).search
68
+
69
+ case
70
+ when args['E']
71
+ edit_files finder.paths, pick: true
72
+ when args['e']
60
73
  edit_files finder.paths
74
+ else
75
+ puts finder.paths
61
76
  end
data/bin/edit CHANGED
@@ -14,21 +14,22 @@ PATHS are the directory and file paths that are opened in the vim.
14
14
 
15
15
  Options are
16
16
 
17
- -w open a buffer in vim and wait until it is deleted
18
- -s read files and files:linenumbers from stdin and open them
19
- -m make intermediate non existing directories to file
20
- -c COMMAND send ex command to the current running editor
21
- -C COMMAND send visual command to the current running editor
22
- -p DURATION pause for this many seconds to wait for vim's reaction
23
- -S SERVER specify the server for this edit command
24
- -h display this help
17
+ -w open a buffer in vim and wait until it is deleted
18
+ -s read files and files:linenumbers from stdin and open them
19
+ -m make intermediate non existing directories to file
20
+ -g [m|c|d|o|g] open modified/cached/deleted/other/(next git commit) files
21
+ -c COMMAND send ex command to the current running editor
22
+ -C COMMAND send visual command to the current running editor
23
+ -p DURATION pause for this many seconds to wait for vim's reaction
24
+ -S SERVER specify the server for this edit command
25
+ -h display this help
25
26
 
26
27
  Version is #{File.basename($0)} #{Utils::VERSION}.
27
28
  EOT
28
29
  exit 1
29
30
  end
30
31
 
31
- $opt = go 'p:S:c:wsmh'
32
+ $opt = go 'p:S:c:g:wsmh'
32
33
  $opt['h'] and usage
33
34
 
34
35
  config = Utils::Config::ConfigFile.new
@@ -70,6 +71,12 @@ if argv.empty?
70
71
  argv << file.path
71
72
  end
72
73
  end
74
+ case git_files_arg = $opt['g']
75
+ when ?g
76
+ argv.concat `git diff HEAD --name-only`.lines.map(&:chomp).uniq
77
+ when /\A[mcdo]\z/
78
+ argv.concat `git ls-files -#{git_files_arg}`.lines.map(&:chomp).uniq
79
+ end
73
80
  if argv.empty?
74
81
  editor.start
75
82
  else
data/bin/probe CHANGED
@@ -10,15 +10,16 @@ require 'drb'
10
10
 
11
11
  def usage
12
12
  puts <<-EOT
13
- Usage: #{File.basename($0)} [OPTS] FILENAME[:LINENO] [FILENAME]
13
+ Usage: #{File.basename($0)} [OPTS] [FILENAME[:LINENO]]
14
14
 
15
15
  Options are
16
16
 
17
17
  -n TESTNAME run the test TESTNAME in file FILENAME
18
18
  -t FRAMEWORK use test framework FRAMEWORK (rspec, test-unit or cucumber)
19
19
  -c start probe as a client
20
+ -C FOO[=BAR] set/get env variable on probe server
20
21
  -l start probe as a server
21
- -p PORT listen on/connect to local port PORT
22
+ -u URI use this DRb URI communication
22
23
  -h display this help
23
24
 
24
25
  Version is #{File.basename($0)} #{Utils::VERSION}.
@@ -43,8 +44,20 @@ singleton_class.class_eval do
43
44
  memoize_function :zeus?
44
45
  end
45
46
 
47
+ def spring?
48
+ `bin/spring status`.lines.first =~ /^Spring is running:/
49
+ rescue Errno::ENOENT
50
+ false
51
+ end
52
+ singleton_class.class_eval do
53
+ memoize_function :spring?
54
+ end
55
+
46
56
  def start_server
47
57
  Thread.abort_on_exception = $DEBUG
58
+ spring? and
59
+ puts "Found spring running, I'll try to use it for running tests."
60
+
48
61
  zeus? and
49
62
  puts "Found a zeus socket file, I'll try to use it for running tests."
50
63
 
@@ -58,10 +71,18 @@ def start_server
58
71
  end
59
72
 
60
73
  def connect_server
61
- Utils::ProbeServer::Job.colorize = true
62
- puts "Connecting probe server on #{$uri.inspect}."
63
74
  DRb.start_service
64
75
  probe_server = DRbObject.new_with_uri($uri)
76
+ if setting = $opt['C']
77
+ case setting
78
+ when /\A([^=]+)=([^=]+)\z/
79
+ probe_server.env[$1] = $2
80
+ when /\A([^=]+)\z/
81
+ puts probe_server.env[$1]
82
+ else
83
+ usage
84
+ end
85
+ end
65
86
  if $opt['c']
66
87
  opts = $opt.subhash('n', 't').each_with_object([]) { |(k, v), a|
67
88
  v.full? and a.concat [ "-#{k}", v ]
@@ -80,28 +101,32 @@ if i = ARGV.index('--')
80
101
  else
81
102
  $args = ARGV.dup
82
103
  end
83
- $opt = go 'lcp:t:n:h', $args
104
+ $opt = go 'lct:n:u:C:h', $args
84
105
  $opt['h'] and usage
85
106
 
86
- $uri = "druby://localhost:#{$opt['p'] || 6623}"
107
+ $uri = $opt['u'] || 'drbunix:probe.socket'
87
108
 
88
109
  case
89
110
  when $opt['l']
90
111
  start_server
91
112
  exit
92
- when $opt['c']
113
+ when $opt['c'], $opt['C']
93
114
  connect_server
94
115
  end
95
116
 
96
- $args.empty? and fail "require filename or filename:linenumber as arguments"
117
+ $args.empty? and exit
97
118
  puts "Running tests in #{$args.inspect}"
98
119
 
99
120
  case ($opt['t'] || $config.probe.test_framework).to_sym
100
121
  when :rspec
101
- if zeus?
102
- rspec = %w[-S zeus rspec -f Utils::LineFormatter ]
122
+ case
123
+ when spring?
124
+ rspec = %w[bin/spring rspec -rutils -f Utils::LineFormatter ]
125
+ when zeus?
126
+ rspec = %w[-S zeus rspec -rutils -f Utils::LineFormatter ]
103
127
  else
104
- rspec = [ find_cmd('rspec', 'spec') ] << '-f' << 'Utils::LineFormatter'
128
+ rspec = [ find_cmd('rspec', 'spec') ] << '-rutils' << '-f' <<
129
+ 'Utils::LineFormatter'
105
130
  end
106
131
  if linenumber = $opt['n']
107
132
  cmd 'ruby', '-I', $config.probe.include_dirs_argument, *rspec, '-l',
data/bin/search CHANGED
@@ -3,8 +3,10 @@
3
3
 
4
4
  require 'utils'
5
5
  include Utils
6
- require 'tins/go'
6
+ require 'tins/xt'
7
7
  include Tins::GO
8
+ require 'term/ansicolor'
9
+ include Term::ANSIColor
8
10
 
9
11
  def convert_ruby_to_vim_regexp(pattern)
10
12
  regexp = pattern.source.dup
@@ -13,14 +15,87 @@ def convert_ruby_to_vim_regexp(pattern)
13
15
  regexp
14
16
  end
15
17
 
16
- def edit_files(pattern, paths)
17
- editor = Utils::Editor.new do |config|
18
- config.wait = true
18
+ def read_line(path)
19
+ filename, lineno = path.source_location
20
+ line = File.open(filename) do |file|
21
+ file.lazy.each_with_index.select { |l, n| n + 1 == lineno }.first&.first
19
22
  end
23
+ end
24
+
25
+ def replace_line(path, new_line)
26
+ filename, lineno = path.source_location
27
+ File.secure_write filename do |output|
28
+ File.open(filename) do |file|
29
+ file.each_with_index do |line, n|
30
+ if n + 1 == lineno
31
+ output.write new_line
32
+ else
33
+ output.write line
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def replace_ask(editor, path, pattern, replace, all)
41
+ line = read_line path
42
+ display_new_line = line.gsub(
43
+ pattern.matcher,
44
+ "#{on_red(line[pattern.matcher])}#{on_green(replace)}"
45
+ )
46
+ loop do
47
+ puts red(path)
48
+ puts display_new_line
49
+ if all
50
+ new_line = line.gsub(pattern.matcher, replace)
51
+ replace_line path, new_line
52
+ break true
53
+ else
54
+ print "Replace? (#{bold(?y)}/n/e/a) "
55
+ case answer = STDIN.gets.chomp
56
+ when ?y, '', ?a
57
+ new_line = line.gsub(pattern.matcher, replace)
58
+ replace_line path, new_line
59
+ break answer == ?a
60
+ when ?n
61
+ break false
62
+ when ?e
63
+ editor.edit(path.strip)
64
+ break false
65
+ when ?a
66
+ break true
67
+ else
68
+ next
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ def edit_files(pattern, paths, pick: false, replace: nil)
75
+ editor = Utils::Editor.new
20
76
  editor.edit_remote_send("<ESC>/#{convert_ruby_to_vim_regexp(pattern)}<CR>")
21
- for path in paths
22
- STDERR.puts "Edit #{path}"
23
- editor.edit(path)
77
+ case
78
+ when replace
79
+ editor.wait = true
80
+ all = false
81
+ for path in paths
82
+ all |= replace_ask editor, path, pattern, replace, all
83
+ end
84
+ when pick
85
+ if paths.size > 1
86
+ path = complete(prompt: 'Pick? ') do |p|
87
+ paths.grep /#{p}/
88
+ end
89
+ else
90
+ path = paths.first
91
+ end
92
+ editor.edit(path.strip)
93
+ else
94
+ editor.wait = true
95
+ for path in paths
96
+ STDERR.puts "Edit #{path}"
97
+ editor.edit(path)
98
+ end
24
99
  end
25
100
  end
26
101
 
@@ -48,6 +123,8 @@ Options are
48
123
  -i use case insensitive matches
49
124
  -I SUFFIX only include files with suffix SUFFIX in search
50
125
  -e open the matching files with edit command
126
+ -E pick one file to edit
127
+ -r REPLACE replace the searched match with REPLACE
51
128
  -a CSET use only character set CSET from PATTERN
52
129
  -v be verbose
53
130
  -h display this help
@@ -57,7 +134,7 @@ Version is #{File.basename($0)} #{Utils::VERSION}.
57
134
  exit 1
58
135
  end
59
136
 
60
- args = go 'I:A:B:C:s:S:n:N:a:RciflLevh'
137
+ args = go 'r:I:A:B:C:s:S:n:N:a:RciflLeEvh'
61
138
  args['h'] and usage
62
139
  pattern = ARGV.shift or usage
63
140
  roots = (ARGV.empty? ? [ Dir.pwd ] : ARGV).map { |f| File.expand_path(f) }
@@ -73,6 +150,8 @@ grepper = Grepper.new(
73
150
  :config => config
74
151
  ).search
75
152
  case
153
+ when args['r'] then edit_files grepper.pattern, grepper.paths, replace: args['r']
154
+ when args['E'] then edit_files grepper.pattern, grepper.paths, pick: true
76
155
  when args['e'] then edit_files grepper.pattern, grepper.paths
77
156
  when args['l'] then puts grepper.paths
78
157
  end
@@ -10,8 +10,11 @@ module Utils
10
10
  require 'utils/grepper'
11
11
  require 'utils/probe_server'
12
12
  require 'utils/ssh_tunnel_specification'
13
- require 'utils/line_formatter'
14
13
  require 'utils/line_blamer'
14
+ begin
15
+ require 'utils/line_formatter'
16
+ rescue LoadError
17
+ end
15
18
 
16
19
  require 'utils/xt/source_location_extension'
17
20
  class ::Object
@@ -99,9 +99,6 @@ class Utils::Finder
99
99
  end
100
100
  paths.compact!
101
101
  @paths, @output = paths.sort.transpose.values_at(-2, -1)
102
- if !@args['e'] && @output && !@output.empty?
103
- yield @output if block_given?
104
- end
105
102
  self
106
103
  end
107
104
  end
@@ -94,7 +94,7 @@ class Utils::Grepper
94
94
  end
95
95
  unless @output.empty?
96
96
  case
97
- when @args['l'], @args['e']
97
+ when @args['l'], @args['e'], @args['E'], @args['r']
98
98
  @output.uniq!
99
99
  @paths.concat @output
100
100
  else
@@ -111,11 +111,12 @@ class Utils::Grepper
111
111
  @skip_pattern and @skip_pattern =~ line and next
112
112
  line[m.begin(0)...m.end(0)] = black on_white m[0]
113
113
  @queue and @queue << line
114
- if @args['l']
114
+ case
115
+ when @args['l']
115
116
  @output << @filename
116
- elsif @args['L']
117
+ when @args['L'], @args['r']
117
118
  @output << "#{@filename}:#{file.lineno}"
118
- elsif @args['e']
119
+ when @args['e'], @args['E']
119
120
  @output << "#{@filename}:#{file.lineno}"
120
121
  break
121
122
  else
@@ -149,15 +150,7 @@ class Utils::Grepper
149
150
  find(*(@roots + [ { :suffix => suffixes } ])) do |filename|
150
151
  match(filename)
151
152
  end
152
- if @args['L'] or @args['e']
153
- @paths = @paths.sort_by do |path|
154
- pair = path.split(':')
155
- pair[1] = pair[1].to_i
156
- pair
157
- end
158
- else
159
- @paths.sort!
160
- end
153
+ @paths = @paths.sort_by(&:source_location)
161
154
  self
162
155
  end
163
156
  end