jumanjiman_spec_helper 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,38 @@
1
+ #############################################################
2
+ # vim: set ts=2 sw=2 ai et ruler:
3
+ #
4
+ # We are a cross-platform shop.
5
+ # Do not allow OS personalities in this configuration.
6
+ #
7
+ # Note: This is not a dumping ground for personal preferences.
8
+ # Apply a minimal configuration to the local .git/config
9
+ # for consistency among authors.
10
+ # Be selective when adding parameters here.
11
+ # Do not usurp user preferences lightly.
12
+ #
13
+ # ref for gitconfig directives:
14
+ # http://git-scm.com/docs/git-config
15
+ #
16
+ # also see:
17
+ # http://nuclearsquid.com/writings/git-tricks-tips-workflows/
18
+ # https://github.com/cypher/dotfiles
19
+ #############################################################
20
+ [core]
21
+ autocrlf = false # preserve line endings (we're cross-platform)
22
+
23
+ [branch]
24
+ autosetuprebase = always # maintain linear history
25
+
26
+ [push]
27
+ default = tracking # push to tracking branch, not upstream
28
+
29
+ [remote "upstream"]
30
+ url = https://github.com/jumanjiman/jumanjiman_spec_helper.git
31
+ fetch = +refs/heads/*:refs/remotes/upstream/*
32
+
33
+ [alias]
34
+ # use these when reviewing PRs
35
+ authors = shortlog -sn
36
+ behind = !git log ..upstream/master --oneline
37
+ ahead = !git log upstream/master.. --oneline
38
+ files = !git diff --name-only upstream/master..
data/README.md CHANGED
@@ -104,3 +104,99 @@ end
104
104
 
105
105
  That's it! Now environment variables are automatically
106
106
  cleaned up between rspec examples.
107
+
108
+ ### Git helper
109
+
110
+ `JumanjimanSpecHelper::Git` adds...
111
+
112
+ * a custom `repo_root` setting to the rspec configuration
113
+ * a custom rake task to merge `.repo/config` into `.git/config`
114
+
115
+ #### Discovery (Queries)
116
+
117
+ You may want to discover the path to a repo.
118
+
119
+ 1. Add to `spec/spec_helper.rb`:
120
+
121
+ ```ruby
122
+ require 'jumanjiman_spec_helper/git'
123
+ ```
124
+
125
+ 2. Add to any spec:
126
+
127
+ ```ruby
128
+ require 'spec_helper'
129
+
130
+ # either...
131
+ absolute_path_to_repo = RSpec.configuration.repo_root
132
+
133
+ # or...
134
+ absolute_path_to_repo = JumanjimanSpecHelper::Git.repo_root
135
+ ```
136
+
137
+ #### Configuration
138
+
139
+ Perhaps you want to ensure every clone of your repo has
140
+ a specific git configuration. You may want to ensure a
141
+ linear history within the repo or provide a commit template
142
+ to help authors use a specific local format. Specifically,
143
+ assume you want to:
144
+
145
+ * Provide a git commit template specific to the repo,
146
+ overriding system-wide or user-default setting
147
+
148
+ * Replace `REPO_ROOT` with the actual path to the repo as it
149
+ exists on the user's workstation ("REPO_ROOT" gets replaced)
150
+
151
+ * Set `autosetuprebase` as `always`,
152
+ overriding system-wide or user-default setting
153
+
154
+ Steps:
155
+
156
+ 1. Add to `Rakefile`:
157
+
158
+ ```ruby
159
+ require 'jumanjiman_spec_helper/git'
160
+
161
+ # either merge the configs via method call...
162
+ JumanjimanSpecHelper::Git.update_git_config
163
+
164
+ # or add a task dependency, such as...
165
+ task :default => 'j:update_git_config' do |t|
166
+ # your normal default task code
167
+ end
168
+
169
+ # or...
170
+ RSpec::Core::RakeTask.new(:spec => 'j:update_git_config') do |t|
171
+ t.pattern = 'spec/*/*_spec.rb'
172
+ end
173
+ ```
174
+
175
+ 2. Create `.repo/config` with git configuration info, such as:
176
+
177
+ ```
178
+ [branch]
179
+ autosetuprebase = always # maintain linear history
180
+
181
+ [commit]
182
+ template = REPO_ROOT/.repo/commit.template # provide guidance
183
+ ```
184
+
185
+ 3. Create `.repo/commit.template`, such as:
186
+
187
+ ```
188
+ modulename: purpose
189
+ #========= your lines should not be wider than this ============
190
+ # modulename should be name of puppet module
191
+ # purpose should be high-level summary
192
+ # Use present tense: "do"; NOT "doing", "did", or "will"
193
+
194
+ # Request for Change number, "TBD", or "not required"
195
+ RFC:
196
+
197
+ # Briefly describe affected nodes/environments
198
+ Impacted area:
199
+
200
+ More info:
201
+ #========= your lines should not be wider than this ============
202
+ ```
data/Rakefile CHANGED
@@ -8,6 +8,12 @@ JumanjimanSpecHelper::Bundle.setup :development
8
8
  # bundle skeleton
9
9
  require "bundler/gem_tasks"
10
10
 
11
+ # add namespaced rake tasks
12
+ require 'jumanjiman_spec_helper/git'
13
+
14
+ # always keep clone config up-to-date
15
+ JumanjimanSpecHelper::Git.update_git_config
16
+
11
17
  task :default do |t|
12
18
  puts %x!rake -T!
13
19
  end
@@ -28,9 +28,21 @@ Gem::Specification.new do |gem|
28
28
  # http://docs.rubygems.org/read/chapter/20#dependencies
29
29
  # http://docs.rubygems.org/read/chapter/20#development_dependencies
30
30
 
31
+ # these are needed for both dev and runtime
32
+ common_dependencies = {
33
+ 'inifile' => '~> 2.0.2', # https://github.com/TwP/inifile
34
+ 'minigit' => '~> 0.0.3', # https://github.com/3ofcoins/minigit
35
+ 'rake' => '>= 10.0',
36
+ 'rspec' => '2.12.0',
37
+ }
38
+ common_dependencies.each do |dep, ver|
39
+ gem.add_dependency dep, ver
40
+ gem.add_development_dependency dep, ver
41
+ end
42
+
43
+ # these are only needed for dev
31
44
  gem.add_development_dependency 'rake', '>= 10.0'
32
45
  gem.add_development_dependency 'rspec-core', '2.12.2'
33
- gem.add_development_dependency 'rspec', '2.12.0'
34
46
  gem.add_development_dependency 'rspec-expectations', '2.12.1'
35
47
  gem.add_development_dependency 'rspec-mocks', '2.12.2'
36
48
  # https://github.com/freerange/mocha#bundler
@@ -2,6 +2,7 @@
2
2
  require "jumanjiman_spec_helper/version"
3
3
  require 'jumanjiman_spec_helper/bundle'
4
4
  require 'jumanjiman_spec_helper/environment_context'
5
+ require 'jumanjiman_spec_helper/git'
5
6
 
6
7
  module JumanjimanSpecHelper
7
8
  end
@@ -0,0 +1,50 @@
1
+ # vim: set ts=2 sw=2 ai et ruler:
2
+ require 'rake'
3
+ require 'rspec'
4
+
5
+ module JumanjimanSpecHelper
6
+ class Git
7
+ require 'inifile'
8
+ require 'minigit'
9
+
10
+ def self.repo_root
11
+ ENV['GIT_PAGER'] = '' # https://github.com/3ofcoins/minigit#issues
12
+ repo_root ||= MiniGit.new(Dir.pwd).git_work_tree
13
+ end
14
+
15
+ def self.config_data(path)
16
+ IniFile.new(:filename => path).read
17
+ end
18
+
19
+ def self.git_config_path
20
+ File.join(repo_root, '.git', 'config')
21
+ end
22
+
23
+ def self.repo_config_path
24
+ File.join(repo_root, '.repo', 'config')
25
+ end
26
+
27
+ def self.update_git_config
28
+ repo_data = config_data(repo_config_path)
29
+ if repo_data
30
+ git_data = config_data(git_config_path)
31
+ repo_data.each do |sect, param, val|
32
+ git_data[sect][param] = val.gsub(/REPO_ROOT/, repo_root)
33
+ end
34
+ i = IniFile.new(:filename => git_config_path).read.merge(git_data)
35
+ i.save
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ namespace :j do
42
+ desc 'Merge .repo/config into .git/config'
43
+ task :update_git_config do
44
+ JumanjimanSpecHelper::Git.update_git_config
45
+ end
46
+ end
47
+
48
+ RSpec.configure do |c|
49
+ c.add_setting 'repo_root', :default => JumanjimanSpecHelper::Git.repo_root
50
+ end
@@ -1,4 +1,4 @@
1
1
  # vim: set ts=2 sw=2 ai et ruler:
2
2
  module JumanjimanSpecHelper
3
- VERSION = '0.1.0'
3
+ VERSION = '0.2.0'
4
4
  end
@@ -0,0 +1,5 @@
1
+ [unit test]
2
+ foo = bar
3
+
4
+ [commit]
5
+ template = REPO_ROOT/.repo/commit.template
@@ -0,0 +1,6 @@
1
+ [branch "master"]
2
+ remote = origin
3
+ merge = refs/heads/master
4
+
5
+ [commit]
6
+ template = /etc/commit.template
@@ -0,0 +1,9 @@
1
+ # vim: set ts=2 sw=2 ai et ruler:
2
+ require 'spec_helper'
3
+
4
+ describe '.repo/config' do
5
+ it 'does not use ssh for upstream remote' do
6
+ lines = MiniGit::Capturing.remote(:show, :upstream, :n => true).lines
7
+ /git@/.should_not match lines.grep(/Fetch URL/).first
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ # vim: set ts=2 sw=2 ai et ruler:
2
+ require 'spec_helper'
3
+
4
+ fixtures_path = File.expand_path('../../fixtures', __FILE__)
5
+
6
+ # Other rspec examples depend on the content of these fixtures,
7
+ # so we detect accidental change that could cause side effects.
8
+ describe 'spec/fixtures' do
9
+ fixtures = {
10
+ 'source.ini' => '403d536f49e2142ea9af9296e56c4f7f',
11
+ 'target.ini' => 'a9e7ac8cee79e417f31ec2a97201ba9c',
12
+ }
13
+
14
+ fixtures.each do |file, md5sum|
15
+ it "#{file} has the expected content" do
16
+ path = File.join(fixtures_path, file)
17
+ Digest::MD5.hexdigest(File.read(path)).should == md5sum
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,164 @@
1
+ # vim: set ts=2 sw=2 ai et ruler:
2
+ require 'spec_helper'
3
+ require 'tmpdir'
4
+
5
+ fixtures_path = File.expand_path('../../fixtures', __FILE__)
6
+
7
+ describe 'JumanjimanSpecHelper::Git' do
8
+ before :each do
9
+ # create a random dir name for stubbing a root dir
10
+ @fake_repo_root = Dir.mktmpdir
11
+ end
12
+ after :each do
13
+ FileUtils.rm_rf @fake_repo_root
14
+ end
15
+
16
+ describe 'repo_root' do
17
+ before :each do
18
+ @repo_root = JumanjimanSpecHelper::Git.repo_root
19
+ end
20
+
21
+ it 'is an absolute path' do
22
+ Pathname.new(@repo_root).absolute?.should be_true
23
+ end
24
+
25
+ it 'contains .git dir' do
26
+ Dir.entries(@repo_root).include?('.git').should be_true
27
+ end
28
+
29
+ it 'is accessible as RSpec.configuration.repo_root' do
30
+ RSpec.configuration.method_exists?(:repo_root).should be_true
31
+ end
32
+
33
+ it 'RSpec.configuration.repo_root has correct value' do
34
+ RSpec.configuration.repo_root.should == @repo_root
35
+ end
36
+ end
37
+
38
+ describe 'git_config_path' do
39
+ before :each do
40
+ JumanjimanSpecHelper::Git.stubs(:repo_root).returns(@fake_repo_root)
41
+ @path = JumanjimanSpecHelper::Git.git_config_path
42
+ end
43
+
44
+ it 'is an absolute path' do
45
+ Pathname.new(@path).absolute?.should be_true
46
+ end
47
+
48
+ it 'returns path to .git/config' do
49
+ @path.should == File.join(@fake_repo_root, '.git', 'config')
50
+ end
51
+ end
52
+
53
+ describe 'repo_config_path' do
54
+ before :each do
55
+ JumanjimanSpecHelper::Git.stubs(:repo_root).returns(@fake_repo_root)
56
+ @path = JumanjimanSpecHelper::Git.repo_config_path
57
+ end
58
+
59
+ it 'is an absolute path' do
60
+ Pathname.new(@path).absolute?.should be_true
61
+ end
62
+
63
+ it 'returns path to .repo/config' do
64
+ @path.should == File.join(@fake_repo_root, '.repo', 'config')
65
+ end
66
+ end
67
+
68
+ describe 'config_data(path)' do
69
+ it 'returns nil if path does not exist' do
70
+ path = 'uhetansuhteoahutsheotsuhteoashutsanhoetusahtusha'
71
+ JumanjimanSpecHelper::Git.config_data(path).should be_nil
72
+ end
73
+
74
+ it 'returns ini data if path exists' do
75
+ path = File.join(fixtures_path, 'source.ini')
76
+ data = IniFile.new(:filename => path).read
77
+ data['unit test']['foo'].should == 'bar'
78
+ end
79
+ end
80
+
81
+ describe 'update_git_config' do
82
+ before :each do
83
+ # fixtures
84
+ @fix_source = File.join(fixtures_path, 'source.ini')
85
+ @fix_target = File.join(fixtures_path, 'target.ini')
86
+
87
+ # copy target to tmp dir
88
+ @tmpdir = Dir.mktmpdir
89
+ @tmp_target = File.join(@tmpdir, 'target.ini')
90
+ FileUtils.cp @fix_target, @tmp_target
91
+
92
+ # stub paths so we don't write target in repo
93
+ JumanjimanSpecHelper::Git.stubs(:git_config_path).returns(@tmp_target)
94
+ JumanjimanSpecHelper::Git.stubs(:repo_config_path).returns(@fix_source)
95
+
96
+ # stub repo_path
97
+ JumanjimanSpecHelper::Git.stubs(:repo_root).returns(@fake_repo_root)
98
+ end
99
+
100
+ after :each do
101
+ FileUtils.rm_rf @tmpdir
102
+ end
103
+
104
+ describe 'rake task' do
105
+ task_name = 'j:update_git_config'
106
+ task_path = File.join('lib', 'jumanjiman_spec_helper', 'git.rb')
107
+
108
+ it "is accessible as #{task_name}" do
109
+ Rake::Task.task_defined?(task_name).should be_true
110
+ end
111
+
112
+ it 'calls update_git_config method' do
113
+ # we stub the git config path above to protect against side effects
114
+ JumanjimanSpecHelper::Git.expects(:update_git_config)
115
+ Rake::Task[task_name].invoke
116
+ end
117
+ end
118
+
119
+ context 'when .repo/config does not exist' do
120
+ it 'does not change .git/config' do
121
+ # override stub
122
+ path = 'uhetansuhteoahutsheotsuhteoashutsanhoetusahtusha'
123
+ JumanjimanSpecHelper::Git.stubs(:repo_config_path).returns(path)
124
+
125
+ # update target
126
+ JumanjimanSpecHelper::Git.update_git_config
127
+
128
+ # target should not be changed
129
+ FileUtils.cmp(@fix_target, @tmp_target).should be_true
130
+ end
131
+ end
132
+
133
+ context 'when .repo/config exists' do
134
+ before :each do
135
+ # update target
136
+ JumanjimanSpecHelper::Git.update_git_config
137
+
138
+ # read target
139
+ @data = IniFile.new(:filename => @tmp_target).read
140
+ end
141
+
142
+ it 'modifies .git/config' do
143
+ FileUtils.cmp(@fix_target, @tmp_target).should be_false
144
+ end
145
+
146
+ it 'adds keys to .git/config' do
147
+ @data['unit test']['foo'].should == 'bar'
148
+ end
149
+
150
+ it 'overrides keys in .git/config' do
151
+ @data['commit']['template'].should =~ /\.repo/
152
+ end
153
+
154
+ it "substitutes 'REPO_ROOT' with real repo_root" do
155
+ path = File.join(@fake_repo_root, '.repo', 'commit.template')
156
+ @data['commit']['template'].should == path
157
+ end
158
+
159
+ it 'preserves keys in .git/config that are not in .repo/config' do
160
+ @data['branch "master"']['remote'] == 'origin'
161
+ end
162
+ end
163
+ end
164
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jumanjiman_spec_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,88 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-18 00:00:00.000000000 Z
12
+ date: 2013-03-19 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: inifile
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.0.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 2.0.2
30
+ - !ruby/object:Gem::Dependency
31
+ name: inifile
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 2.0.2
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.0.2
46
+ - !ruby/object:Gem::Dependency
47
+ name: minigit
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.0.3
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.3
62
+ - !ruby/object:Gem::Dependency
63
+ name: minigit
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.0.3
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.0.3
78
+ - !ruby/object:Gem::Dependency
79
+ name: rake
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '10.0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '10.0'
14
94
  - !ruby/object:Gem::Dependency
15
95
  name: rake
16
96
  requirement: !ruby/object:Gem::Requirement
@@ -28,21 +108,21 @@ dependencies:
28
108
  - !ruby/object:Gem::Version
29
109
  version: '10.0'
30
110
  - !ruby/object:Gem::Dependency
31
- name: rspec-core
111
+ name: rspec
32
112
  requirement: !ruby/object:Gem::Requirement
33
113
  none: false
34
114
  requirements:
35
115
  - - '='
36
116
  - !ruby/object:Gem::Version
37
- version: 2.12.2
38
- type: :development
117
+ version: 2.12.0
118
+ type: :runtime
39
119
  prerelease: false
40
120
  version_requirements: !ruby/object:Gem::Requirement
41
121
  none: false
42
122
  requirements:
43
123
  - - '='
44
124
  - !ruby/object:Gem::Version
45
- version: 2.12.2
125
+ version: 2.12.0
46
126
  - !ruby/object:Gem::Dependency
47
127
  name: rspec
48
128
  requirement: !ruby/object:Gem::Requirement
@@ -59,6 +139,38 @@ dependencies:
59
139
  - - '='
60
140
  - !ruby/object:Gem::Version
61
141
  version: 2.12.0
142
+ - !ruby/object:Gem::Dependency
143
+ name: rake
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '10.0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '10.0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: rspec-core
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - '='
164
+ - !ruby/object:Gem::Version
165
+ version: 2.12.2
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 2.12.2
62
174
  - !ruby/object:Gem::Dependency
63
175
  name: rspec-expectations
64
176
  requirement: !ruby/object:Gem::Requirement
@@ -131,6 +243,7 @@ extensions: []
131
243
  extra_rdoc_files: []
132
244
  files:
133
245
  - .gitignore
246
+ - .repo/config
134
247
  - .travis.yml
135
248
  - CONTRIBUTING.md
136
249
  - Gemfile
@@ -141,9 +254,15 @@ files:
141
254
  - lib/jumanjiman_spec_helper.rb
142
255
  - lib/jumanjiman_spec_helper/bundle.rb
143
256
  - lib/jumanjiman_spec_helper/environment_context.rb
257
+ - lib/jumanjiman_spec_helper/git.rb
144
258
  - lib/jumanjiman_spec_helper/version.rb
259
+ - spec/fixtures/source.ini
260
+ - spec/fixtures/target.ini
145
261
  - spec/spec_helper.rb
262
+ - spec/unit/config_spec.rb
146
263
  - spec/unit/environment_context_spec.rb
264
+ - spec/unit/fixtures_spec.rb
265
+ - spec/unit/git_spec.rb
147
266
  - spec/unit/version_spec.rb
148
267
  homepage: ''
149
268
  licenses: []
@@ -159,7 +278,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
159
278
  version: '0'
160
279
  segments:
161
280
  - 0
162
- hash: 1737154054071565292
281
+ hash: -2228649649261654348
163
282
  required_rubygems_version: !ruby/object:Gem::Requirement
164
283
  none: false
165
284
  requirements:
@@ -168,7 +287,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
287
  version: '0'
169
288
  segments:
170
289
  - 0
171
- hash: 1737154054071565292
290
+ hash: -2228649649261654348
172
291
  requirements: []
173
292
  rubyforge_project:
174
293
  rubygems_version: 1.8.25
@@ -176,6 +295,11 @@ signing_key:
176
295
  specification_version: 3
177
296
  summary: Provides common rspec tests for Puppet modules
178
297
  test_files:
298
+ - spec/fixtures/source.ini
299
+ - spec/fixtures/target.ini
179
300
  - spec/spec_helper.rb
301
+ - spec/unit/config_spec.rb
180
302
  - spec/unit/environment_context_spec.rb
303
+ - spec/unit/fixtures_spec.rb
304
+ - spec/unit/git_spec.rb
181
305
  - spec/unit/version_spec.rb