instrumentality 0.1.0 → 0.1.3
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 +4 -4
- data/.circleci/config.yml +12 -0
- data/.circleci/images/Dockerfile +4 -0
- data/.circleci/images/Finder.app +6 -0
- data/.circleci/images/xcode-select +0 -0
- data/.circleci/images/xcodebuild +0 -0
- data/.coveralls.yml +2 -0
- data/README.md +3 -0
- data/instrumentality.gemspec +3 -0
- data/lib/instrumentality/command.rb +4 -3
- data/lib/instrumentality/command/{custom.rb → profile.rb} +21 -34
- data/lib/instrumentality/command/profile/benchmark.rb +47 -0
- data/lib/instrumentality/command/profile/custom.rb +47 -0
- data/lib/instrumentality/command/profile/file_activity.rb +47 -0
- data/lib/instrumentality/executor.rb +13 -9
- data/lib/instrumentality/finder.rb +2 -2
- data/lib/instrumentality/header_generator.rb +7 -2
- data/lib/instrumentality/logger.rb +9 -0
- data/lib/instrumentality/profiler.rb +8 -6
- data/lib/instrumentality/simctl.rb +1 -1
- data/lib/instrumentality/version.rb +1 -1
- metadata +72 -24
- data/.travis.yml +0 -5
- data/lib/instrumentality/command/benchmark.rb +0 -61
- data/lib/instrumentality/command/file_activity.rb +0 -61
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4bd92f799a2dc113dda402dfe40d94334be2324f
|
4
|
+
data.tar.gz: 350759f37a462eab9c6a155c90a689945f3764a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0df7535151887c65cf1f89412f8419801cc731d71d7f43844e40200f117f2300cf853d648059b67950e02a46b074b3055d87c6ff7a8abbb912c72332e2703fbb
|
7
|
+
data.tar.gz: 013656bdb62c8d9295a797f1455dfa5b12e4a3465fe0f2dffc6ab76c22763339c3401be35a288bfe048607084db708987d25761668915128b16ebfde4b4a22e0
|
@@ -0,0 +1,12 @@
|
|
1
|
+
version: 2.0
|
2
|
+
jobs:
|
3
|
+
build:
|
4
|
+
docker:
|
5
|
+
- image: ruenzuo/instrumentality-circle-ci:latest
|
6
|
+
environment:
|
7
|
+
- COVERAGE: "YES"
|
8
|
+
steps:
|
9
|
+
- checkout
|
10
|
+
- run: gem install bundler
|
11
|
+
- run: bundle
|
12
|
+
- run: (/usr/local/bin/Finder.app &) && bundle exec rake spec
|
File without changes
|
File without changes
|
data/.coveralls.yml
ADDED
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Instrumentality
|
2
2
|
|
3
|
+
[](https://circleci.com/gh/Ruenzuo/instrumentality)
|
4
|
+
[](https://coveralls.io/github/Ruenzuo/instrumentality?branch=master)
|
5
|
+
|
3
6
|
Command line interface to profiling tools for iOS development
|
4
7
|
|
5
8
|
## Installation
|
data/instrumentality.gemspec
CHANGED
@@ -28,4 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_development_dependency "bundler", "~> 1.15"
|
29
29
|
spec.add_development_dependency "rake", "~> 10.0"
|
30
30
|
spec.add_development_dependency "rspec", "~> 3.0"
|
31
|
+
spec.add_development_dependency "pry-byebug", "~> 3.4"
|
32
|
+
spec.add_development_dependency "simplecov", "~> 0.15"
|
33
|
+
spec.add_development_dependency "coveralls", "~> 0.7.0"
|
31
34
|
end
|
@@ -3,10 +3,11 @@ require 'instrumentality/version'
|
|
3
3
|
|
4
4
|
module Instrumentality
|
5
5
|
class Command < CLAide::Command
|
6
|
-
require 'instrumentality/command/
|
7
|
-
require 'instrumentality/command/
|
6
|
+
require 'instrumentality/command/profile'
|
7
|
+
require 'instrumentality/command/profile/benchmark'
|
8
|
+
require 'instrumentality/command/profile/file_activity'
|
9
|
+
require 'instrumentality/command/profile/custom'
|
8
10
|
require 'instrumentality/command/generate_header'
|
9
|
-
require 'instrumentality/command/custom'
|
10
11
|
|
11
12
|
self.abstract_command = true
|
12
13
|
self.command = 'instr'
|
@@ -1,33 +1,15 @@
|
|
1
1
|
require 'instrumentality/command'
|
2
|
-
require 'instrumentality/finder'
|
3
|
-
require 'instrumentality/profiler'
|
4
|
-
require 'instrumentality/constants'
|
5
|
-
require 'ostruct'
|
6
2
|
|
7
3
|
module Instrumentality
|
8
|
-
class
|
9
|
-
|
10
|
-
[
|
11
|
-
['--workspace=path/to/name.xcworkspace', 'If not set, Instr will try to find one'],
|
12
|
-
['--project=path/to/name.xcodeproj', 'If not set and workspace search failed, Instr will try to find one'],
|
13
|
-
['--scheme=name', 'If not set, Instr will use the process name'],
|
14
|
-
['--server-port=port_number', 'If not set, Instr will use 8080'],
|
15
|
-
['--interactive', 'If set, Instr will not attempt to run an Xcode scheme, but instead attach DTrace directly'],
|
16
|
-
].concat(super)
|
17
|
-
end
|
4
|
+
class Profile < Command
|
5
|
+
self.abstract_command = true
|
18
6
|
|
19
|
-
self.
|
20
|
-
CLAide::Argument.new("process", true),
|
21
|
-
CLAide::Argument.new("script", true),
|
22
|
-
]
|
7
|
+
self.summary = "Run instruments"
|
23
8
|
|
24
|
-
|
25
|
-
Runs a DTrace script against a specific iOS process.
|
26
|
-
DESC
|
9
|
+
#-----#
|
27
10
|
|
28
11
|
def initialize(argv)
|
29
12
|
@process = argv.shift_argument
|
30
|
-
@script = argv.shift_argument
|
31
13
|
@workspace = argv.option('workspace') || Finder.find_workspace
|
32
14
|
@project = argv.option('project')
|
33
15
|
@project ||= Finder.find_project if @workspace.nil?
|
@@ -39,24 +21,29 @@ module Instrumentality
|
|
39
21
|
|
40
22
|
def validate!
|
41
23
|
super
|
24
|
+
end
|
42
25
|
|
26
|
+
def validate_shared_arguments!
|
43
27
|
help! 'A process name is required' unless @process
|
44
|
-
help! 'A valid script path is required' unless File.exist?(@script)
|
45
28
|
return if @interactive
|
46
29
|
help! 'Xcode workspace or project files not found' if @workspace.nil? && @project.nil?
|
47
30
|
end
|
48
31
|
|
49
|
-
def
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
32
|
+
def self.shared_arguments
|
33
|
+
[
|
34
|
+
CLAide::Argument.new("process", true),
|
35
|
+
]
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.shared_options
|
39
|
+
[
|
40
|
+
['--workspace=path/to/name.xcworkspace', 'If not set, Instr will try to find one'],
|
41
|
+
['--project=path/to/name.xcodeproj', 'If not set and workspace search failed, Instr will try to find one'],
|
42
|
+
['--scheme=name', 'If not set, Instr will use the process name'],
|
43
|
+
['--server-port=port_number', 'If not set, Instr will use 8080'],
|
44
|
+
['--interactive', 'If set, Instr will not attempt to run an Xcode scheme, but instead attach DTrace directly'],
|
45
|
+
]
|
60
46
|
end
|
61
47
|
end
|
62
48
|
end
|
49
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'instrumentality/command'
|
2
|
+
require 'instrumentality/finder'
|
3
|
+
require 'instrumentality/profiler'
|
4
|
+
require 'instrumentality/constants'
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
module Instrumentality
|
8
|
+
class Profile < Command
|
9
|
+
class Benchmark < Profile
|
10
|
+
def self.options
|
11
|
+
shared_options.concat([
|
12
|
+
['--experimental', "Don't use it if you don't know what it does"],
|
13
|
+
]).concat(super)
|
14
|
+
end
|
15
|
+
|
16
|
+
self.arguments = shared_arguments.concat([
|
17
|
+
])
|
18
|
+
|
19
|
+
self.summary = <<-DESC
|
20
|
+
Runs a benchmark against a specific iOS process. Requires static probes.
|
21
|
+
DESC
|
22
|
+
|
23
|
+
def initialize(argv)
|
24
|
+
@experimental = argv.flag?('experimental', false)
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate!
|
29
|
+
super
|
30
|
+
validate_shared_arguments!
|
31
|
+
end
|
32
|
+
|
33
|
+
def run
|
34
|
+
config = OpenStruct.new({'script' => Constants::BENCHMARK_SCRIPT,
|
35
|
+
'process' => @process,
|
36
|
+
'workspace' => @workspace,
|
37
|
+
'project' => @project,
|
38
|
+
'scheme' => @scheme,
|
39
|
+
'server_port' => @server_port,
|
40
|
+
'interactive' => @interactive,
|
41
|
+
'experimental' => @experimental})
|
42
|
+
profiler = Profiler.new(config, @verbose)
|
43
|
+
profiler.profile
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'instrumentality/command'
|
2
|
+
require 'instrumentality/finder'
|
3
|
+
require 'instrumentality/profiler'
|
4
|
+
require 'instrumentality/constants'
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
module Instrumentality
|
8
|
+
class Profile < Command
|
9
|
+
class Custom < Profile
|
10
|
+
def self.options
|
11
|
+
shared_options.concat([
|
12
|
+
]).concat(super)
|
13
|
+
end
|
14
|
+
|
15
|
+
self.arguments = shared_arguments.concat([
|
16
|
+
CLAide::Argument.new("script", true),
|
17
|
+
])
|
18
|
+
|
19
|
+
self.summary = <<-DESC
|
20
|
+
Runs a DTrace script against a specific iOS process.
|
21
|
+
DESC
|
22
|
+
|
23
|
+
def initialize(argv)
|
24
|
+
super
|
25
|
+
@script = argv.shift_argument
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate!
|
29
|
+
super
|
30
|
+
validate_shared_arguments!
|
31
|
+
end
|
32
|
+
|
33
|
+
def run
|
34
|
+
config = OpenStruct.new({'script' => @script,
|
35
|
+
'process' => @process,
|
36
|
+
'workspace' => @workspace,
|
37
|
+
'project' => @project,
|
38
|
+
'scheme' => @scheme,
|
39
|
+
'server_port' => @server_port,
|
40
|
+
'interactive' => @interactive,
|
41
|
+
'experimental' => false})
|
42
|
+
profiler = Profiler.new(config, @verbose)
|
43
|
+
profiler.profile
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'instrumentality/command'
|
2
|
+
require 'instrumentality/finder'
|
3
|
+
require 'instrumentality/profiler'
|
4
|
+
require 'instrumentality/constants'
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
module Instrumentality
|
8
|
+
class Profile < Command
|
9
|
+
class FileActivity < Profile
|
10
|
+
def self.options
|
11
|
+
shared_options.concat([
|
12
|
+
['--experimental', "Don't use it if you don't know what it does"],
|
13
|
+
]).concat(super)
|
14
|
+
end
|
15
|
+
|
16
|
+
self.arguments = shared_arguments.concat([
|
17
|
+
])
|
18
|
+
|
19
|
+
self.summary = <<-DESC
|
20
|
+
Prints files read or write by a specific iOS process.
|
21
|
+
DESC
|
22
|
+
|
23
|
+
def initialize(argv)
|
24
|
+
@experimental = argv.flag?('experimental', false)
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate!
|
29
|
+
super
|
30
|
+
validate_shared_arguments!
|
31
|
+
end
|
32
|
+
|
33
|
+
def run
|
34
|
+
config = OpenStruct.new({'script' => Constants::FILE_ACTIVITY_SCRIPT,
|
35
|
+
'process' => @process,
|
36
|
+
'workspace' => @workspace,
|
37
|
+
'project' => @project,
|
38
|
+
'scheme' => @scheme,
|
39
|
+
'server_port' => @server_port,
|
40
|
+
'interactive' => @interactive,
|
41
|
+
'experimental' => @experimental})
|
42
|
+
profiler = Profiler.new(config, @verbose)
|
43
|
+
profiler.profile
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'instrumentality/
|
1
|
+
require 'instrumentality/logger'
|
2
2
|
require 'claide'
|
3
3
|
require 'colorize'
|
4
4
|
require 'timeout'
|
@@ -8,7 +8,7 @@ module Instrumentality
|
|
8
8
|
class ExecutorError < StandardError; include CLAide::InformativeError; end
|
9
9
|
|
10
10
|
def self.execute(cmd, verbose = false)
|
11
|
-
|
11
|
+
Logger.log("Executing command: #{cmd}")
|
12
12
|
if verbose
|
13
13
|
system(cmd)
|
14
14
|
else
|
@@ -19,21 +19,25 @@ module Instrumentality
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.execute_async(cmd)
|
22
|
-
spawn("#{cmd}").tap do |pid|
|
23
|
-
|
22
|
+
Process.spawn("#{cmd}").tap do |pid|
|
23
|
+
Logger.log("Spawned process (PID: #{pid}) from command: #{cmd}")
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.timeout(process, seconds = Constants::TIMEOUT)
|
28
28
|
pid = ""
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
begin
|
30
|
+
Timeout.timeout(seconds) do
|
31
|
+
loop do
|
32
|
+
pid = `ps aux | grep #{process}.app | grep -v grep | awk '{print $2}'`.strip
|
33
|
+
break if pid != ""
|
34
|
+
end
|
33
35
|
end
|
36
|
+
rescue Timeout::Error
|
37
|
+
raise ExecutorError, "Timeout while trying to find #{process} process".red
|
34
38
|
end
|
35
39
|
pid.tap do |pid|
|
36
|
-
|
40
|
+
Logger.log("Found process #{process} with PID: #{pid}")
|
37
41
|
end
|
38
42
|
end
|
39
43
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Instrumentality
|
2
2
|
class Finder
|
3
3
|
def self.find_workspace
|
4
|
-
find('*.xcworkspace',
|
4
|
+
find('*.xcworkspace', 2).first
|
5
5
|
end
|
6
6
|
|
7
7
|
def self.find_project
|
8
|
-
find('*.xcodeproj',
|
8
|
+
find('*.xcodeproj', 2).first
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.find_xctestrun(location)
|
@@ -1,19 +1,24 @@
|
|
1
1
|
require 'instrumentality/executor'
|
2
2
|
require 'instrumentality/finder'
|
3
3
|
require 'instrumentality/constants'
|
4
|
+
require 'claide'
|
5
|
+
require 'colorize'
|
4
6
|
|
5
7
|
module Instrumentality
|
6
8
|
class HeaderGenerator
|
9
|
+
class HeaderGeneratorError < StandardError; include CLAide::InformativeError; end
|
7
10
|
attr_reader :instrument, :verbose
|
8
11
|
|
9
|
-
def initialize(instrument, verbose)
|
12
|
+
def initialize(instrument, verbose = false)
|
10
13
|
@instrument = instrument
|
11
14
|
@verbose = verbose
|
12
15
|
end
|
13
16
|
|
14
17
|
def generate
|
18
|
+
path_for_header = Finder.path_for_header("#{instrument}.d")
|
19
|
+
raise HeaderGeneratorError, "Couldn't find header for #{instrument} instrument".red unless File.exist?(path_for_header)
|
15
20
|
dtrace_cmd = %w[dtrace]
|
16
|
-
dtrace_cmd += %W[-h -s #{
|
21
|
+
dtrace_cmd += %W[-h -s #{path_for_header}]
|
17
22
|
cmd = dtrace_cmd.join(' ')
|
18
23
|
Executor.execute(cmd, verbose)
|
19
24
|
end
|
@@ -2,8 +2,10 @@ require 'instrumentality/executor'
|
|
2
2
|
require 'instrumentality/finder'
|
3
3
|
require 'instrumentality/constants'
|
4
4
|
require 'instrumentality/simctl'
|
5
|
+
require 'instrumentality/logger'
|
5
6
|
require 'net/http'
|
6
7
|
require 'uri'
|
8
|
+
require 'tmpdir'
|
7
9
|
|
8
10
|
module Instrumentality
|
9
11
|
class Profiler
|
@@ -11,7 +13,7 @@ module Instrumentality
|
|
11
13
|
class ProfilerError < StandardError; include CLAide::InformativeError; end
|
12
14
|
attr_reader :config, :script_path, :verbose, :xcodebuild_pid, :app_pid, :dtrace_pid
|
13
15
|
|
14
|
-
def initialize(config, verbose)
|
16
|
+
def initialize(config, verbose = false)
|
15
17
|
@config = config
|
16
18
|
@verbose = verbose
|
17
19
|
script = config.script.dup
|
@@ -25,8 +27,8 @@ module Instrumentality
|
|
25
27
|
current_directory = Dir.pwd
|
26
28
|
Dir.mktmpdir do |tmpdir|
|
27
29
|
compile(current_directory, tmpdir)
|
28
|
-
Simctl.execute_with_simulator_ready(Constants::DEFAULT_RUNTIME, Constants::DEFAULT_DEVICE) do |
|
29
|
-
run_tests(tmpdir,
|
30
|
+
Simctl.execute_with_simulator_ready(Constants::DEFAULT_RUNTIME, Constants::DEFAULT_DEVICE) do |device_udid|
|
31
|
+
run_tests(tmpdir, device_udid)
|
30
32
|
find_app_pid
|
31
33
|
notify_server
|
32
34
|
attach_dtrace(tmpdir)
|
@@ -59,11 +61,11 @@ module Instrumentality
|
|
59
61
|
Executor.execute(cmd, verbose)
|
60
62
|
end
|
61
63
|
|
62
|
-
def run_tests(temporary_directory,
|
64
|
+
def run_tests(temporary_directory, device_udid)
|
63
65
|
xctestrun = Finder.find_xctestrun(temporary_directory)
|
64
66
|
xcodebuild_cmd = %w[xcodebuild]
|
65
67
|
xcodebuild_cmd += %W[-xctestrun #{xctestrun}]
|
66
|
-
xcodebuild_cmd += %W[-destination 'platform=iOS Simulator,id=#{
|
68
|
+
xcodebuild_cmd += %W[-destination 'platform=iOS Simulator,id=#{device_udid}']
|
67
69
|
xcodebuild_cmd += %w[test-without-building]
|
68
70
|
cmd = xcodebuild_cmd.join(' ')
|
69
71
|
@xcodebuild_pid = Executor.execute_async(cmd)
|
@@ -116,7 +118,7 @@ module Instrumentality
|
|
116
118
|
cmd = touch_cmd.join(' ')
|
117
119
|
Executor.execute(cmd, verbose)
|
118
120
|
stream = IO.new(IO.sysopen(output_file))
|
119
|
-
|
121
|
+
Logger.log("Started interactive session. #{"Press CTRL+C to finish.".blue}")
|
120
122
|
begin
|
121
123
|
loop do
|
122
124
|
output = stream.gets
|
metadata
CHANGED
@@ -1,99 +1,141 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: instrumentality
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Renzo Crisóstomo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: claide
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 1.0.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.0.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: colorize
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 0.8.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.8.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: simctl
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 1.6.2
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 1.6.2
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.15'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.15'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '10.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '10.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ~>
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '3.0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ~>
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry-byebug
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.4'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.4'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.15'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ~>
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.15'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: coveralls
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ~>
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.7.0
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ~>
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.7.0
|
97
139
|
description: Command line interface to profiling tools for iOS development
|
98
140
|
email:
|
99
141
|
- renzo.crisostomo@here.com
|
@@ -103,9 +145,14 @@ executables:
|
|
103
145
|
extensions: []
|
104
146
|
extra_rdoc_files: []
|
105
147
|
files:
|
106
|
-
-
|
107
|
-
-
|
108
|
-
-
|
148
|
+
- .circleci/config.yml
|
149
|
+
- .circleci/images/Dockerfile
|
150
|
+
- .circleci/images/Finder.app
|
151
|
+
- .circleci/images/xcode-select
|
152
|
+
- .circleci/images/xcodebuild
|
153
|
+
- .coveralls.yml
|
154
|
+
- .gitignore
|
155
|
+
- .rspec
|
109
156
|
- Gemfile
|
110
157
|
- LICENSE.txt
|
111
158
|
- README.md
|
@@ -115,15 +162,17 @@ files:
|
|
115
162
|
- instrumentality.gemspec
|
116
163
|
- lib/instrumentality.rb
|
117
164
|
- lib/instrumentality/command.rb
|
118
|
-
- lib/instrumentality/command/benchmark.rb
|
119
|
-
- lib/instrumentality/command/custom.rb
|
120
|
-
- lib/instrumentality/command/file_activity.rb
|
121
165
|
- lib/instrumentality/command/generate_header.rb
|
166
|
+
- lib/instrumentality/command/profile.rb
|
167
|
+
- lib/instrumentality/command/profile/benchmark.rb
|
168
|
+
- lib/instrumentality/command/profile/custom.rb
|
169
|
+
- lib/instrumentality/command/profile/file_activity.rb
|
122
170
|
- lib/instrumentality/constants.rb
|
123
171
|
- lib/instrumentality/executor.rb
|
124
172
|
- lib/instrumentality/finder.rb
|
125
173
|
- lib/instrumentality/header_generator.rb
|
126
174
|
- lib/instrumentality/headers/benchmark.d
|
175
|
+
- lib/instrumentality/logger.rb
|
127
176
|
- lib/instrumentality/profiler.rb
|
128
177
|
- lib/instrumentality/scripts/benchmark.d
|
129
178
|
- lib/instrumentality/scripts/experimental_file_activity.d
|
@@ -140,19 +189,18 @@ require_paths:
|
|
140
189
|
- lib
|
141
190
|
required_ruby_version: !ruby/object:Gem::Requirement
|
142
191
|
requirements:
|
143
|
-
- -
|
192
|
+
- - '>='
|
144
193
|
- !ruby/object:Gem::Version
|
145
194
|
version: '0'
|
146
195
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
196
|
requirements:
|
148
|
-
- -
|
197
|
+
- - '>='
|
149
198
|
- !ruby/object:Gem::Version
|
150
199
|
version: '0'
|
151
200
|
requirements: []
|
152
201
|
rubyforge_project:
|
153
|
-
rubygems_version: 2.
|
202
|
+
rubygems_version: 2.0.14.1
|
154
203
|
signing_key:
|
155
204
|
specification_version: 4
|
156
205
|
summary: Command line interface to profiling tools for iOS development
|
157
206
|
test_files: []
|
158
|
-
has_rdoc:
|
data/.travis.yml
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'instrumentality/command'
|
2
|
-
require 'instrumentality/finder'
|
3
|
-
require 'instrumentality/profiler'
|
4
|
-
require 'instrumentality/constants'
|
5
|
-
require 'ostruct'
|
6
|
-
|
7
|
-
module Instrumentality
|
8
|
-
class Benchmark < Command
|
9
|
-
def self.options
|
10
|
-
[
|
11
|
-
['--workspace=path/to/name.xcworkspace', 'If not set, Instr will try to find one'],
|
12
|
-
['--project=path/to/name.xcodeproj', 'If not set and workspace search failed, Instr will try to find one'],
|
13
|
-
['--scheme=name', 'If not set, Instr will use the process name'],
|
14
|
-
['--server-port=port_number', 'If not set, Instr will use 8080'],
|
15
|
-
['--interactive', 'If set, Instr will not attempt to run an Xcode scheme, but instead attach DTrace directly'],
|
16
|
-
['--experimental', "Don't use it if you don't know what it does"],
|
17
|
-
].concat(super)
|
18
|
-
end
|
19
|
-
|
20
|
-
self.arguments = [
|
21
|
-
CLAide::Argument.new("process", true),
|
22
|
-
]
|
23
|
-
|
24
|
-
self.summary = <<-DESC
|
25
|
-
Runs a benchmark against a specific iOS process. Requires static probes.
|
26
|
-
DESC
|
27
|
-
|
28
|
-
def initialize(argv)
|
29
|
-
@process = argv.shift_argument
|
30
|
-
@workspace = argv.option('workspace') || Finder.find_workspace
|
31
|
-
@project = argv.option('project')
|
32
|
-
@project ||= Finder.find_project if @workspace.nil?
|
33
|
-
@scheme = argv.option('scheme') || @process
|
34
|
-
@server_port = argv.option('server-port') || Constants::DEFAULT_SERVER_PORT
|
35
|
-
@interactive = argv.flag?('interactive', false)
|
36
|
-
@experimental = argv.flag?('experimental', false)
|
37
|
-
super
|
38
|
-
end
|
39
|
-
|
40
|
-
def validate!
|
41
|
-
super
|
42
|
-
|
43
|
-
help! 'A process name is required' unless @process
|
44
|
-
return if @interactive
|
45
|
-
help! 'Xcode workspace or project files not found' if @workspace.nil? && @project.nil?
|
46
|
-
end
|
47
|
-
|
48
|
-
def run
|
49
|
-
config = OpenStruct.new({'script' => Constants::BENCHMARK_SCRIPT,
|
50
|
-
'process' => @process,
|
51
|
-
'workspace' => @workspace,
|
52
|
-
'project' => @project,
|
53
|
-
'scheme' => @scheme,
|
54
|
-
'server_port' => @server_port,
|
55
|
-
'interactive' => @interactive,
|
56
|
-
'experimental' => @experimental})
|
57
|
-
profiler = Profiler.new(config, @verbose)
|
58
|
-
profiler.profile
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'instrumentality/command'
|
2
|
-
require 'instrumentality/finder'
|
3
|
-
require 'instrumentality/profiler'
|
4
|
-
require 'instrumentality/constants'
|
5
|
-
require 'ostruct'
|
6
|
-
|
7
|
-
module Instrumentality
|
8
|
-
class FileActivity < Command
|
9
|
-
def self.options
|
10
|
-
[
|
11
|
-
['--workspace=path/to/name.xcworkspace', 'If not set, Instr will try to find one'],
|
12
|
-
['--project=path/to/name.xcodeproj', 'If not set and workspace search failed, Instr will try to find one'],
|
13
|
-
['--scheme=name', 'If not set, Instr will use the process name'],
|
14
|
-
['--server-port=port_number', 'If not set, Instr will use 8080'],
|
15
|
-
['--interactive', 'If set, Instr will not attempt to run an Xcode scheme, but instead attach DTrace directly'],
|
16
|
-
['--experimental', "Don't use it if you don't know what it does"],
|
17
|
-
].concat(super)
|
18
|
-
end
|
19
|
-
|
20
|
-
self.arguments = [
|
21
|
-
CLAide::Argument.new("process", true),
|
22
|
-
]
|
23
|
-
|
24
|
-
self.summary = <<-DESC
|
25
|
-
Prints files read or write by a specific iOS process.
|
26
|
-
DESC
|
27
|
-
|
28
|
-
def initialize(argv)
|
29
|
-
@process = argv.shift_argument
|
30
|
-
@workspace = argv.option('workspace') || Finder.find_workspace
|
31
|
-
@project = argv.option('project')
|
32
|
-
@project ||= Finder.find_project if @workspace.nil?
|
33
|
-
@scheme = argv.option('scheme') || @process
|
34
|
-
@server_port = argv.option('server-port') || Constants::DEFAULT_SERVER_PORT
|
35
|
-
@interactive = argv.flag?('interactive', false)
|
36
|
-
@experimental = argv.flag?('experimental', false)
|
37
|
-
super
|
38
|
-
end
|
39
|
-
|
40
|
-
def validate!
|
41
|
-
super
|
42
|
-
|
43
|
-
help! 'A process name is required' unless @process
|
44
|
-
return if @interactive
|
45
|
-
help! 'Xcode workspace or project files not found' if @workspace.nil? && @project.nil?
|
46
|
-
end
|
47
|
-
|
48
|
-
def run
|
49
|
-
config = OpenStruct.new({'script' => Constants::FILE_ACTIVITY_SCRIPT,
|
50
|
-
'process' => @process,
|
51
|
-
'workspace' => @workspace,
|
52
|
-
'project' => @project,
|
53
|
-
'scheme' => @scheme,
|
54
|
-
'server_port' => @server_port,
|
55
|
-
'interactive' => @interactive,
|
56
|
-
'experimental' => @experimental})
|
57
|
-
profiler = Profiler.new(config, @verbose)
|
58
|
-
profiler.profile
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|