git-approvals 0.2.0 → 0.2.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.
- data/git-approvals.gemspec +3 -0
 - data/lib/git/approvals/approval.rb +88 -12
 - data/lib/git/approvals/version.rb +1 -1
 - data/spec/fixtures/asset.js +3 -0
 - data/spec/git/approvals/approval_spec.rb +4 -0
 - metadata +20 -2
 
    
        data/git-approvals.gemspec
    CHANGED
    
    | 
         @@ -20,6 +20,9 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
              spec.add_dependency 'awesome_print', '1.1.0'
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
      
 23 
     | 
    
         
            +
              # soft dependencies
         
     | 
| 
      
 24 
     | 
    
         
            +
              spec.add_development_dependency 'uglifier',    '~> 2.1.1'
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       23 
26 
     | 
    
         
             
              spec.add_development_dependency 'bundler',     '~> 1.3'
         
     | 
| 
       24 
27 
     | 
    
         
             
              spec.add_development_dependency 'rspec',       '~> 2.13.0'
         
     | 
| 
       25 
28 
     | 
    
         
             
              spec.add_development_dependency 'guard-rspec', '~> 2.5.2'
         
     | 
| 
         @@ -2,18 +2,91 @@ require 'open3' 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module Git
         
     | 
| 
       4 
4 
     | 
    
         
             
              module Approvals
         
     | 
| 
      
 5 
     | 
    
         
            +
                ##
         
     | 
| 
      
 6 
     | 
    
         
            +
                # The base class for approval errors.
         
     | 
| 
      
 7 
     | 
    
         
            +
                class ApprovalError < StandardError; end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                ##
         
     | 
| 
      
 10 
     | 
    
         
            +
                # Raised when an unregistered formatter is requested.
         
     | 
| 
      
 11 
     | 
    
         
            +
                class UnknownFormat < ApprovalError
         
     | 
| 
      
 12 
     | 
    
         
            +
                  def initialize( name )
         
     | 
| 
      
 13 
     | 
    
         
            +
                    super "There is no registered formatter named '#{name}'."
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                ##
         
     | 
| 
      
 18 
     | 
    
         
            +
                # Raised when a formatter's soft dependencies are missing.
         
     | 
| 
      
 19 
     | 
    
         
            +
                class MissingSoftDependency < ApprovalError
         
     | 
| 
      
 20 
     | 
    
         
            +
                  def initialize( name, dependency )
         
     | 
| 
      
 21 
     | 
    
         
            +
                    super <<-EOS
         
     | 
| 
      
 22 
     | 
    
         
            +
            The format '#{name}' requires #{dependency}.
         
     | 
| 
      
 23 
     | 
    
         
            +
            To use this formatter, make sure to load the dependency:
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
              require '#{dependency}'
         
     | 
| 
      
 26 
     | 
    
         
            +
            EOS
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                ##
         
     | 
| 
      
 31 
     | 
    
         
            +
                #
         
     | 
| 
       5 
32 
     | 
    
         
             
                class Approval
         
     | 
| 
       6 
33 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
                   
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                     
     | 
| 
       12 
     | 
    
         
            -
                     
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                       
     | 
| 
       15 
     | 
    
         
            -
                     
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
      
 34 
     | 
    
         
            +
                  class << self
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 37 
     | 
    
         
            +
                    # Registers a new formatter block by name. The block
         
     | 
| 
      
 38 
     | 
    
         
            +
                    # is expected to return a deterministic string
         
     | 
| 
      
 39 
     | 
    
         
            +
                    # representation of an object.
         
     | 
| 
      
 40 
     | 
    
         
            +
                    def register_formatter( name, &block )
         
     | 
| 
      
 41 
     | 
    
         
            +
                      formatters[ name.to_sym ] = block
         
     | 
| 
      
 42 
     | 
    
         
            +
                    end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 45 
     | 
    
         
            +
                    # Looks up the formatter named `name` and attempts to
         
     | 
| 
      
 46 
     | 
    
         
            +
                    # format `object`. Raises a helpful error message if
         
     | 
| 
      
 47 
     | 
    
         
            +
                    # a formatter's soft dependency cannot be loaded.
         
     | 
| 
      
 48 
     | 
    
         
            +
                    def format( name, object )
         
     | 
| 
      
 49 
     | 
    
         
            +
                      formatters[ name ][ object ]
         
     | 
| 
      
 50 
     | 
    
         
            +
                    rescue NoMethodError => e
         
     | 
| 
      
 51 
     | 
    
         
            +
                      raise UnknownFormat, name
         
     | 
| 
      
 52 
     | 
    
         
            +
                    rescue LoadError => e
         
     | 
| 
      
 53 
     | 
    
         
            +
                      raise MissingSoftDependency.new name,
         
     | 
| 
      
 54 
     | 
    
         
            +
                        e.message[ /^cannot load such file -- (.*)$/, 1 ]
         
     | 
| 
      
 55 
     | 
    
         
            +
                    end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                    protected
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                    ##
         
     | 
| 
      
 60 
     | 
    
         
            +
                    # The hash of registered formatters by name.
         
     | 
| 
      
 61 
     | 
    
         
            +
                    def formatters
         
     | 
| 
      
 62 
     | 
    
         
            +
                      @formatters ||= { }
         
     | 
| 
      
 63 
     | 
    
         
            +
                    end
         
     | 
| 
      
 64 
     | 
    
         
            +
                  end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 67 
     | 
    
         
            +
                  # The `txt` format requires the `awesome_print` gem.
         
     | 
| 
      
 68 
     | 
    
         
            +
                  # It is suitable for formatting most native ruby types.
         
     | 
| 
      
 69 
     | 
    
         
            +
                  register_formatter :txt do |object|
         
     | 
| 
      
 70 
     | 
    
         
            +
                    require 'awesome_print'
         
     | 
| 
      
 71 
     | 
    
         
            +
                    object.awesome_inspect :plain => true, :indent => -2
         
     | 
| 
      
 72 
     | 
    
         
            +
                  end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 75 
     | 
    
         
            +
                  # The `json` format requires the `json` library.
         
     | 
| 
      
 76 
     | 
    
         
            +
                  # It is suitable for formatting JSON strings.
         
     | 
| 
      
 77 
     | 
    
         
            +
                  register_formatter :json do |object|
         
     | 
| 
      
 78 
     | 
    
         
            +
                    require 'json'
         
     | 
| 
      
 79 
     | 
    
         
            +
                    JSON.pretty_generate JSON.parse( object )
         
     | 
| 
      
 80 
     | 
    
         
            +
                  end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 83 
     | 
    
         
            +
                  # The `js` format requires the `uglifier` gem.
         
     | 
| 
      
 84 
     | 
    
         
            +
                  # It is suitable for formatting javascript.
         
     | 
| 
      
 85 
     | 
    
         
            +
                  register_formatter :js do |object|
         
     | 
| 
      
 86 
     | 
    
         
            +
                    require 'uglifier'
         
     | 
| 
      
 87 
     | 
    
         
            +
                    Uglifier.compile object,
         
     | 
| 
      
 88 
     | 
    
         
            +
                      :output => { :beautify => true, :indent_level => 2 }
         
     | 
| 
      
 89 
     | 
    
         
            +
                  end
         
     | 
| 
       17 
90 
     | 
    
         | 
| 
       18 
91 
     | 
    
         
             
                  def initialize( path, options={} ) # :nodoc:
         
     | 
| 
       19 
92 
     | 
    
         
             
                    @path, @options = path, options
         
     | 
| 
         @@ -25,14 +98,17 @@ module Git 
     | 
|
| 
       25 
98 
     | 
    
         
             
                  attr_reader :path, :options
         
     | 
| 
       26 
99 
     | 
    
         | 
| 
       27 
100 
     | 
    
         
             
                  ##
         
     | 
| 
       28 
     | 
    
         
            -
                  #
         
     | 
| 
      
 101 
     | 
    
         
            +
                  # Diffs the given string with this approval file. If the
         
     | 
| 
      
 102 
     | 
    
         
            +
                  # file has not been checked in, this method will raise an
         
     | 
| 
      
 103 
     | 
    
         
            +
                  # exception. Otherwise, the supplied block will only be
         
     | 
| 
      
 104 
     | 
    
         
            +
                  # called if the diff fails, meaning there are differences.
         
     | 
| 
       29 
105 
     | 
    
         
             
                  def diff( string, &block )
         
     | 
| 
       30 
106 
     | 
    
         
             
                    # Make sure the directory of the file exists.
         
     | 
| 
       31 
107 
     | 
    
         
             
                    FileUtils.mkdir_p File.dirname( path )
         
     | 
| 
       32 
108 
     | 
    
         | 
| 
       33 
109 
     | 
    
         
             
                    # Write the new string to the file.
         
     | 
| 
       34 
110 
     | 
    
         
             
                    File.open path, 'w' do |f|
         
     | 
| 
       35 
     | 
    
         
            -
                      f <<  
     | 
| 
      
 111 
     | 
    
         
            +
                      f << self.class.format( format, string )
         
     | 
| 
       36 
112 
     | 
    
         
             
                    end
         
     | 
| 
       37 
113 
     | 
    
         | 
| 
       38 
114 
     | 
    
         
             
                    # If the file hasn't been checked in, raise an error.
         
     | 
| 
         @@ -69,5 +69,9 @@ describe Git::Approvals::Approval do 
     | 
|
| 
       69 
69 
     | 
    
         
             
                  approval = described_class.new './spec/fixtures/hash.json', :format => :json
         
     | 
| 
       70 
70 
     | 
    
         
             
                  approval.diff( '{"foo":"bar","baz":"quux"}' ){ |diff| fail diff }
         
     | 
| 
       71 
71 
     | 
    
         
             
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
                it 'formats javascript' do
         
     | 
| 
      
 73 
     | 
    
         
            +
                  approval = described_class.new './spec/fixtures/asset.js', :format => :js
         
     | 
| 
      
 74 
     | 
    
         
            +
                  approval.diff( '(function(){return "IT WERKS";})();' ){ |diff| fail diff }
         
     | 
| 
      
 75 
     | 
    
         
            +
                end
         
     | 
| 
       72 
76 
     | 
    
         
             
              end
         
     | 
| 
       73 
77 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: git-approvals
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.2. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.1
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       7 
7 
     | 
    
         
             
            authors:
         
     | 
| 
         @@ -9,7 +9,7 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2013- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2013-06-11 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: awesome_print
         
     | 
| 
         @@ -27,6 +27,22 @@ dependencies: 
     | 
|
| 
       27 
27 
     | 
    
         
             
                - - '='
         
     | 
| 
       28 
28 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       29 
29 
     | 
    
         
             
                    version: 1.1.0
         
     | 
| 
      
 30 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 31 
     | 
    
         
            +
              name: uglifier
         
     | 
| 
      
 32 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 33 
     | 
    
         
            +
                none: false
         
     | 
| 
      
 34 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 35 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 36 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 37 
     | 
    
         
            +
                    version: 2.1.1
         
     | 
| 
      
 38 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 39 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 40 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 41 
     | 
    
         
            +
                none: false
         
     | 
| 
      
 42 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 43 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 44 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 45 
     | 
    
         
            +
                    version: 2.1.1
         
     | 
| 
       30 
46 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       31 
47 
     | 
    
         
             
              name: bundler
         
     | 
| 
       32 
48 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -148,6 +164,7 @@ files: 
     | 
|
| 
       148 
164 
     | 
    
         
             
            - lib/git/approvals/version.rb
         
     | 
| 
       149 
165 
     | 
    
         
             
            - lib/rspec/approvals.rb
         
     | 
| 
       150 
166 
     | 
    
         
             
            - spec/fixtures/array.txt
         
     | 
| 
      
 167 
     | 
    
         
            +
            - spec/fixtures/asset.js
         
     | 
| 
       151 
168 
     | 
    
         
             
            - spec/fixtures/hash.json
         
     | 
| 
       152 
169 
     | 
    
         
             
            - spec/fixtures/hash.txt
         
     | 
| 
       153 
170 
     | 
    
         
             
            - spec/fixtures/string.txt
         
     | 
| 
         @@ -184,6 +201,7 @@ specification_version: 3 
     | 
|
| 
       184 
201 
     | 
    
         
             
            summary: Simple git-powered approval tests.
         
     | 
| 
       185 
202 
     | 
    
         
             
            test_files:
         
     | 
| 
       186 
203 
     | 
    
         
             
            - spec/fixtures/array.txt
         
     | 
| 
      
 204 
     | 
    
         
            +
            - spec/fixtures/asset.js
         
     | 
| 
       187 
205 
     | 
    
         
             
            - spec/fixtures/hash.json
         
     | 
| 
       188 
206 
     | 
    
         
             
            - spec/fixtures/hash.txt
         
     | 
| 
       189 
207 
     | 
    
         
             
            - spec/fixtures/string.txt
         
     |