second_curtain 0.1.1 → 0.1.2
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 +8 -8
- data/bin/second_curtain +30 -18
- data/lib/second_curtain/upload.rb +23 -23
- data/lib/second_curtain/upload_manager.rb +22 -22
- metadata +15 -1
    
        checksums.yaml
    CHANGED
    
    | @@ -1,15 +1,15 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            !binary "U0hBMQ==":
         | 
| 3 3 | 
             
              metadata.gz: !binary |-
         | 
| 4 | 
            -
                 | 
| 4 | 
            +
                NTNiMzEzMDRlOWI1OGU2OGQxMjIwM2MxNDA4OTQzNmZlNjQ5ZDAxZg==
         | 
| 5 5 | 
             
              data.tar.gz: !binary |-
         | 
| 6 | 
            -
                 | 
| 6 | 
            +
                MzBmMTNlMTU4NTliNTE2ZWQ1NWY2OGI4ODE4ZDUxZmVkY2MxNmRlYQ==
         | 
| 7 7 | 
             
            SHA512:
         | 
| 8 8 | 
             
              metadata.gz: !binary |-
         | 
| 9 | 
            -
                 | 
| 10 | 
            -
                 | 
| 11 | 
            -
                 | 
| 9 | 
            +
                ZWE4NTRhZjAyMmJkOTBhOGUyM2UzMWU0OTNlZjEyNDUzNWQ2MzczNTA0ODRh
         | 
| 10 | 
            +
                ZDFiNWVlNWQ0YTBkYzI4NmUyZGNiZmU1NWQwNDk5NThlZDhmNjUyYWRjZmQ3
         | 
| 11 | 
            +
                OWNhYWEyYmY4YWRiMmMyMjQ0NWY5YjYzOWM4ZjJlYTAwZjlhODU=
         | 
| 12 12 | 
             
              data.tar.gz: !binary |-
         | 
| 13 | 
            -
                 | 
| 14 | 
            -
                 | 
| 15 | 
            -
                 | 
| 13 | 
            +
                NWMzYjk2ODI3OGNjMGU2YzM1YzA1MmQ3ODAyNjUzNTFmMGZiNWZkNGFmOWRk
         | 
| 14 | 
            +
                NGE5MjIxNjBiZDdlMWQwMjNhN2JkNTM2MmI5NjVkY2E1YzNjZjA3M2Q4NzY4
         | 
| 15 | 
            +
                NWYwY2EyODZlMDdlM2Q2YTg0MDE4NTc4NGYzZTk3MjE0MjM5ZGQ=
         | 
    
        data/bin/second_curtain
    CHANGED
    
    | @@ -2,45 +2,57 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'second_curtain'
         | 
| 4 4 |  | 
| 5 | 
            +
            input = []
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ARGF.each_line do |line|
         | 
| 8 | 
            +
              input.push(line)
         | 
| 9 | 
            +
              print line
         | 
| 10 | 
            +
            end
         | 
| 11 | 
            +
             | 
| 5 12 | 
             
            bucket_name = ENV['UPLOAD_IOS_SNAPSHOT_BUCKET_NAME']
         | 
| 6 13 |  | 
| 7 14 | 
             
            if bucket_name == nil
         | 
| 8 | 
            -
             | 
| 15 | 
            +
              abort "error: Second Curtain bucket name must be specified in environment UPLOAD_IOS_SNAPSHOT_BUCKET_NAME variable".red
         | 
| 9 16 | 
             
            end
         | 
| 10 17 |  | 
| 11 18 | 
             
            aws_key = ENV['AWS_ACCESS_KEY_ID']
         | 
| 12 19 | 
             
            aws_secret = ENV['AWS_SECRET_ACCESS_KEY']
         | 
| 13 20 | 
             
            if aws_key == nil || aws_secret == nil
         | 
| 14 | 
            -
             | 
| 21 | 
            +
              abort "error: Second Curtain AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY must be defined as environment variables".red
         | 
| 15 22 | 
             
            end
         | 
| 16 23 |  | 
| 17 24 | 
             
            path_prefix = ENV['UPLOAD_IOS_SNAPSHOT_BUCKET_PREFIX'] || '/'
         | 
| 18 25 | 
             
            if !path_prefix.end_with?('/')
         | 
| 19 | 
            -
             | 
| 26 | 
            +
              path_prefix += '/'
         | 
| 27 | 
            +
            end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            folder_name = ENV['UPLOAD_IOS_SNAPSHOT_FOLDER_NAME']
         | 
| 30 | 
            +
            if !folder_name
         | 
| 31 | 
            +
              folder_name = ENV['TRAVIS_JOB_ID']
         | 
| 32 | 
            +
            end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            if !folder_name
         | 
| 35 | 
            +
              now = DateTime.now()
         | 
| 36 | 
            +
              folder_name = now.strftime('%Y-%m-%d--%H-%M')
         | 
| 20 37 | 
             
            end
         | 
| 21 38 |  | 
| 22 39 | 
             
            s3 = AWS::S3.new
         | 
| 23 40 | 
             
            bucket = s3.buckets[bucket_name]
         | 
| 24 41 | 
             
            manager = UploadManager.new(bucket, path_prefix)
         | 
| 25 42 |  | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
            	# Print the line normally, saving output for the end
         | 
| 37 | 
            -
            	print line
         | 
| 43 | 
            +
            input.each do |line|
         | 
| 44 | 
            +
              if line.start_with?('ksdiff')
         | 
| 45 | 
            +
                parts = line.split(/"/)
         | 
| 46 | 
            +
                if (parts.count >= 4)
         | 
| 47 | 
            +
                  expected_path = parts[1]
         | 
| 48 | 
            +
                  actual_path = parts[3]
         | 
| 49 | 
            +
                  manager.enqueue_upload(expected_path, actual_path)
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 38 52 | 
             
            end
         | 
| 39 53 |  | 
| 40 | 
            -
            now = DateTime.now()
         | 
| 41 | 
            -
            folder_name = now.strftime('%Y-%m-%d--%H-%M')
         | 
| 42 54 |  | 
| 43 55 | 
             
            failures_address = manager.upload(folder_name)
         | 
| 44 56 | 
             
            if failures_address
         | 
| 45 | 
            -
             | 
| 57 | 
            +
              $stderr.puts "Failures: " + failures_address
         | 
| 46 58 | 
             
            end
         | 
| @@ -4,32 +4,32 @@ require 'pathname' | |
| 4 4 | 
             
            require 'uri'
         | 
| 5 5 |  | 
| 6 6 | 
             
            class Upload
         | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 7 | 
            +
              attr_reader :expected_path
         | 
| 8 | 
            +
              attr_reader :actual_path
         | 
| 9 | 
            +
              attr_accessor :uploaded_expected_url
         | 
| 10 | 
            +
              attr_accessor :uploaded_actual_url
         | 
| 11 11 |  | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 12 | 
            +
              def initialize(expected_path, actual_path)
         | 
| 13 | 
            +
                @expected_path = expected_path
         | 
| 14 | 
            +
                @actual_path = actual_path
         | 
| 15 | 
            +
              end
         | 
| 16 16 |  | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 17 | 
            +
              def upload(bucket, path)
         | 
| 18 | 
            +
                abort unless bucket
         | 
| 19 | 
            +
                abort unless path
         | 
| 20 20 |  | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 21 | 
            +
                expected_filename = Pathname.new(@expected_path).basename.to_s
         | 
| 22 | 
            +
                expected_object = bucket.objects[path + "/" + expected_filename]
         | 
| 23 | 
            +
                expected_object.write(:file => @expected_path)
         | 
| 24 | 
            +
                @uploaded_expected_url = expected_object.url_for(:read)
         | 
| 25 25 |  | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 26 | 
            +
                actual_filename = Pathname.new(@actual_path).basename.to_s
         | 
| 27 | 
            +
                actual_object = bucket.objects[path + "/" + actual_filename]
         | 
| 28 | 
            +
                actual_object.write(:file => @actual_path)
         | 
| 29 | 
            +
                @uploaded_actual_url = actual_object.url_for(:read)
         | 
| 30 | 
            +
              end
         | 
| 31 31 |  | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 32 | 
            +
              def to_html
         | 
| 33 | 
            +
                "<li><a href='#{ @uploaded_expected_url.to_s }'>Expected</a>, <a href='#{ @uploaded_actual_url.to_s }'>Actual</li>"
         | 
| 34 | 
            +
              end
         | 
| 35 35 | 
             
            end
         | 
| @@ -2,32 +2,32 @@ require 'aws-sdk' | |
| 2 2 | 
             
            require 'upload'
         | 
| 3 3 |  | 
| 4 4 | 
             
            class UploadManager
         | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 5 | 
            +
              def initialize (bucket, path_prefix)
         | 
| 6 | 
            +
                abort "error: Second Curtain must supply an S3 bucket".red unless bucket
         | 
| 7 | 
            +
                abort "error: Second Curtain must supply a path prefix of at least '/'".re unless path_prefix
         | 
| 8 8 |  | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 9 | 
            +
                @uploads = []
         | 
| 10 | 
            +
                @path_prefix = path_prefix
         | 
| 11 | 
            +
                @bucket = bucket
         | 
| 12 | 
            +
              end
         | 
| 13 13 |  | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 14 | 
            +
              def enqueue_upload(expected_path, actual_path)
         | 
| 15 | 
            +
                @uploads.push(Upload.new(expected_path, actual_path))
         | 
| 16 | 
            +
              end
         | 
| 17 17 |  | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 18 | 
            +
              def upload(folder_name)
         | 
| 19 | 
            +
                return nil unless @uploads.count > 0
         | 
| 20 20 |  | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 21 | 
            +
                @uploads.each do |upload|
         | 
| 22 | 
            +
                  upload.upload(@bucket, @path_prefix)
         | 
| 23 | 
            +
                end
         | 
| 24 24 |  | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 25 | 
            +
                index_object = @bucket.objects[@path_prefix + folder_name + "/index.html"]
         | 
| 26 | 
            +
                index_object.write(to_html)
         | 
| 27 | 
            +
                index_object.url_for(:read).to_s
         | 
| 28 | 
            +
              end
         | 
| 29 29 |  | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 30 | 
            +
              def to_html
         | 
| 31 | 
            +
                "<html><body>#{@uploads.map(&:to_html).join}</body></html>"
         | 
| 32 | 
            +
              end
         | 
| 33 33 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: second_curtain
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ash Furrow
         | 
| @@ -24,6 +24,20 @@ dependencies: | |
| 24 24 | 
             
                - - ~>
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: '1.48'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: colored
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - ~>
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '1.2'
         | 
| 34 | 
            +
              type: :runtime
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - ~>
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '1.2'
         | 
| 27 41 | 
             
            description: ! "\n  If you're using the cool FBSnapshotTestCase to test your iOS view
         | 
| 28 42 | 
             
              logic, awesome! Even better if you have continuous integration, like on Travis,
         | 
| 29 43 | 
             
              to automate running those tests!\n\n  Wouldn't it be awesome if we could upload
         |