proc_index 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8c2433eaf5d0ea9e807bd35f19d08c6e23795c19
4
+ data.tar.gz: 5ef96d0299a739a15976c479fba44c1ef5923178
5
+ SHA512:
6
+ metadata.gz: de8c69313aa18e402612bde4f48fe596a36454e88757c160f253faa86157bc2e7e32fd3e19bf272d6832e1a0aadfbfe90de08612edbf6d51aaa0ee18f03ffe88
7
+ data.tar.gz: e018530d9ed7f2b775dc6753e229785c1e8cbbdb5f0d254032c7e88859a6fe79bcd6e1e0ecfe48b3464da4d436ce21306b994f55ce6bd46635064f667135b8c4
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ README.md
3
+ ChangeLog.md
4
+
5
+ LICENSE.txt
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ /.bundle
2
+ /*.gem
3
+ /Gemfile.lock
4
+ /html/
5
+ /pkg/
6
+ /vendor/cache/*.gem
data/.rdoc_options ADDED
@@ -0,0 +1,16 @@
1
+ --- !ruby/object:RDoc::Options
2
+ encoding: UTF-8
3
+ static_path: []
4
+ rdoc_include:
5
+ - .
6
+ charset: UTF-8
7
+ exclude:
8
+ hyperlink_all: false
9
+ line_numbers: false
10
+ main_page: README.md
11
+ markup: markdown
12
+ show_hash: false
13
+ tab_width: 8
14
+ title: proc_index Documentation
15
+ visibility: :protected
16
+ webcvs:
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour --format documentation
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ proc-index
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.2.0
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ ---
2
+ language: ruby
3
+ rvm:
4
+ - 2.0
5
+ - 2.1
6
+ - 2.2
data/ChangeLog.md ADDED
@@ -0,0 +1,4 @@
1
+ ### 0.1.0 / 2015-11-23
2
+
3
+ * Initial release:
4
+
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2015 Alex Manelis
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # ProcIndex
2
+ Simple ORM for your process lists. Currently only supported on OS X or Unix based systems (and even that could be limited).
3
+
4
+ ### Basic Usage
5
+ Printing all processes:
6
+
7
+ $> data = ProcIndex.ps
8
+ ...
9
+ $> data.body
10
+ => [<Hashie::Mash command="/System/Library/CoreServices/Dock.app/Contents/MacOS/Dock" cpu="36.0" mem="0.4" pid="354" rss="35780" started="Sat01PM" stat="U" time="8:08.24" tt="??" user="alexmanelis" vsz="2789684">...]
11
+
12
+ Searching by command:
13
+
14
+ $> results = ProcIndex.search('electron')
15
+ ...
16
+ => [#<Hashie::Mash command="/Users/alexmanelis/Development/tmp/node_modules/nightmare/node_modules/electron-prebuilt/dist/Electron.app/Contents/MacOS/Electron" cpu="0.1" mem="0.6" pid="44558" rss="49672" started="1:04PM" stat="S" time="0:00.42" tt="??" user="alexmanelis" vsz="3402532">
17
+
18
+ Kill all running processes from search results:
19
+
20
+ $> ...
21
+ $> ProcIndex.kill_by_results(results)
22
+ => [1, 1, 1]
23
+
24
+ More coming soon...
25
+
data/Rakefile ADDED
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+
5
+ begin
6
+ require 'bundler/setup'
7
+ rescue LoadError => e
8
+ abort e.message
9
+ end
10
+
11
+ require 'rake'
12
+
13
+ require 'awesome_print'
14
+ AwesomePrint.irb!
15
+
16
+ require 'rubygems/tasks'
17
+ Gem::Tasks.new
18
+
19
+ require 'rdoc/task'
20
+ RDoc::Task.new
21
+ task doc: :rdoc
22
+
23
+ require 'rspec/core/rake_task'
24
+ RSpec::Core::RakeTask.new
25
+
26
+ task test: :spec
27
+ task default: :spec
28
+
29
+ directory '.'
30
+ task :dgem do
31
+ system 'rm *.gem'
32
+ end
33
+
34
+ task :bgem do
35
+ system 'gem build *.gemspec'
36
+ end
@@ -0,0 +1,50 @@
1
+ module ProcIndex
2
+ class NoDataError < StandardError
3
+ end
4
+
5
+ class Container
6
+ include Enumerable
7
+
8
+ attr_accessor :body, :key
9
+
10
+ def initialize(fields, data)
11
+ @fields = fields
12
+ @data = data
13
+
14
+ format_data!
15
+ end
16
+
17
+ def fields
18
+ @fields
19
+ end
20
+
21
+ private
22
+ def format_data!
23
+ raise NoDataError.new('No data has been passed') unless @data
24
+
25
+ # Clear out new line characters and split by lines
26
+ @data = @data.strip.split(/[\r\n]+/)
27
+
28
+ # The first line of the data object is the key
29
+ self.key = @data[0].gsub(/%/, '').strip.squeeze(' ').downcase.split(' ')
30
+
31
+ # Sub down the content with no spaces
32
+ @data.each_with_index { |item, ndx| @data[ndx] = @data[ndx].strip.squeeze(' ') }
33
+
34
+ # Assign all the values to their cooresponding keys from the fields
35
+ temp_body = []
36
+ @data.each_with_index do |row, ndx|
37
+ next if ndx == 0
38
+
39
+ holder = {}
40
+ row.split(' ', @fields.count).each_with_index do |value, ndx2|
41
+ holder[self.key[ndx2]] = value
42
+ end
43
+
44
+ temp_body << Hashie::Mash.new(holder)
45
+ end
46
+
47
+ self.body = temp_body
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,6 @@
1
+ module ProcIndex
2
+ extend self
3
+
4
+ def could_be_user?(attr)
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ module ProcIndex
2
+ VERSION = "0.1.0"
3
+ end
data/lib/proc_index.rb ADDED
@@ -0,0 +1,117 @@
1
+ require 'proc_index/version'
2
+ require 'proc_index/container'
3
+
4
+ require 'open3'
5
+ require 'hashie'
6
+ require 'fuzzy_match'
7
+
8
+ module ProcIndex
9
+ class Error < StandardError; end
10
+
11
+ #
12
+ # Base fields on OS X Process table -> `ps aux`
13
+ @fields = [
14
+ 'user',
15
+ 'pid',
16
+ 'cpu',
17
+ 'mem',
18
+ 'vsz',
19
+ 'rss',
20
+ 'tt',
21
+ 'stat',
22
+ 'started',
23
+ 'time',
24
+ 'command'
25
+ ]
26
+
27
+ Fields = @fields
28
+ ProcTableStruct = Hash[ *@fields.collect { |v| [ v, {position: 0} ] }.flatten ]
29
+
30
+ @states = [
31
+ {code: 'R', desc: 'Running or runnable (on run queue)'},
32
+ {code: 'D', desc: 'Uninterruptible sleep (usually IO)'},
33
+ {code: 'S', desc: 'Interruptible sleep (waiting for an event to complete)'},
34
+ {code: 'Z', desc: 'Defunct/zombie, terminated but not reaped by its parent'},
35
+ {code: 'T', desc: 'Stopped, either by a job control signal or because it is being traced'}
36
+ ]
37
+
38
+ at_exit do
39
+ puts 'Exiting' if $!
40
+ end
41
+
42
+ #
43
+ # self.kill_by_results
44
+ #
45
+ def self.kill_by_results(results)
46
+ results.collect { |node| Process.kill 9, node.pid.to_i }
47
+ end
48
+
49
+ #
50
+ # self.ps
51
+ #
52
+ def self.ps(pid=nil)
53
+ array = block_given? ? nil : []
54
+ struct = nil
55
+
56
+ raise TypeError unless pid.is_a?(Fixnum) if pid
57
+
58
+ pid.nil? ? get_process_list : get_process_list(pid: pid)
59
+ end
60
+
61
+ #
62
+ # self.search
63
+ # -> (pid: 10238492, command: 'spring isofun rails')
64
+ # -> (pid: 382973, user: 'alexmanelis')
65
+ # -> ('spring rails server')
66
+ #
67
+ def self.search(args)
68
+ raise ArgumentError.new("Invalid arguments passed: #{args.inspect}") if args.nil?
69
+
70
+ process_list = get_process_list
71
+ process_body = process_list.body
72
+
73
+ matcher_instances = []
74
+ case args.class.to_s
75
+ when 'Hash'
76
+ args.map do |k, v|
77
+ matcher_instances << {instance: FuzzyMatch.new(process_body, read: k), query: v}
78
+ end
79
+ when 'String'
80
+ # matcher_instances << {instance: FuzzyMatch.new(process_body, read: :command),
81
+ # query: args.strip.downcase}
82
+ else
83
+ raise ArgumentError.new("Invalid search args: #{args.inspect} -> #{args.class.inspect}")
84
+ end
85
+
86
+ if matcher_instances.empty?
87
+ results = process_body.select { |node| node.command.include?(args.downcase.strip) }
88
+ else
89
+ results = matcher_instances.inject([]) do |result, instance|
90
+ result << instance[:instance].find(instance[:query])
91
+ end
92
+ end
93
+
94
+ results
95
+ end
96
+
97
+ private
98
+
99
+ #
100
+ # self.get_process_list
101
+ #
102
+ def self.get_process_list
103
+ yield if block_given?
104
+
105
+ begin
106
+ stdin, stdout, stderr = Open3.popen3("ps aux")
107
+
108
+ stdout = stdout.read
109
+ stderr = stderr.read
110
+ rescue => e
111
+ raise StandardError.new("Error opening stream from process list -> #{e}")
112
+ end
113
+
114
+ ProcIndex::Container.new(@fields, stdout)
115
+ end
116
+
117
+ end
@@ -0,0 +1,42 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'proc_index/version'
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = "proc_index"
9
+ gem.version = ProcIndex::VERSION
10
+ gem.summary = "Process table ORM"
11
+ gem.description = "Map and search all your processes."
12
+ gem.license = "MIT"
13
+ gem.authors = ["Alex Manelis"]
14
+ gem.email = "amanelis@gmail.com"
15
+ gem.homepage = "https://rubygems.org/gems/proc_index"
16
+
17
+ gem.files = `git ls-files`.split($/)
18
+
19
+ `git submodule --quiet foreach --recursive pwd`.split($/).each do |submodule|
20
+ submodule.sub!("#{Dir.pwd}/",'')
21
+
22
+ Dir.chdir(submodule) do
23
+ `git ls-files`.split($/).map do |subpath|
24
+ gem.files << File.join(submodule,subpath)
25
+ end
26
+ end
27
+ end
28
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
29
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
30
+ gem.require_paths = ['lib']
31
+
32
+ gem.add_dependency 'awesome_print', '1.6.1'
33
+ gem.add_dependency 'fuzzy_match', '2.1.0'
34
+ gem.add_runtime_dependency 'hashie', '~> 3.4', '>= 3.4.3'
35
+ gem.add_development_dependency 'pry', '~> 0.10.3'
36
+
37
+ gem.add_development_dependency 'bundler', '~> 1.10'
38
+ gem.add_development_dependency 'rake', '~> 10.0'
39
+ gem.add_development_dependency 'rdoc', '~> 4.0'
40
+ gem.add_development_dependency 'rspec', '~> 3.0'
41
+ gem.add_development_dependency 'rubygems-tasks', '~> 0.2'
42
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+ require 'proc_index'
3
+
4
+ require 'open3'
5
+
6
+ describe ProcIndex::Container do
7
+ context '.new' do
8
+ let(:data) {
9
+ stdin, stdout, stderr = Open3.popen3("ps aux")
10
+ data = stdout.read
11
+ data
12
+ }
13
+
14
+ subject { ProcIndex::Container.new(ProcIndex::Fields, data) }
15
+
16
+ it { expect(subject).to_not be_nil }
17
+ it { expect(subject.body).to_not be_nil }
18
+ it { expect(subject.key).to_not be_nil }
19
+ it { expect(subject.fields).to eq(ProcIndex::Fields) }
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ require 'proc_index'
3
+
4
+ describe ProcIndex do
5
+ describe '.ps' do
6
+ context 'returns an instance of ProcIndex::Container' do
7
+ subject { ProcIndex.ps }
8
+ it { expect(subject).to_not be_nil }
9
+ it { expect(subject.body).to_not be_nil }
10
+ end
11
+ end
12
+
13
+ describe '.search' do
14
+ context 'returns a collection of Hashie::Mash objects' do
15
+ subject { ProcIndex.search('ruby') }
16
+ it { expect(subject).to_not be_nil }
17
+ it { expect(subject.count).to be > 1}
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,4 @@
1
+ require 'rspec'
2
+ require 'proc_index/version'
3
+
4
+ include ProcIndex
metadata ADDED
@@ -0,0 +1,198 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: proc_index
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alex Manelis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: awesome_print
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.6.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: fuzzy_match
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 2.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 2.1.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: hashie
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.4'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 3.4.3
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '3.4'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 3.4.3
61
+ - !ruby/object:Gem::Dependency
62
+ name: pry
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 0.10.3
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 0.10.3
75
+ - !ruby/object:Gem::Dependency
76
+ name: bundler
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.10'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.10'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rake
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '10.0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '10.0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rdoc
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '4.0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '4.0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rspec
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rubygems-tasks
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.2'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.2'
145
+ description: Map and search all your processes.
146
+ email: amanelis@gmail.com
147
+ executables: []
148
+ extensions: []
149
+ extra_rdoc_files: []
150
+ files:
151
+ - ".document"
152
+ - ".gitignore"
153
+ - ".rdoc_options"
154
+ - ".rspec"
155
+ - ".ruby-gemset"
156
+ - ".ruby-version"
157
+ - ".travis.yml"
158
+ - ChangeLog.md
159
+ - Gemfile
160
+ - LICENSE.txt
161
+ - README.md
162
+ - Rakefile
163
+ - lib/proc_index.rb
164
+ - lib/proc_index/container.rb
165
+ - lib/proc_index/util.rb
166
+ - lib/proc_index/version.rb
167
+ - proc_index.gemspec
168
+ - spec/proc_index/container_spec.rb
169
+ - spec/proc_index_spec.rb
170
+ - spec/spec_helper.rb
171
+ homepage: https://rubygems.org/gems/proc_index
172
+ licenses:
173
+ - MIT
174
+ metadata: {}
175
+ post_install_message:
176
+ rdoc_options: []
177
+ require_paths:
178
+ - lib
179
+ required_ruby_version: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ required_rubygems_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ requirements: []
190
+ rubyforge_project:
191
+ rubygems_version: 2.4.5
192
+ signing_key:
193
+ specification_version: 4
194
+ summary: Process table ORM
195
+ test_files:
196
+ - spec/proc_index/container_spec.rb
197
+ - spec/proc_index_spec.rb
198
+ - spec/spec_helper.rb