proc_index 0.1.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.
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