ps 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/lib/ps.rb CHANGED
@@ -64,13 +64,14 @@ end
64
64
  require 'ps/command'
65
65
  require 'ps/process'
66
66
  require 'ps/process_list'
67
+ require 'ps/process_list_printer'
67
68
 
68
69
  def PS *args
69
70
  case args[0]
70
71
  when Regexp
71
72
  opts = args[1] || {}
72
73
  procs = PS.all(opts)
73
- procs = procs.command(args[0])
74
+ procs = procs.select {|proc| proc.command =~ args[0]}
74
75
  procs = procs.select {|proc| proc.pid != Process.pid} unless opts[:include_self]
75
76
  procs
76
77
  when Integer
@@ -13,15 +13,69 @@ module PS
13
13
  end
14
14
 
15
15
  def over val, amnt
16
- select do |proc|
16
+ find_all do |proc|
17
17
  proc.__send__(val) >= amnt
18
18
  end
19
19
  end
20
20
 
21
+ def to_a
22
+ @target
23
+ end
24
+
25
+ def print headers=nil, to=nil
26
+ to ||= STDOUT
27
+ printer = Printer.new(self,headers)
28
+ to.send :puts, printer.to_s
29
+ end
30
+
31
+ def choose question=nil
32
+ if empty?
33
+ puts "No processes found."
34
+ return self
35
+ end
36
+ question ||= 'Select process(s):'
37
+ self.print
38
+ puts "\n#{question}"
39
+ proc_ids = STDIN.gets.chomp
40
+ proc_ids = '*' if proc_ids.empty?
41
+ proc_ids = proc_ids.split(/[,\s]/)
42
+
43
+ if proc_ids.include?('*')
44
+ proc_ids = (0..self.size).to_a
45
+ else
46
+ proc_ids = proc_ids.collect do |proc_id|
47
+ case proc_id
48
+ when /^\d+$/
49
+ proc_id.to_i
50
+ when /^(\d+)(\.{2,3})(\d*)$/
51
+ if $3.empty?
52
+ ($1.to_i..self.size).to_a
53
+ elsif $2.size === 3
54
+ ($1.to_i...$3.to_i).to_a
55
+ else
56
+ ($1.to_i..$3.to_i).to_a
57
+ end
58
+ when /^(\d+)\-(\d+)$/
59
+ ($1.to_i..$2.to_i).to_a
60
+ end
61
+ end.flatten.uniq
62
+ end
63
+
64
+ procs = self.class.new
65
+
66
+ proc_ids.each do |proc_id|
67
+ proc = @target[proc_id.to_i]
68
+
69
+ procs << proc
70
+ end
71
+
72
+ procs
73
+ end
74
+
21
75
  # Ugh shoot me for using method missing, couldn't get
22
76
  # it to work any other way.
23
- def method_missing(name, *args, &blk)
24
- new_target = @target.send(name, *args, &blk)
77
+ def method_missing(*args, &blk)
78
+ new_target = @target.send(*args, &blk)
25
79
 
26
80
  new_target.class == @target.class ? self.class.new(new_target) : new_target
27
81
  end
@@ -0,0 +1,118 @@
1
+ require 'ansi/core'
2
+ require 'ansi/terminal'
3
+ require 'ansi/string'
4
+
5
+ module PS
6
+ class ProcessList
7
+ class Printer
8
+
9
+ def initialize pl, headers=nil
10
+ @headers = headers || %w{# pid ppid user pcpu mem command}
11
+ @process_list = pl
12
+ end
13
+
14
+ def data
15
+ data = []
16
+
17
+ data << header_cells = @headers.collect do |header|
18
+ {:val => header, :header => header}
19
+ end
20
+
21
+ @process_list.to_a.each_with_index do |proc,i|
22
+ data << @headers.collect do |header|
23
+ val = header == '#' ? i : proc.send(header)
24
+
25
+ cell = {:val => val, :header => header}
26
+
27
+ case header
28
+ when 'pid'
29
+ cell[:format] = [:blue]
30
+ when '#'
31
+ cell[:format] = [:yellow]
32
+ cell[:align] = :right
33
+ when 'user','ruser'
34
+ cell[:align] = :center
35
+ when 'mem'
36
+ cell[:val] = val.round.to_s + 'mb'
37
+ cell[:align] = :right
38
+ when 'pcpu', 'pmem'
39
+ cell[:align] = :right
40
+ cell[:format] = case cell[:val]
41
+ when 0.0...25.0
42
+ []
43
+ when 25.0..75.0
44
+ [:red]
45
+ else
46
+ [:white,:on_red]
47
+ end
48
+
49
+ cell[:val] = (cell[:val]).to_i.to_s+'%'
50
+ end
51
+
52
+ cell
53
+ end
54
+ end
55
+
56
+ data
57
+ end
58
+
59
+ def to_s
60
+ printgrid(data)
61
+ end
62
+
63
+ private
64
+
65
+ def printgrid(table)
66
+ strs = []
67
+ strings = table.map do |row|
68
+ row.map { |cell| cell[:val].to_s }
69
+ end
70
+
71
+ column_widths = []
72
+ strings.each do |row|
73
+ row.each_with_index do |cell,i|
74
+ column_widths[i] = [column_widths[i] || 0, cell.length].max
75
+ end
76
+ end
77
+
78
+ row_separator = column_widths.map { |width| "-" * (width+2) }.join("+")[0...ANSI::Terminal.terminal_width]
79
+
80
+ # strs << row_separator
81
+ table.each_with_index do |row,ri|
82
+ diff = 0
83
+ justified_row = row.enum_for(:map).with_index do |cell,ci|
84
+ val = cell[:val].to_s
85
+
86
+ str = " "
87
+
88
+ padded_val = case cell[:align]
89
+ when :right
90
+ val.rjust(column_widths[ci])
91
+ when :center
92
+ val.center(column_widths[ci])
93
+ else
94
+ val.ljust(column_widths[ci])
95
+ end
96
+
97
+ # padded_val.sub!(val,val.ansi(*cell[:format])) if cell[:format] && !cell[:format].empty?
98
+ if cell[:format] && !cell[:format].empty?
99
+ orig_len = padded_val.length
100
+ padded_val.ansi!(*cell[:format])
101
+ diff += padded_val.length - orig_len
102
+ end
103
+
104
+ str << padded_val
105
+
106
+ str << " "
107
+ str
108
+ end
109
+ strs << justified_row.join("|")[0...ANSI::Terminal.terminal_width+diff]
110
+ strs << row_separator if ri == 0
111
+ end
112
+
113
+ strs.join("\n")
114
+ end
115
+
116
+ end
117
+ end
118
+ end
data/lib/ps/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module PS
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
data/ps.gemspec CHANGED
@@ -19,4 +19,5 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  s.add_development_dependency "rspec"
22
+ s.add_runtime_dependency 'ansi'
22
23
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ps
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tal Atlas
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-11-29 00:00:00 Z
18
+ date: 2011-11-30 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rspec
@@ -31,6 +31,20 @@ dependencies:
31
31
  version: "0"
32
32
  type: :development
33
33
  version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: ansi
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :runtime
47
+ version_requirements: *id002
34
48
  description: A ruby utility for interacting with the unix tool 'ps'
35
49
  email:
36
50
  - me@tal.by
@@ -50,6 +64,7 @@ files:
50
64
  - lib/ps/command.rb
51
65
  - lib/ps/process.rb
52
66
  - lib/ps/process_list.rb
67
+ - lib/ps/process_list_printer.rb
53
68
  - lib/ps/version.rb
54
69
  - ps.gemspec
55
70
  - spec/command_spec.rb