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
|