xcpretty-security-patched 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.hound.yml +2 -0
  4. data/.kick +17 -0
  5. data/.rubocop.yml +239 -0
  6. data/.travis.yml +12 -0
  7. data/CHANGELOG.md +269 -0
  8. data/CONTRIBUTING.md +64 -0
  9. data/Gemfile +9 -0
  10. data/LICENSE.txt +61 -0
  11. data/README.md +95 -0
  12. data/Rakefile +18 -0
  13. data/assets/report.html.erb +173 -0
  14. data/bin/xcpretty +90 -0
  15. data/features/assets/RACCommandSpec_enabled_signal_should_send_YES_while_executing_is_YES.png +0 -0
  16. data/features/assets/apple_raw.png +0 -0
  17. data/features/custom_formatter.feature +15 -0
  18. data/features/custom_reporter.feature +29 -0
  19. data/features/fixtures/xcodebuild.log +5963 -0
  20. data/features/html_report.feature +54 -0
  21. data/features/json_compilation_database_report.feature +33 -0
  22. data/features/junit_report.feature +49 -0
  23. data/features/knock_format.feature +11 -0
  24. data/features/simple_format.feature +238 -0
  25. data/features/steps/custom_reporter_steps.rb +16 -0
  26. data/features/steps/formatting_steps.rb +386 -0
  27. data/features/steps/html_steps.rb +32 -0
  28. data/features/steps/json_steps.rb +45 -0
  29. data/features/steps/junit_steps.rb +39 -0
  30. data/features/steps/report_steps.rb +27 -0
  31. data/features/steps/xcpretty_steps.rb +31 -0
  32. data/features/support/env.rb +123 -0
  33. data/features/tap_format.feature +31 -0
  34. data/features/test_format.feature +49 -0
  35. data/features/xcpretty.feature +14 -0
  36. data/lib/xcpretty/ansi.rb +72 -0
  37. data/lib/xcpretty/formatters/formatter.rb +200 -0
  38. data/lib/xcpretty/formatters/knock.rb +35 -0
  39. data/lib/xcpretty/formatters/rspec.rb +33 -0
  40. data/lib/xcpretty/formatters/simple.rb +200 -0
  41. data/lib/xcpretty/formatters/tap.rb +40 -0
  42. data/lib/xcpretty/parser.rb +596 -0
  43. data/lib/xcpretty/printer.rb +28 -0
  44. data/lib/xcpretty/reporters/html.rb +93 -0
  45. data/lib/xcpretty/reporters/json_compilation_database.rb +51 -0
  46. data/lib/xcpretty/reporters/junit.rb +102 -0
  47. data/lib/xcpretty/reporters/reporter.rb +62 -0
  48. data/lib/xcpretty/snippet.rb +38 -0
  49. data/lib/xcpretty/syntax.rb +58 -0
  50. data/lib/xcpretty/term.rb +14 -0
  51. data/lib/xcpretty/version.rb +4 -0
  52. data/lib/xcpretty.rb +38 -0
  53. data/spec/fixtures/NSStringTests.m +64 -0
  54. data/spec/fixtures/constants.rb +707 -0
  55. data/spec/fixtures/custom_formatter.rb +18 -0
  56. data/spec/fixtures/custom_reporter.rb +30 -0
  57. data/spec/fixtures/oneliner.m +1 -0
  58. data/spec/fixtures/raw_kiwi_compilation_fail.txt +24 -0
  59. data/spec/fixtures/raw_kiwi_fail.txt +1896 -0
  60. data/spec/fixtures/raw_specta_fail.txt +3110 -0
  61. data/spec/spec_helper.rb +7 -0
  62. data/spec/support/matchers/colors.rb +21 -0
  63. data/spec/xcpretty/ansi_spec.rb +47 -0
  64. data/spec/xcpretty/formatters/formatter_spec.rb +151 -0
  65. data/spec/xcpretty/formatters/rspec_spec.rb +56 -0
  66. data/spec/xcpretty/formatters/simple_spec.rb +178 -0
  67. data/spec/xcpretty/parser_spec.rb +636 -0
  68. data/spec/xcpretty/printer_spec.rb +55 -0
  69. data/spec/xcpretty/reporters/junit_spec.rb +20 -0
  70. data/spec/xcpretty/reporters/reporter_spec.rb +40 -0
  71. data/spec/xcpretty/snippet_spec.rb +46 -0
  72. data/spec/xcpretty/syntax_spec.rb +39 -0
  73. data/spec/xcpretty/term_spec.rb +26 -0
  74. data/xcpretty.gemspec +37 -0
  75. metadata +250 -0
@@ -0,0 +1,51 @@
1
+ module XCPretty
2
+ class JSONCompilationDatabase < Reporter
3
+
4
+ FILEPATH = 'build/reports/compilation_db.json'
5
+
6
+ def load_dependencies
7
+ unless @@loaded ||= false
8
+ require 'fileutils'
9
+ require 'pathname'
10
+ require 'json'
11
+ @@loaded = true
12
+ end
13
+ end
14
+
15
+ def initialize(options)
16
+ super(options)
17
+ @compilation_units = []
18
+ @pch_path = nil
19
+ @current_file = nil
20
+ @current_path = nil
21
+ end
22
+
23
+ def format_process_pch_command(file_path)
24
+ @pch_path = file_path
25
+ end
26
+
27
+ def format_compile(file_name, file_path)
28
+ @current_file = file_name
29
+ @current_path = file_path
30
+ end
31
+
32
+ def format_compile_command(compiler_command, file_path)
33
+ directory = file_path.gsub("#{@current_path}", '').gsub(/\/$/, '')
34
+ directory = '/' if directory.empty?
35
+
36
+ cmd = compiler_command
37
+ cmd = cmd.gsub(/(\-include)\s.*\.pch/, "\\1 #{@pch_path}") if @pch_path
38
+
39
+ @compilation_units << {command: cmd,
40
+ file: @current_path,
41
+ directory: directory}
42
+ end
43
+
44
+ def write_report
45
+ File.open(@filepath, 'w') do |f|
46
+ f.write(@compilation_units.to_json)
47
+ end
48
+ end
49
+ end
50
+ end
51
+
@@ -0,0 +1,102 @@
1
+ module XCPretty
2
+ class JUnit < Reporter
3
+
4
+ FILEPATH = 'build/reports/junit.xml'
5
+
6
+ def load_dependencies
7
+ unless @@loaded ||= false
8
+ require 'fileutils'
9
+ require 'pathname'
10
+ require 'rexml/document'
11
+ require 'rexml/formatters/pretty'
12
+ @@loaded = true
13
+ end
14
+ end
15
+
16
+ def initialize(options)
17
+ super(options)
18
+ @directory = `pwd`.strip
19
+ @document = REXML::Document.new
20
+ @document << REXML::XMLDecl.new('1.0', 'UTF-8')
21
+ @document.add_element('testsuites')
22
+ @total_fails = 0
23
+ @total_tests = 0
24
+ end
25
+
26
+ def handle(line)
27
+ @parser.parse(line)
28
+ end
29
+
30
+ def format_test_run_started(name)
31
+ @document.root.add_attribute('name', name)
32
+ end
33
+
34
+ def format_passing_test(classname, test_case, time)
35
+ test_node = suite(classname).add_element('testcase')
36
+ test_node.attributes['classname'] = classname
37
+ test_node.attributes['name'] = test_case
38
+ test_node.attributes['time'] = time
39
+ @test_count += 1
40
+ end
41
+
42
+ def format_pending_test(classname, test_case)
43
+ test_node = suite(classname).add_element('testcase')
44
+ test_node.attributes['classname'] = classname
45
+ test_node.attributes['name'] = test_case
46
+ test_node.add_element('skipped')
47
+ @test_count += 1
48
+ end
49
+
50
+ def format_failing_test(classname, test_case, reason, file)
51
+ test_node = suite(classname).add_element('testcase')
52
+ test_node.attributes['classname'] = classname
53
+ test_node.attributes['name'] = test_case
54
+ fail_node = test_node.add_element('failure')
55
+ fail_node.attributes['message'] = reason
56
+ fail_node.text = file.sub(@directory + '/', '')
57
+ @test_count += 1
58
+ @fail_count += 1
59
+ end
60
+
61
+ def finish
62
+ set_test_counters
63
+ @document.root.attributes['tests'] = @total_tests
64
+ @document.root.attributes['failures'] = @total_fails
65
+ super
66
+ end
67
+
68
+ def write_report
69
+ formatter = REXML::Formatters::Pretty.new(2)
70
+ formatter.compact = true
71
+ output_file = File.open(@filepath, 'w+')
72
+ result = formatter.write(@document, output_file)
73
+ output_file.close
74
+ result
75
+ end
76
+
77
+ private
78
+
79
+ def suite(classname)
80
+ if @last_suite && @last_suite.attributes['name'] == classname
81
+ return @last_suite
82
+ end
83
+
84
+ set_test_counters
85
+ @last_suite = @document.root.add_element('testsuite')
86
+ @last_suite.attributes['name'] = classname
87
+ @last_suite
88
+ end
89
+
90
+ def set_test_counters
91
+ if @last_suite
92
+ @last_suite.attributes['tests'] = @test_count
93
+ @last_suite.attributes['failures'] = @fail_count
94
+ end
95
+ @total_fails += @fail_count || 0
96
+ @total_tests += @test_count || 0
97
+ @test_count = 0
98
+ @fail_count = 0
99
+ end
100
+ end
101
+ end
102
+
@@ -0,0 +1,62 @@
1
+ module XCPretty
2
+
3
+ class Reporter < Formatter
4
+ FILEPATH = 'build/reports/tests.txt'
5
+
6
+ attr_reader :tests
7
+
8
+ def load_dependencies
9
+ unless @@loaded ||= false
10
+ require 'fileutils'
11
+ @@loaded = true
12
+ end
13
+ end
14
+
15
+ def initialize(options)
16
+ super(true, true)
17
+ load_dependencies
18
+ @filepath = options[:path] || self.class::FILEPATH
19
+ @test_count = 0
20
+ @fail_count = 0
21
+ @tests = []
22
+ end
23
+
24
+ def handle(line)
25
+ @parser.parse(line)
26
+ end
27
+
28
+ def finish
29
+ FileUtils.mkdir_p(File.dirname(@filepath))
30
+ write_report
31
+ end
32
+
33
+ def format_failing_test(suite, test_case, reason, file)
34
+ @test_count += 1
35
+ @fail_count += 1
36
+ @tests.push("#{test_case} in #{file} FAILED: #{reason}")
37
+ end
38
+
39
+ def format_passing_test(suite, test_case, time)
40
+ @test_count += 1
41
+ @tests.push("#{test_case} PASSED")
42
+ end
43
+
44
+ def format_pending_test(classname, test_case)
45
+ @test_count += 1
46
+ @tests.push("#{test_case} IS PENDING")
47
+ end
48
+
49
+ def write_report
50
+ File.open(@filepath, 'w') do |f|
51
+ # WAT: get rid of these locals. BTW Cucumber fails if you remove them
52
+ output_string = @tests.join("\n")
53
+ output_string +=
54
+ "\nFINISHED RUNNING #{@test_count} TESTS WITH #{@fail_count} FAILURES"
55
+ f.write output_string
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
@@ -0,0 +1,38 @@
1
+ module XCPretty
2
+ class Snippet
3
+ attr_reader :contents, :file_path
4
+
5
+ def initialize(contents = '', file_path = '')
6
+ @contents = contents
7
+ @file_path = file_path
8
+ end
9
+
10
+ def self.from_filepath(filepath)
11
+ path, line = filepath.split(':')
12
+ file = File.open(path)
13
+
14
+ text = read_snippet(file, line)
15
+
16
+ file.close
17
+ new(text, filepath)
18
+ rescue
19
+ new('', filepath)
20
+ end
21
+
22
+
23
+ def self.read_snippet(file, around_line)
24
+ text = ''
25
+ starting_position = around_line.to_i - 2
26
+ starting_position.times { file.gets }
27
+ 3.times { text += readline(file) }
28
+ text
29
+ end
30
+
31
+ def self.readline(file)
32
+ file.gets
33
+ $_ || ''
34
+ end
35
+
36
+ end
37
+ end
38
+
@@ -0,0 +1,58 @@
1
+ begin
2
+ require 'rouge'
3
+ rescue LoadError
4
+ # rubocop:disable Style/ConstantName
5
+ Rouge = nil
6
+ # rubocop:enable Style/ConstantName
7
+ end
8
+
9
+ require 'xcpretty/snippet'
10
+
11
+ module XCPretty
12
+ module Syntax
13
+ def self.highlight(snippet)
14
+ return snippet.contents unless Rouge
15
+ highlight_with_formatter(snippet, Rouge::Formatters::Terminal256.new)
16
+ end
17
+
18
+ def self.highlight_html(snippet)
19
+ return snippet.contents unless Rouge
20
+ highlight_with_formatter(snippet, Rouge::Formatters::HTML.new)
21
+ end
22
+
23
+ def self.highlight_with_formatter(snippet, formatter)
24
+ if snippet.file_path.include?(':')
25
+ filename = snippet.file_path.rpartition(':').first
26
+ else
27
+ filename = snippet.file_path
28
+ end
29
+
30
+ lexer = find_lexer(filename, snippet.contents)
31
+ if lexer
32
+ formatter.format(lexer.lex(snippet.contents))
33
+ else
34
+ snippet.contents
35
+ end
36
+ end
37
+
38
+ # @param [String] filename The filename
39
+ # @param [String] contents The contents of the file
40
+ # @return [Rouge::Lexer]
41
+ def self.find_lexer(filename, contents)
42
+ case File.extname(filename)
43
+ when '.cpp', '.cc', '.c++', '.cxx', '.hpp', '.h++', '.hxx'
44
+ Rouge::Lexers::Cpp
45
+ when '.m', '.h' then Rouge::Lexers::ObjectiveC
46
+ when '.swift' then Rouge::Lexers::Swift
47
+ when '.ruby', '.rb' then Rouge::Lexers::Ruby
48
+ else
49
+ options = {
50
+ filename: File.basename(filename),
51
+ source: contents
52
+ }
53
+ Rouge::Lexer.guesses(options).first
54
+ end
55
+ end
56
+ end
57
+ end
58
+
@@ -0,0 +1,14 @@
1
+
2
+ module XCPretty
3
+ module Term
4
+
5
+ def self.unicode?
6
+ Encoding.default_external == Encoding::UTF_8
7
+ end
8
+
9
+ def self.color?
10
+ STDOUT.tty?
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,4 @@
1
+ module XCPretty
2
+ VERSION = "0.3.0"
3
+ end
4
+
data/lib/xcpretty.rb ADDED
@@ -0,0 +1,38 @@
1
+ require 'xcpretty/version'
2
+ require 'xcpretty/printer'
3
+ require 'xcpretty/syntax'
4
+ require 'xcpretty/snippet'
5
+ require 'xcpretty/term'
6
+ require 'xcpretty/formatters/formatter'
7
+ require 'xcpretty/formatters/simple'
8
+ require 'xcpretty/formatters/rspec'
9
+ require 'xcpretty/formatters/knock'
10
+ require 'xcpretty/formatters/tap'
11
+ require 'xcpretty/reporters/reporter'
12
+ require 'xcpretty/reporters/junit'
13
+ require 'xcpretty/reporters/html'
14
+ require 'xcpretty/reporters/json_compilation_database'
15
+
16
+ module XCPretty
17
+
18
+ def self.class_from_path(path)
19
+ source = File.read(path)
20
+ klass = eval(source, nil, path)
21
+ raise unless klass.is_a?(Class)
22
+ klass
23
+ end
24
+
25
+ def self.load_custom_class(path)
26
+ $LOAD_PATH.unshift File.dirname(path)
27
+ class_from_path(path)
28
+ rescue SyntaxError => e
29
+ exit_with_error("Expected custom source file to return a class. #{e}")
30
+ end
31
+
32
+ def self.exit_with_error(message)
33
+ $stderr.puts "[!] #{message}"
34
+ exit 1
35
+ end
36
+
37
+ end
38
+
@@ -0,0 +1,64 @@
1
+ //
2
+ // NSStringTests.m
3
+ // SampleProject
4
+ //
5
+ // Created by Neil on 05/12/2012.
6
+ // Copyright (c) 2012 @supermarin | supermar.in | All rights reserved.
7
+ //
8
+
9
+ #import "Kiwi.h"
10
+ #import "ObjectiveSugar.h"
11
+
12
+ SPEC_BEGIN(StringAdditions)
13
+
14
+ describe(@"Foundation-style functions", ^{
15
+
16
+ it(@"NSStringWithFormat makes NSString -stringWithFormat", ^{
17
+
18
+ [[NSStringWithFormat(@"This is %@", @1) should] equal:@"This is 1"];
19
+ });
20
+
21
+ });
22
+
23
+ describe(@"Additions", ^{
24
+
25
+ NSString *sentence = @"Jane Doe's going in a shop,and,yeah;";
26
+
27
+ it(@"-split splits by whitespace", ^{
28
+ [[[@" the\r\nquick brown\t \tfox\n" split] should] equal:@[@"the", @"quick", @"brown", @"fox"]];
29
+ });
30
+
31
+ it(@"-split: splits with given delimiter", ^{
32
+ [[[sentence split:@","] should] equal:@[@"Jane Doe's going in a shop", @"and", @"yeah;"]];
33
+ });
34
+
35
+ it(@"-split: splits with delimiter string, not just a char", ^{
36
+ [[[@"one / two / three" split:@" / "] should] equal:@[@"one", @"two", @"three"]];
37
+ });
38
+
39
+ it(@"contains string", ^{
40
+ [[@([sentence containsString:@"jane doe"]) should] beTrue];
41
+ });
42
+
43
+ context(@"CamelCase and snake_case", ^{
44
+
45
+ it(@"converts snake_cased to CamelCased", ^{
46
+ [[[@"snake_case" camelCase] should] equal:@"SnakeCase"];
47
+ });
48
+
49
+ it(@"handles correctly snake case on beginning and at the end", ^{
50
+ [[[@"_snake_case" camelCase] should] equal:@"SnakeCase"];
51
+ [[[@"snake_case_" camelCase] should] equal:@"SnakeCase"];
52
+ });
53
+
54
+ });
55
+
56
+ it(@"-strip strips whitespaces and newlines from both ends", ^{
57
+ [[[@" Look mo, no empties! " strip] should] equal:@"Look mo, no empties!"];
58
+ });
59
+
60
+ });
61
+
62
+
63
+
64
+ SPEC_END