appear 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.doc-coverage +1 -1
- data/CHANGELOG.md +4 -0
- data/lib/appear/command.rb +10 -6
- data/lib/appear/constants.rb +2 -1
- data/lib/appear/instance.rb +4 -3
- data/lib/appear/join.rb +39 -5
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d114dfa1bdcda18b13325f5d7961b296b09a8b2
|
4
|
+
data.tar.gz: 26fcebb685c8a0adcc5cac80c9bd1a7ce3153eef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12f5f608f578ae6042e987fd20a5082d70c4b8067bfaebaf3e033fcacf66ede064bec3892d1174bf3be16a3168a91b80095ec798354d63f79e067609ab577eef
|
7
|
+
data.tar.gz: 848a59a97371e61417851e9fe8cdf33436d1e4e5ccf9a5d9ec9af0618c091d197babf493c48332ec0f5b975408acda7f0b02513582cf9b929334d74afb345a96
|
data/.doc-coverage
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
80.43
|
data/CHANGELOG.md
CHANGED
data/lib/appear/command.rb
CHANGED
@@ -4,8 +4,6 @@ require 'appear/instance'
|
|
4
4
|
require 'optparse'
|
5
5
|
|
6
6
|
module Appear
|
7
|
-
class InvalidPidError < Error; end
|
8
|
-
|
9
7
|
# Entrypoint and manager for the command-line `appear` tool.
|
10
8
|
class Command
|
11
9
|
def initialize
|
@@ -13,6 +11,9 @@ module Appear
|
|
13
11
|
@config.silent = true
|
14
12
|
end
|
15
13
|
|
14
|
+
# The ui for our command.
|
15
|
+
#
|
16
|
+
# @return [OptionParser]
|
16
17
|
def option_parser
|
17
18
|
@option_parser ||= OptionParser.new do |o|
|
18
19
|
o.banner = 'Usage: appear [OPTION]... [PID]'
|
@@ -53,15 +54,18 @@ module Appear
|
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
57
|
+
# Execute the command. Will exit(3) with a status; does not return.
|
58
|
+
#
|
56
59
|
# @param all_args [Array<String>] something like ARGV
|
57
60
|
def execute(all_args)
|
58
61
|
argv = option_parser.parse(*all_args)
|
59
62
|
|
60
|
-
pid = Integer(argv[0] || Process.pid, 10)
|
61
|
-
|
62
|
-
start_message = "STARTING. pid: #{pid}"
|
63
63
|
if argv.empty?
|
64
|
-
|
64
|
+
pid = Process.pid
|
65
|
+
start_message = "STARTING. pid: #{pid} (current process pid)"
|
66
|
+
else
|
67
|
+
pid = Integer(argv[0])
|
68
|
+
start_message = "STARTING. pid: #{pid}"
|
65
69
|
end
|
66
70
|
|
67
71
|
start = Time.now
|
data/lib/appear/constants.rb
CHANGED
data/lib/appear/instance.rb
CHANGED
@@ -11,9 +11,6 @@ require 'appear/tmux'
|
|
11
11
|
require 'appear/revealers'
|
12
12
|
|
13
13
|
module Appear
|
14
|
-
class CannotRevealError < Error; end
|
15
|
-
class NoGuiError < CannotRevealError; end
|
16
|
-
|
17
14
|
# Instance is the main class in Appear. It constructs all the other services
|
18
15
|
# and co-ordinates the actual revealing process.
|
19
16
|
class Instance < Service
|
@@ -40,6 +37,10 @@ module Appear
|
|
40
37
|
super(@all_services)
|
41
38
|
end
|
42
39
|
|
40
|
+
# appear the given PID.
|
41
|
+
#
|
42
|
+
# @param pid [Number] process id
|
43
|
+
# @return [Boolean] true if we revealed something, false otherwise.
|
43
44
|
def call(pid)
|
44
45
|
tree = process_tree(pid)
|
45
46
|
|
data/lib/appear/join.rb
CHANGED
@@ -21,7 +21,7 @@ module Appear
|
|
21
21
|
class Join
|
22
22
|
# @param field [Symbol] the method or hash field name to join on.
|
23
23
|
# @param tables [Array<Any>] arrays of any sort of object, so long as it is
|
24
|
-
#
|
24
|
+
# either a hash, or has a method named `field`.
|
25
25
|
# @return [Array<Join>]
|
26
26
|
def self.join(field, *tables)
|
27
27
|
by_field = Hash.new { |h, k| h[k] = self.new }
|
@@ -39,6 +39,12 @@ module Appear
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
# True if we can access the given field on an object, either by calling
|
43
|
+
# that method on the object, or by accessing using []
|
44
|
+
#
|
45
|
+
# @param obj [Any]
|
46
|
+
# @param field [Symbol, String]
|
47
|
+
# @return [Boolean]
|
42
48
|
def self.can_access?(obj, field)
|
43
49
|
if obj.respond_to?(field)
|
44
50
|
return true
|
@@ -48,6 +54,12 @@ module Appear
|
|
48
54
|
return false
|
49
55
|
end
|
50
56
|
|
57
|
+
# Access the given field on an object.
|
58
|
+
# Raises an error if the field cannot be accessed.
|
59
|
+
#
|
60
|
+
# @param object [Any]
|
61
|
+
# @param field [Symbol, String]
|
62
|
+
# @return [Any] the value at that field
|
51
63
|
def self.access(obj, field)
|
52
64
|
if obj.respond_to?(field)
|
53
65
|
obj.send(field)
|
@@ -58,21 +70,34 @@ module Appear
|
|
58
70
|
end
|
59
71
|
end
|
60
72
|
|
61
|
-
#
|
62
|
-
#
|
63
|
-
#
|
73
|
+
# A Join is a union of data objects. You can use a Join to group objects of
|
74
|
+
# different types, so that you may read from whichever has a given field.
|
75
|
+
#
|
76
|
+
# It is more useful to use self.join to perform a join operation on
|
77
|
+
# collections than to create Join objects directly.
|
64
78
|
def initialize(*objs)
|
65
79
|
@objs = objs
|
66
80
|
end
|
67
81
|
|
68
|
-
|
82
|
+
# add another data object to this join.
|
83
|
+
#
|
84
|
+
# @param obj [Any]
|
85
|
+
def push!(obj)
|
69
86
|
@objs << obj
|
70
87
|
end
|
71
88
|
|
89
|
+
# get the number of objects in this join
|
90
|
+
#
|
91
|
+
# @return [Fixnum]
|
72
92
|
def joined_count
|
73
93
|
@objs.length
|
74
94
|
end
|
75
95
|
|
96
|
+
# read a field from the join. Returns the first non-nil value we can read.
|
97
|
+
# @see self.access for information about how fields are accessed.
|
98
|
+
#
|
99
|
+
# @param sym [String, Symbol] the field name
|
100
|
+
# @return [Any, nil]
|
76
101
|
def [](sym)
|
77
102
|
result = nil
|
78
103
|
|
@@ -86,6 +111,12 @@ module Appear
|
|
86
111
|
result
|
87
112
|
end
|
88
113
|
|
114
|
+
# the {#method_missing} implementation on a Join allows you to access valid
|
115
|
+
# fields with regular accessors.
|
116
|
+
#
|
117
|
+
# @param method [String, Symbol]
|
118
|
+
# @param args [Array<Any>] should have none
|
119
|
+
# @param block [Proc] should have none
|
89
120
|
def method_missing(method, *args, &block)
|
90
121
|
raise NoMethodError.new("Cannot access #{method.inspect}") unless respond_to?(method)
|
91
122
|
raise ArgumentError.new("Passed args to accessor") if args.length > 0
|
@@ -93,6 +124,9 @@ module Appear
|
|
93
124
|
self[method]
|
94
125
|
end
|
95
126
|
|
127
|
+
# @param sym [String, Symbol] name of the method
|
128
|
+
# @param priv [Boolean] default false
|
129
|
+
# @return [Boolean] true if we can respond to the given method name
|
96
130
|
def respond_to?(sym, priv = false)
|
97
131
|
super(sym, priv) || (@objs.any? { |o| self.class.can_access?(o, sym) })
|
98
132
|
end
|