guardian-angel 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ga_configuration.rb +33 -2
- data/lib/ga_loader.rb +63 -11
- data/lib/ga_runner.rb +5 -14
- data/lib/guardian_angel.rb +4 -9
- data/lib/xctool_runner.rb +81 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e8a07cc9d415e7805881f31d56576a065f0b0ae
|
4
|
+
data.tar.gz: 60e6055cda8f7621571eca4ba028883553eff487
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 757379efb86edd265634fafbe27d69574c9ee4aae22235e116d433dfa9f1ceaf6ab8f72b3a504cbd4027785f4bd785b69749e1b9e9bdc90b395e1d0a5de8ad15
|
7
|
+
data.tar.gz: f2135736d1d9760211d793a552b776ba3fc0b19e5690e16ba54d4e8b1968ade9c6dba6f1224aaf1e3781046eae7067435a16e75a4b15a59db05c2092cd2d4b92
|
data/lib/ga_configuration.rb
CHANGED
@@ -6,13 +6,23 @@ class GAConfiguration
|
|
6
6
|
GAConfigurationSuffix = "suffix"
|
7
7
|
GAConfigurationReporter = "reporter"
|
8
8
|
GAConfigurationXctoolPath = "xctool"
|
9
|
+
GAConfigurationProject = "project"
|
10
|
+
|
11
|
+
GAConfigurationDefaultReporter = "pretty"
|
12
|
+
GAConfigurationDefaultXctoolPath = "xctool"
|
13
|
+
GAConfigurationDefaultSuffix = "Test"
|
9
14
|
|
10
15
|
# @return the configured xcode scheme
|
11
16
|
def scheme
|
12
17
|
@scheme
|
13
18
|
end
|
14
19
|
|
15
|
-
# @return the configured xcode
|
20
|
+
# @return the configured xcode project, if not using workspaces
|
21
|
+
def project
|
22
|
+
@project
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return the configured xcode workspace, if not using projects
|
16
26
|
def workspace
|
17
27
|
@workspace
|
18
28
|
end
|
@@ -46,12 +56,29 @@ class GAConfiguration
|
|
46
56
|
GAConfigurationTarget => @target,
|
47
57
|
GAConfigurationSuffix => @suffix,
|
48
58
|
GAConfigurationReporter => @reporter,
|
49
|
-
GAConfigurationXctoolPath => @xctool_path
|
59
|
+
GAConfigurationXctoolPath => @xctool_path,
|
60
|
+
GAConfigurationProject => @project
|
50
61
|
}
|
51
62
|
|
52
63
|
return hashForOutput.to_s
|
53
64
|
end
|
54
65
|
|
66
|
+
# Creates a sample GAConfiguration instance to instruct the user
|
67
|
+
#
|
68
|
+
# @return [GAConfiguration] an instance that should not be used apart from outputting on the console
|
69
|
+
def self.sample
|
70
|
+
sample = GAConfiguration.new({
|
71
|
+
GAConfigurationWorkspace => 'MyProject',
|
72
|
+
GAConfigurationScheme => 'MyProject-Dev',
|
73
|
+
GAConfigurationTarget => 'MyProjectTests',
|
74
|
+
GAConfigurationSuffix => GAConfigurationDefaultSuffix,
|
75
|
+
GAConfigurationReporter => GAConfigurationDefaultReporter,
|
76
|
+
GAConfigurationXctoolPath => GAConfigurationDefaultXctoolPath
|
77
|
+
})
|
78
|
+
|
79
|
+
return sample
|
80
|
+
end
|
81
|
+
|
55
82
|
# Creates an instance with the given configuration, or uses a default one if not provided
|
56
83
|
# @param configuration [GAConfiguration]
|
57
84
|
#
|
@@ -63,6 +90,7 @@ class GAConfiguration
|
|
63
90
|
@suffix = configuration[GAConfigurationSuffix]
|
64
91
|
@reporter = configuration[GAConfigurationReporter]
|
65
92
|
@xctool_path = configuration[GAConfigurationXctoolPath]
|
93
|
+
@project = configuration[GAConfigurationProject]
|
66
94
|
end
|
67
95
|
|
68
96
|
# Merges two GAConfiguration instances
|
@@ -88,6 +116,9 @@ class GAConfiguration
|
|
88
116
|
unless other.xctool_path.nil?
|
89
117
|
@xctool_path = other.xctool_path
|
90
118
|
end
|
119
|
+
unless other.project.nil?
|
120
|
+
@project = other.project
|
121
|
+
end
|
91
122
|
|
92
123
|
return self
|
93
124
|
end
|
data/lib/ga_loader.rb
CHANGED
@@ -12,8 +12,6 @@ class GALoader
|
|
12
12
|
# @note this also outputs the final GAConfiguration built on the console
|
13
13
|
# (see #GAConfiguration)
|
14
14
|
def self.readConfiguration()
|
15
|
-
GALogger.log("Reading #{CONFIG_FILENAME}...")
|
16
|
-
|
17
15
|
configuration = GAConfiguration.new
|
18
16
|
|
19
17
|
begin
|
@@ -21,8 +19,6 @@ class GALoader
|
|
21
19
|
configurationMerge = GAConfiguration.new(jsonDictionary)
|
22
20
|
configuration = configuration.merge(configurationMerge)
|
23
21
|
rescue
|
24
|
-
#Find workspace, scheme and target
|
25
|
-
#merge and return
|
26
22
|
GALogger.log("#{CONFIG_FILENAME} not found, using defaults", :Warning)
|
27
23
|
end
|
28
24
|
|
@@ -32,23 +28,72 @@ class GALoader
|
|
32
28
|
return configuration
|
33
29
|
end
|
34
30
|
|
31
|
+
# Returns a possible workspace, in case one is not provided in the configuration
|
32
|
+
#
|
33
|
+
# @note this searches only in the current directory
|
34
|
+
def self.findWorkspace
|
35
|
+
workspace = value = `find . -maxdepth 1 -name '*.xcworkspace'`
|
36
|
+
return nil if workspace.empty?
|
37
|
+
|
38
|
+
return File.basename(workspace, ".*")
|
39
|
+
end
|
40
|
+
|
35
41
|
# Validates a given configuration
|
36
42
|
#
|
37
43
|
# @param configuration [GAConfiguration] the configuration to validate
|
38
|
-
# @note required
|
44
|
+
# @note required attribute is workspace/project
|
45
|
+
# @note if scheme is not specified, the same as the workspace/project will be used
|
46
|
+
# @note if target is not specified, '{workspace|project}Tests' will be used
|
39
47
|
# @note the method will also make sure that the configured xctool executable can be found, or aborts otherwise
|
40
48
|
def self.validateConfiguration(configuration)
|
41
49
|
if configuration.workspace.nil?
|
42
|
-
|
43
|
-
|
50
|
+
possibleWorkspace = findWorkspace()
|
51
|
+
|
52
|
+
if !possibleWorkspace
|
53
|
+
if configuration.project.nil?
|
54
|
+
GALogger.log("workspace or project was not specified, exiting", :Error)
|
55
|
+
outputSampleConfiguration()
|
56
|
+
abort
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
configurationMerge = GAConfiguration.new(GAConfiguration::GAConfigurationWorkspace => possibleWorkspace)
|
61
|
+
configuration = configuration.merge(configurationMerge)
|
44
62
|
end
|
63
|
+
|
45
64
|
if configuration.scheme.nil?
|
46
|
-
|
47
|
-
|
65
|
+
configurationMerge = nil
|
66
|
+
|
67
|
+
unless configuration.project.nil?
|
68
|
+
configurationMerge = GAConfiguration.new(GAConfiguration::GAConfigurationScheme => configuration.project)
|
69
|
+
end
|
70
|
+
unless configuration.workspace.nil?
|
71
|
+
configurationMerge = GAConfiguration.new(GAConfiguration::GAConfigurationScheme => configuration.workspace)
|
72
|
+
end
|
73
|
+
|
74
|
+
if configurationMerge.nil?
|
75
|
+
GALogger.log("scheme was not specified, exiting", :Error)
|
76
|
+
outputSampleConfiguration()
|
77
|
+
abort
|
78
|
+
else
|
79
|
+
configuration = configuration.merge(configurationMerge)
|
80
|
+
end
|
48
81
|
end
|
82
|
+
|
49
83
|
if configuration.target.nil?
|
50
|
-
|
51
|
-
|
84
|
+
configurationMerge = nil
|
85
|
+
|
86
|
+
unless configuration.scheme.nil?
|
87
|
+
configurationMerge = GAConfiguration.new(GAConfiguration::GAConfigurationTarget => configuration.scheme + 'Tests')
|
88
|
+
end
|
89
|
+
|
90
|
+
if configurationMerge.nil?
|
91
|
+
GALogger.log("target was not specified, exiting", :Error)
|
92
|
+
outputSampleConfiguration()
|
93
|
+
abort
|
94
|
+
else
|
95
|
+
configuration = configuration.merge(configurationMerge)
|
96
|
+
end
|
52
97
|
end
|
53
98
|
|
54
99
|
xctoolExists = system("which #{configuration.xctool_path} > /dev/null")
|
@@ -58,6 +103,13 @@ class GALoader
|
|
58
103
|
end
|
59
104
|
end
|
60
105
|
|
106
|
+
# Outputs a sample configuration to let the user know how to create a valid one
|
107
|
+
#
|
108
|
+
# (see #GAConfiguration)
|
109
|
+
def self.outputSampleConfiguration()
|
110
|
+
GALogger.log('Sample configuration JSON: ' + GAConfiguration.sample.to_s, :Warning)
|
111
|
+
end
|
112
|
+
|
61
113
|
# Outputs a given configuration on the console
|
62
114
|
#
|
63
115
|
# @param [GAConfiguration] the configuration you want to print
|
data/lib/ga_runner.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'ga_logger'
|
2
2
|
require 'guardian_angel'
|
3
|
+
require 'xctool_runner'
|
3
4
|
|
4
5
|
# @author Vittorio Monaco
|
5
6
|
class GARunner
|
@@ -11,6 +12,7 @@ class GARunner
|
|
11
12
|
def initialize(configuration, filename)
|
12
13
|
@configuration=configuration
|
13
14
|
@filename=filename
|
15
|
+
@runner=XctoolRunner.new(configuration)
|
14
16
|
end
|
15
17
|
|
16
18
|
# Runs unit tests for the given filename, if a tests file exists
|
@@ -19,26 +21,15 @@ class GARunner
|
|
19
21
|
# @note filename must be a code file, not a tests file. If you're not sure whether the file is a tests file or not, use #test instead
|
20
22
|
# @note if a corresponding tests file cannot be found, outputs a warning line
|
21
23
|
def testIfAvailable(filename)
|
22
|
-
workspace = @configuration.workspace
|
23
|
-
scheme = @configuration.scheme
|
24
|
-
target = @configuration.target
|
25
24
|
suffix = @configuration.suffix
|
26
|
-
reporter = @configuration.reporter
|
27
|
-
xctool = @configuration.xctool_path
|
28
25
|
|
29
|
-
fileExists = system(
|
26
|
+
fileExists = system("find . | grep '" + filename + suffix + "' > /dev/null")
|
30
27
|
if !fileExists
|
31
|
-
GALogger.log(filename + " doesn't seem to have associated tests. You
|
28
|
+
GALogger.log(filename + " doesn't seem to have associated tests. You should think about creating some.", :Warning)
|
32
29
|
return
|
33
30
|
end
|
34
31
|
|
35
|
-
|
36
|
-
system(xctool + ' -workspace -workspace ' + workspace + '.xcworkspace' +
|
37
|
-
' -scheme ' + scheme +
|
38
|
-
' -sdk iphonesimulator' +
|
39
|
-
' run-tests' +
|
40
|
-
' -reporter ' + reporter
|
41
|
-
' only ' + target + ':' + filename + suffix, out: $stdout, err: :out)
|
32
|
+
@runner.test(filename)
|
42
33
|
end
|
43
34
|
|
44
35
|
# Tries to run unit tests for the filename setup during initialization
|
data/lib/guardian_angel.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'ga_logger'
|
2
|
+
require 'xctool_runner'
|
2
3
|
|
3
4
|
# @author Vittorio Monaco
|
4
5
|
class GuardianAngel
|
@@ -7,6 +8,7 @@ class GuardianAngel
|
|
7
8
|
# @param configuration [GAConfiguration] the configuration you want to use to run the tests (see #GAConfiguration)
|
8
9
|
def initialize(configuration)
|
9
10
|
@configuration=configuration
|
11
|
+
@runner=XctoolRunner.new(configuration)
|
10
12
|
end
|
11
13
|
|
12
14
|
# Convenience method to build tests in a stand-alone fashion
|
@@ -19,17 +21,10 @@ class GuardianAngel
|
|
19
21
|
|
20
22
|
# Builds the tests target through xctool
|
21
23
|
#
|
24
|
+
# (see #XctoolRunner)
|
22
25
|
# @note a configuration must be already setup for this method to work
|
23
26
|
def buildTests()
|
24
|
-
|
25
|
-
scheme = @configuration.scheme
|
26
|
-
xctool = @configuration.xctool_path
|
27
|
-
|
28
|
-
GALogger.log("Building workspace " + workspace + " with scheme " + scheme + "...")
|
29
|
-
system(xctool + ' -workspace ' + workspace + '.xcworkspace' +
|
30
|
-
' -scheme ' + scheme +
|
31
|
-
' -sdk iphonesimulator' +
|
32
|
-
' build-tests', out: $stdout, err: :out)
|
27
|
+
@runner.build()
|
33
28
|
end
|
34
29
|
|
35
30
|
# Starts watching for changes to .m or .swift files in the caller directory
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'ga_logger'
|
2
|
+
|
3
|
+
# @author Vittorio Monaco
|
4
|
+
class XctoolRunner
|
5
|
+
# Creates a new instance given a GAConfiguration object
|
6
|
+
#
|
7
|
+
# @param configuration [GAConfiguration] the configuration you want to use to build and run the tests (see #GAConfiguration)
|
8
|
+
def initialize(configuration)
|
9
|
+
@configuration=configuration
|
10
|
+
end
|
11
|
+
|
12
|
+
# Builds the tests target through xctool
|
13
|
+
#
|
14
|
+
# @note This method supports both workspace- and project-based environments
|
15
|
+
def build()
|
16
|
+
workspace = @configuration.workspace
|
17
|
+
scheme = @configuration.scheme
|
18
|
+
target = @configuration.target
|
19
|
+
project = @configuration.project
|
20
|
+
xctool = @configuration.xctool_path
|
21
|
+
|
22
|
+
building = workspace
|
23
|
+
if workspace.nil?
|
24
|
+
building = project
|
25
|
+
end
|
26
|
+
|
27
|
+
GALogger.log("Building " + building + " with scheme " + scheme + "...")
|
28
|
+
|
29
|
+
toBuild = buildArgument()
|
30
|
+
system(xctool + toBuild +
|
31
|
+
' -scheme ' + scheme +
|
32
|
+
' -sdk iphonesimulator' +
|
33
|
+
' build-tests', out: $stdout, err: :out)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns the main argument for xctool to build the project/workspace
|
37
|
+
#
|
38
|
+
# Example:
|
39
|
+
# -workspace 'MyWorkspace.xcworkspace'
|
40
|
+
# or
|
41
|
+
# -project 'MyProject.xcodeproj'
|
42
|
+
def buildArgument()
|
43
|
+
workspace = @configuration.workspace
|
44
|
+
scheme = @configuration.scheme
|
45
|
+
project = @configuration.project
|
46
|
+
|
47
|
+
toBuild = ''
|
48
|
+
|
49
|
+
if workspace.nil?
|
50
|
+
toBuild = " -project '" + project + ".xcodeproj'"
|
51
|
+
else
|
52
|
+
toBuild = " -workspace '" + workspace + ".xcworkspace'"
|
53
|
+
end
|
54
|
+
|
55
|
+
return toBuild
|
56
|
+
end
|
57
|
+
|
58
|
+
# Runs tests for the specified file
|
59
|
+
#
|
60
|
+
# @param filename [String] the file you wish to run the tests for
|
61
|
+
# @note This method supports both workspace- and project-based environments
|
62
|
+
def test(filename)
|
63
|
+
workspace = @configuration.workspace
|
64
|
+
scheme = @configuration.scheme
|
65
|
+
target = @configuration.target
|
66
|
+
project = @configuration.project
|
67
|
+
xctool = @configuration.xctool_path
|
68
|
+
reporter = @configuration.reporter
|
69
|
+
suffix = @configuration.suffix
|
70
|
+
|
71
|
+
GALogger.log("Running tests for file " + filename + '...')
|
72
|
+
|
73
|
+
toBuild = buildArgument()
|
74
|
+
system(xctool + toBuild +
|
75
|
+
' -scheme ' + scheme +
|
76
|
+
' -sdk iphonesimulator' +
|
77
|
+
' run-tests' +
|
78
|
+
' only ' + target + ':' + filename + suffix +
|
79
|
+
' -reporter ' + reporter, out: $stdout, err: :out)
|
80
|
+
end
|
81
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: guardian-angel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vittorio Monaco
|
@@ -38,7 +38,7 @@ dependencies:
|
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.8'
|
41
|
-
description: A file watcher that runs tests for the modified files
|
41
|
+
description: A file watcher for iOS developers that runs tests for the modified files
|
42
42
|
email: vittorio.monaco1@gmail.com
|
43
43
|
executables:
|
44
44
|
- guardian-angel
|
@@ -53,7 +53,8 @@ files:
|
|
53
53
|
- lib/ga_logger.rb
|
54
54
|
- lib/ga_runner.rb
|
55
55
|
- lib/guardian_angel.rb
|
56
|
-
|
56
|
+
- lib/xctool_runner.rb
|
57
|
+
homepage: http://vittoriomonaco.it/guardian-angel
|
57
58
|
licenses:
|
58
59
|
- MIT
|
59
60
|
metadata: {}
|