mayday 0.0.1
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 +7 -0
- data/.gitignore +46 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +80 -0
- data/Rakefile +2 -0
- data/bin/mayday +33 -0
- data/lib/mayday/abstract_flag/error.rb +7 -0
- data/lib/mayday/abstract_flag/warning.rb +11 -0
- data/lib/mayday/abstract_flag.rb +90 -0
- data/lib/mayday/error.rb +7 -0
- data/lib/mayday/reader.rb +108 -0
- data/lib/mayday/script_generator.rb +74 -0
- data/lib/mayday/target_integrator.rb +69 -0
- data/lib/mayday/user_definitions.rb +42 -0
- data/lib/mayday/version.rb +3 -0
- data/lib/mayday/warning.rb +11 -0
- data/lib/mayday.rb +2 -0
- data/mayday.gemspec +30 -0
- data/spec/fixtures/Fixtures/Fixtures/AppDelegate.swift +46 -0
- data/spec/fixtures/Fixtures/Fixtures/Base.lproj/LaunchScreen.xib +41 -0
- data/spec/fixtures/Fixtures/Fixtures/Base.lproj/Main.storyboard +25 -0
- data/spec/fixtures/Fixtures/Fixtures/Excluded/ExcludedFile.h +13 -0
- data/spec/fixtures/Fixtures/Fixtures/Excluded/ExcludedFile.m +15 -0
- data/spec/fixtures/Fixtures/Fixtures/Images.xcassets/AppIcon.appiconset/Contents.json +38 -0
- data/spec/fixtures/Fixtures/Fixtures/Info.plist +40 -0
- data/spec/fixtures/Fixtures/Fixtures/Pods/SomePodObject.h +13 -0
- data/spec/fixtures/Fixtures/Fixtures/Pods/SomePodObject.m +16 -0
- data/spec/fixtures/Fixtures/Fixtures/SomeDir/Fixtures-Bridging-Header.h +4 -0
- data/spec/fixtures/Fixtures/Fixtures/SomeDir/LongFile.h +5 -0
- data/spec/fixtures/Fixtures/Fixtures/SomeDir/LongFile.m +547 -0
- data/spec/fixtures/Fixtures/Fixtures/SomeDir/SomeObject.h +15 -0
- data/spec/fixtures/Fixtures/Fixtures/SomeDir/SomeObject.m +18 -0
- data/spec/fixtures/Fixtures/Fixtures/ViewController.swift +26 -0
- data/spec/fixtures/Fixtures/Fixtures.xcodeproj/project.pbxproj +487 -0
- data/spec/fixtures/Fixtures/Fixtures.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/fixtures/Fixtures/Fixtures.xcodeproj/xcuserdata/marklarsen.xcuserdatad/xcschemes/Fixtures.xcscheme +110 -0
- data/spec/fixtures/Fixtures/FixturesTests/FixturesTests.swift +36 -0
- data/spec/fixtures/Fixtures/FixturesTests/Info.plist +24 -0
- data/spec/fixtures/Maydayfile +22 -0
- data/spec/fixtures/Maydayfile_ruby_error +11 -0
- data/spec/mayday/user_definitions_spec.rb +177 -0
- data/spec/spec_helper.rb +16 -0
- metadata +223 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c78e754b1dc60b302813defb808feecea2b0d056
|
4
|
+
data.tar.gz: f2e8d5ef9935f9d5a132e04b2be0e2219aad00a5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8ff4fe103f6da0e9ca701f807b81c9f7d9f38c360e511db50c5f604b75012ecd88bd2cd9923212bdb3bb5fbfd99ed551a0264852e0ff9e75921ce4e01b4a6ab4
|
7
|
+
data.tar.gz: 9439827e1a41aa7dd6aca66c268d88c06c80fe5327a87de0b59373d6066df108c8919f2c67a2e1e4a10e58b182a1bf2518d1b35c2825531cb86f9f9ab2ca23bf
|
data/.gitignore
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
23
|
+
|
24
|
+
# Xcode
|
25
|
+
build/
|
26
|
+
*.pbxuser
|
27
|
+
!default.pbxuser
|
28
|
+
*.mode1v3
|
29
|
+
!default.mode1v3
|
30
|
+
*.mode2v3
|
31
|
+
!default.mode2v3
|
32
|
+
*.perspectivev3
|
33
|
+
!default.perspectivev3
|
34
|
+
xcuserdata
|
35
|
+
*.xccheckout
|
36
|
+
*.moved-aside
|
37
|
+
DerivedData
|
38
|
+
*.hmap
|
39
|
+
*.ipa
|
40
|
+
*.xcuserstate
|
41
|
+
*.DS_Store
|
42
|
+
|
43
|
+
|
44
|
+
# Spec
|
45
|
+
spec/test_fixtures/
|
46
|
+
Maydayfile_rspec_generated
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Mark Larsen
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
Easily add custom warnings and errors to your Xcode project's build process.
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
$ gem install mayday
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
Create a Maydayfile at the root of your project, defining your warnings and errors using `warning`, `error`, `warning_regex`, and `error_regex`.
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
# Maydayfile
|
13
|
+
|
14
|
+
# Required
|
15
|
+
xcode_proj "CoolApp.xcodeproj"
|
16
|
+
# Required. This will most likely be the same name as your project.
|
17
|
+
main_target "CoolApp"
|
18
|
+
|
19
|
+
# Use regular expressions to define errors or warnings on a line-by-line basis
|
20
|
+
|
21
|
+
error_regex "Please remove Copyright boilerplate", /^\/\/ Copyright \(c\).*$/, :files => "*AppDelegate*", :exclude => "Fixtures/SomeDir/Excluded/*"
|
22
|
+
|
23
|
+
warning_regex "TODO", /^\/\/\s+TODO:.*$/
|
24
|
+
|
25
|
+
# Do more complicated checks or return dynamic messages via blocks
|
26
|
+
warning :line do |line|
|
27
|
+
line.length > 120 ? "Length of line #{line.length} is longer than 120 characters!" : false
|
28
|
+
end
|
29
|
+
|
30
|
+
# You can get the whole file, too
|
31
|
+
error :file do |entire_file|
|
32
|
+
max_number_of_lines = 500
|
33
|
+
|
34
|
+
number_of_code_or_comment_lines = entire_file.split("\n").select { |line| line.strip.length > 0 }.count
|
35
|
+
if number_of_code_or_comment_lines > max_number_of_lines
|
36
|
+
# Map line numbers to errors
|
37
|
+
{ "1" => "File is #{number_of_code_or_comment_lines} lines long" }
|
38
|
+
else
|
39
|
+
false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
```
|
44
|
+
|
45
|
+
And then,
|
46
|
+
|
47
|
+
$ mayday
|
48
|
+
|
49
|
+
### Options
|
50
|
+
|
51
|
+
`warning`, `error`, `warning_regex`, and `error_regex` all accept an options hash with any of the following options
|
52
|
+
|
53
|
+
* `language` limits to files in the provided language. Accepts `"swift"` and `"objective-c"`.
|
54
|
+
* `warning :line, :language => "swift" do ...`
|
55
|
+
* `files` limits to files that have an absolute path that matches the provided [globs](http://en.wikipedia.org/wiki/Glob_(programming)). Accepts an array.
|
56
|
+
* `warning_regex "Foo!", /^barbaz$/, :files => ["*.h"] do ...`
|
57
|
+
* `exclusions` doesn't run on files that have an absolute path that matches the provided [globs](http://en.wikipedia.org/wiki/Glob_(programming)). Accepts an array.
|
58
|
+
* `warning :line, :exclude => ["*/Pods/*"] do ...` **Note, Pods are excluded by default by mayday**
|
59
|
+
|
60
|
+
## Benchmarking
|
61
|
+
|
62
|
+
You may be concerned about how much overhead this will add to your build process. To see how quickly your `mayday` checks execute, use
|
63
|
+
|
64
|
+
$ mayday benchmark
|
65
|
+
|
66
|
+
## Caveats
|
67
|
+
|
68
|
+
* Since `mayday` uses [sourcify]() to write your custom `warning` and `errors` blocks to a build phase, all [gotchas in sourcify](https://github.com/ngty/sourcify#gotchas) apply to your blocks.
|
69
|
+
* Generating efficient code to write into the build phase is difficult. `MayDay::ScriptGenerator#to_ruby` could definitely by optimized.
|
70
|
+
|
71
|
+
|
72
|
+
## Uninstallation
|
73
|
+
|
74
|
+
$ mayday down
|
75
|
+
|
76
|
+
## Contributing
|
77
|
+
|
78
|
+
We'd love to see your ideas for improving this library! The best way to contribute is by submitting a pull request. We'll do our best to respond to your patch as soon as possible. You can also submit a [new Github issue](https://github.com/venmo/synx/issues/new) if you find bugs or have questions. :octocat:
|
79
|
+
|
80
|
+
Please make sure to follow our general coding style and add test coverage for new features!
|
data/Rakefile
ADDED
data/bin/mayday
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'clamp'
|
4
|
+
require 'mayday'
|
5
|
+
|
6
|
+
Clamp do
|
7
|
+
|
8
|
+
self.default_subcommand = "up"
|
9
|
+
|
10
|
+
MAYDAY_FILE_PATH = "Maydayfile"
|
11
|
+
|
12
|
+
subcommand "up", "Integrate the warnings and errors from Maydayfile into your Xcode project" do
|
13
|
+
def execute
|
14
|
+
puts "Integrating mayday into your project..."
|
15
|
+
Mayday::UserDefinitions.new(MAYDAY_FILE_PATH).up
|
16
|
+
puts "Done!"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
subcommand "down", "Remove the warnings and errors from Maydayfile into your Xcode project" do
|
21
|
+
def execute
|
22
|
+
puts "Removing mayday from your project..."
|
23
|
+
Mayday::UserDefinitions.new(MAYDAY_FILE_PATH).down
|
24
|
+
puts "Done!"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
subcommand "benchmark", "Output benchmark results of running your Maydayfile errors and warnings on your Xcode project" do
|
29
|
+
def execute
|
30
|
+
Mayday::UserDefinitions.new(MAYDAY_FILE_PATH).benchmark
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'sourcify'
|
2
|
+
|
3
|
+
module Mayday
|
4
|
+
class AbstractFlag
|
5
|
+
|
6
|
+
@@function_names = []
|
7
|
+
|
8
|
+
def initialize(block, options={})
|
9
|
+
@block = block
|
10
|
+
|
11
|
+
@include_file_globs = Array(options[:files])
|
12
|
+
@exclude_file_globs = Array(options[:exclude])
|
13
|
+
|
14
|
+
if options[:language]
|
15
|
+
language = options[:language].to_s
|
16
|
+
if language == "swift"
|
17
|
+
@include_file_globs << "*.swift"
|
18
|
+
elsif language == "objective-c"
|
19
|
+
@include_file_globs << "*.{h,m}"
|
20
|
+
else
|
21
|
+
puts "Unrecognized language '#{language}'".red
|
22
|
+
abort
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
@exclude_file_globs << "*Pods/*"
|
27
|
+
end
|
28
|
+
|
29
|
+
def message_prefix
|
30
|
+
""
|
31
|
+
end
|
32
|
+
|
33
|
+
def block_string
|
34
|
+
case @block
|
35
|
+
when String
|
36
|
+
@block
|
37
|
+
when Proc
|
38
|
+
@block.to_source
|
39
|
+
else
|
40
|
+
raise TypeError, "#{self.class}'s block has invalid type of #{@block.class}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def function_def_string
|
45
|
+
<<-CODE
|
46
|
+
def #{function_name}(file_path, file_contents)
|
47
|
+
#{file_fn_match_lines("file_path")}
|
48
|
+
|
49
|
+
line_number_to_warning_hash = lambda do
|
50
|
+
#{block_string}.call(file_contents)
|
51
|
+
end.call
|
52
|
+
|
53
|
+
if line_number_to_warning_hash && line_number_to_warning_hash.keys.count > 0
|
54
|
+
final_warning_array = []
|
55
|
+
line_number_to_warning_hash.map do |line_number, warning_str|
|
56
|
+
final_warning_array << "\#{file_path}:\#{line_number}: #{message_prefix}\#{warning_str} [Wmayday]"
|
57
|
+
end
|
58
|
+
final_warning_array.join("\n")
|
59
|
+
else
|
60
|
+
false
|
61
|
+
end
|
62
|
+
end
|
63
|
+
CODE
|
64
|
+
end
|
65
|
+
|
66
|
+
def file_fn_match_lines(file_path_var_name)
|
67
|
+
@file_fn_match_lines ||= begin
|
68
|
+
includes_chunk = @include_file_globs.map do |file_glob|
|
69
|
+
"return unless File.fnmatch(\"#{file_glob}\", #{file_path_var_name})"
|
70
|
+
end.join("\n")
|
71
|
+
|
72
|
+
excludes_chunk = @exclude_file_globs.map do |file_glob|
|
73
|
+
"return if File.fnmatch(\"#{file_glob}\", #{file_path_var_name})"
|
74
|
+
end.join("\n")
|
75
|
+
|
76
|
+
includes_chunk + "\n" + excludes_chunk
|
77
|
+
end
|
78
|
+
end
|
79
|
+
private :file_fn_match_lines
|
80
|
+
|
81
|
+
def function_name
|
82
|
+
@function_name ||= begin
|
83
|
+
# Enforce uniqueness
|
84
|
+
candidate_function_name = "abstract_flag_matcher_#{rand(10000)}"
|
85
|
+
@@function_names.include?(candidate_function_name) ? function_name : candidate_function_name
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
data/lib/mayday/error.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'mayday/target_integrator'
|
2
|
+
require 'mayday/script_generator'
|
3
|
+
require 'mayday/abstract_flag/warning'
|
4
|
+
require 'mayday/abstract_flag/error'
|
5
|
+
|
6
|
+
require 'pathname'
|
7
|
+
|
8
|
+
module Mayday
|
9
|
+
class Reader
|
10
|
+
|
11
|
+
def initialize(mayday_file)
|
12
|
+
@mayday_file = mayday_file
|
13
|
+
@script_generator = ScriptGenerator.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_target_integrator
|
17
|
+
instance_eval(@mayday_file.read, @mayday_file.path, 0)
|
18
|
+
validate_xcode_proj
|
19
|
+
validate_main_target_name
|
20
|
+
TargetIntegrator.new(@xcode_proj, @script_generator, @main_target_name)
|
21
|
+
end
|
22
|
+
|
23
|
+
def main_target(main_target_name)
|
24
|
+
@main_target_name = main_target_name
|
25
|
+
end
|
26
|
+
|
27
|
+
def xcode_proj(xcode_proj_path)
|
28
|
+
real_xcodeproj_path = File.join(Pathname.new(@mayday_file.path).realpath.parent, xcode_proj_path)
|
29
|
+
@xcode_proj = Xcodeproj::Project.open(real_xcodeproj_path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def warning_regex(message, regex, options={})
|
33
|
+
abstract_flag_regex(Warning, message, regex, options)
|
34
|
+
end
|
35
|
+
|
36
|
+
def error_regex(message, regex, options={})
|
37
|
+
abstract_flag_regex(Error, message, regex, options)
|
38
|
+
end
|
39
|
+
|
40
|
+
def validate_xcode_proj
|
41
|
+
unless @xcode_proj
|
42
|
+
puts "No Xcode project specified in #{@mayday_file.path}. Specify one using xcode_proj 'Path/To/MyProject.xcodeproj'".red
|
43
|
+
abort
|
44
|
+
end
|
45
|
+
end
|
46
|
+
private :validate_xcode_proj
|
47
|
+
|
48
|
+
def validate_main_target_name
|
49
|
+
unless @main_target_name
|
50
|
+
puts "No main target specified in #{@mayday_file.path}. Specify one using main_target_name 'My Target'".red
|
51
|
+
abort
|
52
|
+
end
|
53
|
+
end
|
54
|
+
private :validate_xcode_proj
|
55
|
+
|
56
|
+
def abstract_flag_regex(klass, message, regex, options={})
|
57
|
+
block = <<-CODE
|
58
|
+
lambda do |line|
|
59
|
+
line =~ Regexp.new('#{regex}') ? "#{message}" : nil
|
60
|
+
end
|
61
|
+
CODE
|
62
|
+
abstract_flag(klass, :line, block, options)
|
63
|
+
end
|
64
|
+
private :abstract_flag_regex
|
65
|
+
|
66
|
+
def warning(type, options={}, &block)
|
67
|
+
abstract_flag(Warning, type, block, options)
|
68
|
+
end
|
69
|
+
private :warning
|
70
|
+
|
71
|
+
def error(type, options={}, &block)
|
72
|
+
abstract_flag(Error, type, block, options)
|
73
|
+
end
|
74
|
+
private :error
|
75
|
+
|
76
|
+
def abstract_flag(klass, type, block, options={})
|
77
|
+
block_str = case block
|
78
|
+
when String
|
79
|
+
block
|
80
|
+
when Proc
|
81
|
+
block.to_source
|
82
|
+
else
|
83
|
+
raise TypeError, "#{self.class}'s block has invalid type of #{@block.class}"
|
84
|
+
end
|
85
|
+
|
86
|
+
final_block = case type
|
87
|
+
when :line
|
88
|
+
<<-CODE
|
89
|
+
lambda do |file_contents|
|
90
|
+
hash = {}
|
91
|
+
lines = file_contents.split("\n")
|
92
|
+
lines.each_with_index do |line, line_number|
|
93
|
+
message = #{block_str}.call(line)
|
94
|
+
hash[line_number + 1] = message if message
|
95
|
+
end
|
96
|
+
hash
|
97
|
+
end
|
98
|
+
CODE
|
99
|
+
when :file
|
100
|
+
block
|
101
|
+
end
|
102
|
+
|
103
|
+
@script_generator.flags << klass.new(final_block, options)
|
104
|
+
end
|
105
|
+
private :abstract_flag
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require "mayday/abstract_flag/error"
|
2
|
+
require "mayday/abstract_flag/warning"
|
3
|
+
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
module Mayday
|
7
|
+
class ScriptGenerator
|
8
|
+
|
9
|
+
attr_accessor :flags
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
self.flags = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_ruby(opts={})
|
16
|
+
opts[:exit_after] = true if opts[:exit_after] == nil;
|
17
|
+
opts[:output] = true if opts[:output] == nil;
|
18
|
+
|
19
|
+
function_defs = flags.map(&:function_def_string).join
|
20
|
+
exit_chunk = if opts[:exit_after]
|
21
|
+
<<-CODE
|
22
|
+
if #{any_errors_variable_name}
|
23
|
+
exit(1)
|
24
|
+
else
|
25
|
+
exit
|
26
|
+
end
|
27
|
+
CODE
|
28
|
+
else
|
29
|
+
""
|
30
|
+
end
|
31
|
+
|
32
|
+
call_flag_functions_chunk = call_flag_functions_string("file", opts[:output])
|
33
|
+
|
34
|
+
# Return the final code blob
|
35
|
+
|
36
|
+
<<-CODE
|
37
|
+
# encoding: utf-8
|
38
|
+
Encoding.default_external = "utf-8"
|
39
|
+
|
40
|
+
#{function_defs}
|
41
|
+
|
42
|
+
Dir[ENV["SRCROOT"] + "/**/*.{m,h,swift}"].each do |filename|
|
43
|
+
# Could be a dir with .m, like Underscore.m's dir
|
44
|
+
if (File.file?(filename))
|
45
|
+
file = File.open(filename, 'r')
|
46
|
+
#{call_flag_functions_chunk}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
#{exit_chunk}
|
51
|
+
CODE
|
52
|
+
end
|
53
|
+
|
54
|
+
def call_flag_functions_string(file_var_name, output)
|
55
|
+
"file_contents = file.read\n" + flags.map do |flag|
|
56
|
+
any_errors_line = flag.class == Mayday::Error ? "#{any_errors_variable_name} = true" : ""
|
57
|
+
<<-CODE
|
58
|
+
abstract_flag_output = #{flag.function_name}(#{file_var_name}.path, file_contents)
|
59
|
+
if abstract_flag_output && #{output}
|
60
|
+
puts abstract_flag_output
|
61
|
+
#{any_errors_line}
|
62
|
+
end
|
63
|
+
CODE
|
64
|
+
end.join("\n")
|
65
|
+
end
|
66
|
+
private :call_flag_functions_string
|
67
|
+
|
68
|
+
def any_errors_variable_name
|
69
|
+
"@any_errors"
|
70
|
+
end
|
71
|
+
private :any_errors_variable_name
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'xcodeproj'
|
2
|
+
|
3
|
+
module Mayday
|
4
|
+
class TargetIntegrator
|
5
|
+
|
6
|
+
def initialize(project, script_generator, target_name)
|
7
|
+
@project = project
|
8
|
+
@script_generator = script_generator
|
9
|
+
@target_name = target_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def integrate
|
13
|
+
if runs_successfully?
|
14
|
+
phase = existing_mayday_build_phase_for_native_target(native_target_to_integrate) || native_target_to_integrate.new_shell_script_build_phase(mayday_build_phase_name)
|
15
|
+
phase.shell_path = "/usr/bin/ruby"
|
16
|
+
phase.shell_script = @script_generator.to_ruby
|
17
|
+
phase.show_env_vars_in_log = '0'
|
18
|
+
@project.save
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def deintegrate
|
23
|
+
phase = existing_mayday_build_phase_for_native_target(native_target_to_integrate)
|
24
|
+
phase.remove_from_project if phase
|
25
|
+
@project.save
|
26
|
+
end
|
27
|
+
|
28
|
+
def runs_successfully?
|
29
|
+
ENV["SRCROOT"] = @project.path.parent.to_s
|
30
|
+
eval(@script_generator.to_ruby(:exit_after => false, :output => false))
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
34
|
+
def benchmark
|
35
|
+
ENV["SRCROOT"] = @project.path.parent.to_s
|
36
|
+
|
37
|
+
require 'benchmark'
|
38
|
+
Benchmark.bm(7) do |benchmarker|
|
39
|
+
benchmarker.report('Mayday') { eval(@script_generator.to_ruby(:exit_after => false, :output => false)) }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def native_target_to_integrate
|
44
|
+
native_target = @project.targets.detect do |target|
|
45
|
+
target.is_a?(Xcodeproj::Project::Object::PBXNativeTarget) && target.name == @target_name
|
46
|
+
end
|
47
|
+
|
48
|
+
if native_target
|
49
|
+
native_target
|
50
|
+
else
|
51
|
+
valid_target_names = @project.targets.select { |target| target.is_a?(Xcodeproj::Project::Object::PBXNativeTarget) }.map(&:name)
|
52
|
+
puts "Could not find a target named #{@target_name} in #{@project.path}. Available targets: #{valid_target_names.join(", ")}".red
|
53
|
+
abort
|
54
|
+
end
|
55
|
+
end
|
56
|
+
private :native_target_to_integrate
|
57
|
+
|
58
|
+
def existing_mayday_build_phase_for_native_target(native_target)
|
59
|
+
native_target.shell_script_build_phases.detect { |bp| bp.name == mayday_build_phase_name }
|
60
|
+
end
|
61
|
+
private :existing_mayday_build_phase_for_native_target
|
62
|
+
|
63
|
+
def mayday_build_phase_name
|
64
|
+
'Generate Mayday Flags'
|
65
|
+
end
|
66
|
+
private :mayday_build_phase_name
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'mayday/reader'
|
2
|
+
require 'colored'
|
3
|
+
|
4
|
+
module Mayday
|
5
|
+
class UserDefinitions
|
6
|
+
|
7
|
+
def initialize(mayday_file_path)
|
8
|
+
@mayday_file_path = mayday_file_path
|
9
|
+
end
|
10
|
+
|
11
|
+
def up
|
12
|
+
mayday_file do |file|
|
13
|
+
Reader.new(file).to_target_integrator.integrate
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def down
|
18
|
+
mayday_file do |file|
|
19
|
+
Reader.new(file).to_target_integrator.deintegrate
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def benchmark
|
24
|
+
mayday_file do |file|
|
25
|
+
Reader.new(file).to_target_integrator.benchmark
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def mayday_file
|
30
|
+
unless File.exist?(@mayday_file_path)
|
31
|
+
puts "No file found at path ./#{@mayday_file_path}".red
|
32
|
+
abort
|
33
|
+
end
|
34
|
+
|
35
|
+
file = File.open(@mayday_file_path)
|
36
|
+
yield file
|
37
|
+
file.close
|
38
|
+
end
|
39
|
+
private :mayday_file
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
data/lib/mayday.rb
ADDED
data/mayday.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'mayday/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "mayday"
|
8
|
+
spec.version = Mayday::VERSION
|
9
|
+
spec.authors = ["Mark Larsen"]
|
10
|
+
spec.email = ["larse503@gmail.com"]
|
11
|
+
spec.summary = %q{Custom warnings and errors}
|
12
|
+
spec.description = %q{Custom warnings and errors}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
22
|
+
spec.add_development_dependency "pry", "~> 0.9"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.3"
|
24
|
+
spec.add_development_dependency "rspec", "~> 2.14"
|
25
|
+
|
26
|
+
spec.add_dependency 'clamp', '~> 0.6.3'
|
27
|
+
spec.add_dependency 'colored', '~> 1.2'
|
28
|
+
spec.add_dependency 'sourcify', '~> 0.6.0rc4'
|
29
|
+
spec.add_dependency 'xcodeproj', '~> 0.19.3'
|
30
|
+
end
|