xcanafail 0.0.12
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 +15 -0
 - data/bin/xcanafail +6 -0
 - data/lib/xcanafail.rb +138 -0
 - metadata +49 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,15 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            !binary "U0hBMQ==":
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: !binary |-
         
     | 
| 
      
 4 
     | 
    
         
            +
                MjJjNzFlYzVhODliNGNmMGVkNmUwNTJiMTdhYzNjOGQ4ZGNjMTQ0NA==
         
     | 
| 
      
 5 
     | 
    
         
            +
              data.tar.gz: !binary |-
         
     | 
| 
      
 6 
     | 
    
         
            +
                NmE1ZmZhYmM3MTA2YzNkYTVhNDg3OTZlMDIxNDA2MWQ1MzVmZjUwOQ==
         
     | 
| 
      
 7 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 8 
     | 
    
         
            +
              metadata.gz: !binary |-
         
     | 
| 
      
 9 
     | 
    
         
            +
                NWZmYTQ2MjZjYjU0Mzg0YTcwOTcxMDk3MzljZjQzNWEyNjUzM2ZlZDIxMzFl
         
     | 
| 
      
 10 
     | 
    
         
            +
                NmVkOGZjYWNlMzAyYjJiYTZmNzMyYTQwZTU1MDY3YWExMjQyNzc1ZDA4ZDdj
         
     | 
| 
      
 11 
     | 
    
         
            +
                M2NhYjA4Y2JiZGRiNGI0YmM4MDU2YWYyNjc2Y2E3NmNmYzQzMzM=
         
     | 
| 
      
 12 
     | 
    
         
            +
              data.tar.gz: !binary |-
         
     | 
| 
      
 13 
     | 
    
         
            +
                ZjQ0MThjMDUwZWZkNDBkMzhkOWU1MDY5NTg4ZTlkZWI1MWQyMDZiMTZlOWYz
         
     | 
| 
      
 14 
     | 
    
         
            +
                OWQxY2IwMWI5ODMyYzYxYTg1NDM2NjcwNjM4YTRiNTcxMjMyYzA2MGNkNjUy
         
     | 
| 
      
 15 
     | 
    
         
            +
                NjMyMmNlZWFmNjQ4MDMxZTMxNjliOTFlNmM4YjM3YjkwNTMwMTY=
         
     | 
    
        data/bin/xcanafail
    ADDED
    
    
    
        data/lib/xcanafail.rb
    ADDED
    
    | 
         @@ -0,0 +1,138 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
            # encoding: UTF-8
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            require 'optparse'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'ostruct'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            #
         
     | 
| 
      
 8 
     | 
    
         
            +
            # A class to give this gem some scope. The designed way to use it is through the binary, though all the binary does is call the run method on this class.
         
     | 
| 
      
 9 
     | 
    
         
            +
            #
         
     | 
| 
      
 10 
     | 
    
         
            +
            # ==== Examples
         
     | 
| 
      
 11 
     | 
    
         
            +
            #   > set -o pipefail
         
     | 
| 
      
 12 
     | 
    
         
            +
            #   > xctool -workspace MyApp.workspace -scheme MyApp.scheme -reporter plain analyze | xcanafail | <other utilities>
         
     | 
| 
      
 13 
     | 
    
         
            +
            #
         
     | 
| 
      
 14 
     | 
    
         
            +
            class XCAnafail
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              # Keep track of which file we are currently looking at
         
     | 
| 
      
 17 
     | 
    
         
            +
              private
         
     | 
| 
      
 18 
     | 
    
         
            +
              ANALYZE_FILE_LINE_REGEX = / *~ Analyze (.*)/
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              # Use this to not record warnings that occur during compilation
         
     | 
| 
      
 21 
     | 
    
         
            +
              private
         
     | 
| 
      
 22 
     | 
    
         
            +
              COMPILE_FILE_LINE_REGEX = / *~ Compile (.*)/
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              # Detect when a separator has happened
         
     | 
| 
      
 25 
     | 
    
         
            +
              private
         
     | 
| 
      
 26 
     | 
    
         
            +
              SEPARATOR_REGEX = /--------------------------------------------------------------------------------/
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
              # Check to see if there have been any warnings created
         
     | 
| 
      
 29 
     | 
    
         
            +
              private
         
     | 
| 
      
 30 
     | 
    
         
            +
              WARNING_COUNT_LINE_REGEX = /[0-9]* warning.* generated./
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              # An enumeration to store some state about where we are in the parse
         
     | 
| 
      
 33 
     | 
    
         
            +
              private
         
     | 
| 
      
 34 
     | 
    
         
            +
              module ParseState
         
     | 
| 
      
 35 
     | 
    
         
            +
                private
         
     | 
| 
      
 36 
     | 
    
         
            +
                ROOT = 0
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                private
         
     | 
| 
      
 39 
     | 
    
         
            +
                INSIDE_BLOCK = 1 # We are inside a greyed out message block
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              #
         
     | 
| 
      
 43 
     | 
    
         
            +
              # This method will start to read in from either a pipe for stdin, parse the input to detect any analysis warnings and then stream the input back out through stdout
         
     | 
| 
      
 44 
     | 
    
         
            +
              #
         
     | 
| 
      
 45 
     | 
    
         
            +
              def self.run
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                # Read in the arguments and verify etc.
         
     | 
| 
      
 48 
     | 
    
         
            +
                options = OpenStruct.new
         
     | 
| 
      
 49 
     | 
    
         
            +
                options.output = '/dev/null'
         
     | 
| 
      
 50 
     | 
    
         
            +
                OptionParser.new do |opts|
         
     | 
| 
      
 51 
     | 
    
         
            +
                  opts.banner = 'Usage: xcanafail.rb [options]'
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                  opts.on('-o', '--out FILE', 'An optional output file') do |o|
         
     | 
| 
      
 54 
     | 
    
         
            +
                    options.output = o
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                  # No argument, shows at tail.  This will print an options summary.
         
     | 
| 
      
 58 
     | 
    
         
            +
                  opts.on_tail('-h', '--help', 'Show this message') do
         
     | 
| 
      
 59 
     | 
    
         
            +
                    puts opts
         
     | 
| 
      
 60 
     | 
    
         
            +
                    exit
         
     | 
| 
      
 61 
     | 
    
         
            +
                  end
         
     | 
| 
      
 62 
     | 
    
         
            +
                end.parse!
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                # Assume success, but this might change during the parse
         
     | 
| 
      
 65 
     | 
    
         
            +
                exit_code = 0
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                # open the output file if we have been given one
         
     | 
| 
      
 68 
     | 
    
         
            +
                File.open(options.output, 'w') do |output|
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                  current_file = nil
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                  # We start at the root level
         
     | 
| 
      
 73 
     | 
    
         
            +
                  state = ParseState::ROOT
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                  # We need to store up the contents of a warning block to deal with it all when we get to the end
         
     | 
| 
      
 76 
     | 
    
         
            +
                  block_contents = nil
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                  ARGF.each_line { |line|
         
     | 
| 
      
 79 
     | 
    
         
            +
                    # We should appear transparent to the end user
         
     | 
| 
      
 80 
     | 
    
         
            +
                    puts line
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                    # Get each line from the pipe and see where we are
         
     | 
| 
      
 83 
     | 
    
         
            +
                    if ANALYZE_FILE_LINE_REGEX.match(line)
         
     | 
| 
      
 84 
     | 
    
         
            +
                      current_file = line
         
     | 
| 
      
 85 
     | 
    
         
            +
                      next
         
     | 
| 
      
 86 
     | 
    
         
            +
                    end
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                    # If we are entering a compile for a file, we just don't care
         
     | 
| 
      
 89 
     | 
    
         
            +
                    if COMPILE_FILE_LINE_REGEX.match(line)
         
     | 
| 
      
 90 
     | 
    
         
            +
                      current_file = nil
         
     | 
| 
      
 91 
     | 
    
         
            +
                      next
         
     | 
| 
      
 92 
     | 
    
         
            +
                    end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
                    # If we don't know which file we are in yet, don't process the rest of this line
         
     | 
| 
      
 95 
     | 
    
         
            +
                    next if current_file.nil?
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                    # Or if we are going in/out of a separator block?
         
     | 
| 
      
 98 
     | 
    
         
            +
                    if SEPARATOR_REGEX.match(line)
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                      if state == ParseState::ROOT
         
     | 
| 
      
 101 
     | 
    
         
            +
                        state = ParseState::INSIDE_BLOCK
         
     | 
| 
      
 102 
     | 
    
         
            +
                        block_contents = []
         
     | 
| 
      
 103 
     | 
    
         
            +
                      else
         
     | 
| 
      
 104 
     | 
    
         
            +
                        # If the last line of the block contains a warning count then we have had a valid warning
         
     | 
| 
      
 105 
     | 
    
         
            +
                        if block_contents.count > 0
         
     | 
| 
      
 106 
     | 
    
         
            +
                          last_line = block_contents.last
         
     | 
| 
      
 107 
     | 
    
         
            +
                          if WARNING_COUNT_LINE_REGEX.match(last_line)
         
     | 
| 
      
 108 
     | 
    
         
            +
                            output.print("Warning -> Error\n")
         
     | 
| 
      
 109 
     | 
    
         
            +
                            output.print(current_file + "\n")
         
     | 
| 
      
 110 
     | 
    
         
            +
                            output.print(block_contents.join("\n"))
         
     | 
| 
      
 111 
     | 
    
         
            +
                            exit_code = 1
         
     | 
| 
      
 112 
     | 
    
         
            +
                          end
         
     | 
| 
      
 113 
     | 
    
         
            +
                        end
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
                        #puts "Leaving warning block : " + block_contents.to_s
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
                        block_contents = nil
         
     | 
| 
      
 118 
     | 
    
         
            +
                        state = ParseState::ROOT
         
     | 
| 
      
 119 
     | 
    
         
            +
                        current_file = nil
         
     | 
| 
      
 120 
     | 
    
         
            +
                      end
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
      
 122 
     | 
    
         
            +
                      next
         
     | 
| 
      
 123 
     | 
    
         
            +
                    end
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
                    if state == ParseState::INSIDE_BLOCK
         
     | 
| 
      
 126 
     | 
    
         
            +
                      block_contents << line
         
     | 
| 
      
 127 
     | 
    
         
            +
                    end
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
                    #puts line
         
     | 
| 
      
 130 
     | 
    
         
            +
                  }
         
     | 
| 
      
 131 
     | 
    
         
            +
                end
         
     | 
| 
      
 132 
     | 
    
         
            +
             
     | 
| 
      
 133 
     | 
    
         
            +
                exit(exit_code)
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
              end
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
      
 137 
     | 
    
         
            +
            end
         
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
    
        metadata
    ADDED
    
    | 
         @@ -0,0 +1,49 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            --- !ruby/object:Gem::Specification
         
     | 
| 
      
 2 
     | 
    
         
            +
            name: xcanafail
         
     | 
| 
      
 3 
     | 
    
         
            +
            version: !ruby/object:Gem::Version
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.0.12
         
     | 
| 
      
 5 
     | 
    
         
            +
            platform: ruby
         
     | 
| 
      
 6 
     | 
    
         
            +
            authors:
         
     | 
| 
      
 7 
     | 
    
         
            +
            - Sam Dean
         
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire: 
         
     | 
| 
      
 9 
     | 
    
         
            +
            bindir: bin
         
     | 
| 
      
 10 
     | 
    
         
            +
            cert_chain: []
         
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2015-11-12 00:00:00.000000000 Z
         
     | 
| 
      
 12 
     | 
    
         
            +
            dependencies: []
         
     | 
| 
      
 13 
     | 
    
         
            +
            description: Pipe in the output of `xctool analyze` and it will fail on warnings.
         
     | 
| 
      
 14 
     | 
    
         
            +
              This is designed as a temporary workaround for the --fail-on-warnings flag not failing
         
     | 
| 
      
 15 
     | 
    
         
            +
              on warnings :) When that bug is fixed, this gem should go away immediately.
         
     | 
| 
      
 16 
     | 
    
         
            +
            email: sam.dean@net-a-porter.com
         
     | 
| 
      
 17 
     | 
    
         
            +
            executables:
         
     | 
| 
      
 18 
     | 
    
         
            +
            - xcanafail
         
     | 
| 
      
 19 
     | 
    
         
            +
            extensions: []
         
     | 
| 
      
 20 
     | 
    
         
            +
            extra_rdoc_files: []
         
     | 
| 
      
 21 
     | 
    
         
            +
            files:
         
     | 
| 
      
 22 
     | 
    
         
            +
            - bin/xcanafail
         
     | 
| 
      
 23 
     | 
    
         
            +
            - lib/xcanafail.rb
         
     | 
| 
      
 24 
     | 
    
         
            +
            homepage: http://rubygems.org/gems/xcanafail
         
     | 
| 
      
 25 
     | 
    
         
            +
            licenses:
         
     | 
| 
      
 26 
     | 
    
         
            +
            - Apache-2.0
         
     | 
| 
      
 27 
     | 
    
         
            +
            metadata:
         
     | 
| 
      
 28 
     | 
    
         
            +
              source: https://github.com/net-a-porter-mobile/xcanafail
         
     | 
| 
      
 29 
     | 
    
         
            +
            post_install_message: 
         
     | 
| 
      
 30 
     | 
    
         
            +
            rdoc_options: []
         
     | 
| 
      
 31 
     | 
    
         
            +
            require_paths:
         
     | 
| 
      
 32 
     | 
    
         
            +
            - lib
         
     | 
| 
      
 33 
     | 
    
         
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 34 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 35 
     | 
    
         
            +
              - - ! '>='
         
     | 
| 
      
 36 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 37 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 38 
     | 
    
         
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 39 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 40 
     | 
    
         
            +
              - - ! '>='
         
     | 
| 
      
 41 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 42 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 43 
     | 
    
         
            +
            requirements: []
         
     | 
| 
      
 44 
     | 
    
         
            +
            rubyforge_project: 
         
     | 
| 
      
 45 
     | 
    
         
            +
            rubygems_version: 2.5.0
         
     | 
| 
      
 46 
     | 
    
         
            +
            signing_key: 
         
     | 
| 
      
 47 
     | 
    
         
            +
            specification_version: 4
         
     | 
| 
      
 48 
     | 
    
         
            +
            summary: Pipe in the output of `xctool analyze` and it will fail on warnings.
         
     | 
| 
      
 49 
     | 
    
         
            +
            test_files: []
         
     |