yes_ship_it 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 444ecc2191ed065ffeb7d23921a8518897ef5f59
4
- data.tar.gz: 41ccaa7257b29964108a58bd27ddd5a9519984b8
3
+ metadata.gz: f0a3bdc9066a3756da3d10312af339a670ebb3b5
4
+ data.tar.gz: f0c52e701d5bc7ede706a76cdc1550d9d9199cfd
5
5
  SHA512:
6
- metadata.gz: e5ab4853e2fd9337988199767d0264046b49f3122c773bda25d15d0f182f9f75caa73fa30764cb6dfa4c53fc72b1dafb52ccdba7ed625a9fafbf2d2599042afb
7
- data.tar.gz: 9396162f0020b8ce79e9fc15475010f41b0da38a55c3f677172436a12e1c2d61b3a8d5152a07721688f1f5ab7037b6d9fc78d1a6323d3eb12da132c9a7fb84c4
6
+ metadata.gz: 881cc76db9867a69368e18a8e0f45ab05c8de8c008160897806d01cf3ed425600bfefe9ad2c388c73e458d859eb5298b396d08e709293148b1fe959b51ce3a10
7
+ data.tar.gz: 8593fe6bd2e0369073444351c81dfda0ba02c0728ace57d53401b97427c23c8c8a58e8d94ffd4d33d9d9397cea0c6e09f525c3a24a426159c57e16075a25f34b
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ Gemfile.lock
data/CHANGELOG.md ADDED
@@ -0,0 +1,14 @@
1
+ # Change log of yes_ship_it
2
+
3
+ ## Version 0.0.2
4
+
5
+ * Don't run assertions when dependent assertions have failed
6
+ * Add support for including standard configs for certain scenarios. The first
7
+ and only one for now is ruby_gems for releasing Ruby Gems.
8
+ * Add helper command `yes_ship_it changelog` to show the git log with all
9
+ changes since last release as inspiration for the actual change log
10
+ * Check that the change log contains an entry for the version to be released
11
+
12
+ ## Version 0.0.1
13
+
14
+ * Initial release
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md CHANGED
@@ -58,12 +58,12 @@ A more detailed configuration could look like this:
58
58
 
59
59
  ```yaml
60
60
  assertions:
61
- ci_green
62
- release_notes
63
- version_number
64
- gem_built
65
- release_tagged
66
- gem_pushed
61
+ - ci_green
62
+ - release_notes
63
+ - version_number
64
+ - gem_built
65
+ - release_tagged
66
+ - gem_pushed
67
67
  ```
68
68
 
69
69
  There can be more configuration on a general level or the level of the
@@ -33,7 +33,8 @@ module YSI
33
33
 
34
34
  def assert(dry_run: false)
35
35
  if !dry_run
36
- if !system("gem build #{gemspec_file}")
36
+ `gem build #{gemspec_file}`
37
+ if $?.to_i != 0
37
38
  return nil
38
39
  end
39
40
  end
@@ -1,5 +1,7 @@
1
1
  module YSI
2
2
  class ChangeLog < Assertion
3
+ needs "version"
4
+
3
5
  attr_reader :error
4
6
 
5
7
  def initialize(engine)
@@ -16,10 +18,23 @@ module YSI
16
18
  return nil
17
19
  end
18
20
 
21
+ @error = check_content(File.read("CHANGELOG.md"))
22
+ if @error
23
+ return nil
24
+ end
25
+
19
26
  "CHANGELOG.md"
20
27
  end
21
28
 
22
29
  def assert(dry_run: false)
23
30
  end
31
+
32
+ def check_content(content)
33
+ if content =~ /#{engine.version}/
34
+ nil
35
+ else
36
+ return "Can't find version #{engine.version} in change log"
37
+ end
38
+ end
24
39
  end
25
40
  end
@@ -1,5 +1,7 @@
1
1
  module YSI
2
2
  class PublishedGem < Assertion
3
+ needs "built_gem"
4
+
3
5
  attr_accessor :error
4
6
 
5
7
  def initialize(engine)
@@ -1,11 +1,13 @@
1
1
  module YSI
2
2
  class PushedTag < Assertion
3
+ needs "tag"
4
+
3
5
  def display_name
4
6
  "pushed tag"
5
7
  end
6
8
 
7
9
  def tag
8
- "v#{@engine.version}"
10
+ @engine.tag
9
11
  end
10
12
 
11
13
  def check
data/assertions/tag.rb CHANGED
@@ -1,11 +1,13 @@
1
1
  module YSI
2
2
  class Tag < Assertion
3
+ needs "version"
4
+
3
5
  def display_name
4
6
  "tag"
5
7
  end
6
8
 
7
9
  def tag
8
- "v#{@engine.version}"
10
+ @engine.tag
9
11
  end
10
12
 
11
13
  def check
data/bin/yes_ship_it CHANGED
@@ -2,8 +2,26 @@
2
2
 
3
3
  require_relative("../lib/yes_ship_it.rb")
4
4
 
5
- puts "Shipping..."
6
- puts
5
+ options = {}
6
+ option_parser = OptionParser.new do |opts|
7
+ opts.banner = "Usage: yes_ship_it [options] [command]"
8
+
9
+ opts.separator ""
10
+ opts.separator "Commands:"
11
+ opts.separator " changelog - show change log since last release"
12
+ opts.separator ""
13
+ opts.separator "Specific options:"
14
+
15
+ opts.on("--dry-run", "Just pretend. Don't change anything.") do |v|
16
+ options[:dry_run] = v
17
+ end
18
+
19
+ opts.on_tail("-h", "--help", "Show this message") do
20
+ puts opts
21
+ exit
22
+ end
23
+ end
24
+ option_parser.parse!
7
25
 
8
26
  config_file = "yes_ship_it.conf"
9
27
 
@@ -12,14 +30,29 @@ if !File.exist?(config_file)
12
30
  exit 1
13
31
  end
14
32
 
15
- engine = YSI::Engine.new
16
- engine.dry_run = ARGV == ["--dry-run"]
33
+ if ARGV == ["changelog"]
34
+ engine = YSI::Engine.new
35
+ engine.check_assertion(YSI::Version)
36
+ tag = `git tag`.split("\n").last
37
+ system("git log #{tag}..HEAD")
38
+ exit 0
39
+ elsif ARGV.empty?
40
+ puts "Shipping..."
41
+ puts
42
+
43
+ engine = YSI::Engine.new
44
+ engine.dry_run = options[:dry_run]
17
45
 
18
- begin
19
- engine.read(config_file)
46
+ begin
47
+ engine.read(config_file)
20
48
 
21
- exit engine.run
22
- rescue YSI::Error => e
23
- STDERR.puts e
49
+ exit engine.run
50
+ rescue YSI::Error => e
51
+ STDERR.puts e
52
+ exit 1
53
+ end
54
+ else
55
+ $stderr.puts "Unrecognized arguments: #{ARGV.join(" ")}"
56
+ puts option_parser
24
57
  exit 1
25
58
  end
@@ -0,0 +1,7 @@
1
+ assertions:
2
+ - version
3
+ - change_log
4
+ - tag
5
+ - built_gem
6
+ - published_gem
7
+ - pushed_tag
data/lib/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module YSI
2
+ VERSION = "0.0.2"
3
+ end
@@ -3,8 +3,38 @@ module YSI
3
3
  attr_reader :error
4
4
  attr_accessor :engine
5
5
 
6
+ def self.class_for_name(name)
7
+ class_name = name.split("_").map { |n| n.capitalize }.join
8
+ begin
9
+ Object.const_get("YSI::" + class_name)
10
+ rescue NameError
11
+ raise YSI::Error.new("Error: Unknown assertion '#{name}'")
12
+ end
13
+ end
14
+
15
+ def self.needs(dependency)
16
+ @dependency_names ||= []
17
+ # Classes might not all be loaded yet, so delay class name lookup to
18
+ # first invocation of #needs
19
+ @dependency_names << dependency
20
+ end
21
+
22
+ def self.dependency_names
23
+ @dependency_names || []
24
+ end
25
+
6
26
  def initialize(engine)
7
27
  @engine = engine
8
28
  end
29
+
30
+ def needs
31
+ @dependencies ||= self.class.dependency_names.map do |d|
32
+ Assertion.class_for_name(d)
33
+ end
34
+ end
35
+
36
+ def needs?(dependency)
37
+ needs.include?(dependency)
38
+ end
9
39
  end
10
40
  end
@@ -5,15 +5,6 @@ module YSI
5
5
  attr_accessor :out
6
6
  attr_accessor :dry_run
7
7
 
8
- def self.class_for_assertion_name(name)
9
- class_name = name.split("_").map { |n| n.capitalize }.join
10
- begin
11
- Object.const_get("YSI::" + class_name)
12
- rescue NameError
13
- raise YSI::Error.new("Error: Unknown assertion '#{name}'")
14
- end
15
- end
16
-
17
8
  def initialize
18
9
  @assertions = []
19
10
  @out = STDOUT
@@ -22,30 +13,64 @@ module YSI
22
13
  def read(filename)
23
14
  config = YAML.load_file(filename)
24
15
 
25
- assertions = config["assertions"]
26
- if assertions
27
- assertions.each do |assertion|
28
- if assertion == "version_number"
29
- out.puts "Warning: use `version` instead of `version_number`."
30
- out.puts
31
- assertion = "version"
32
- end
16
+ config.each do |key,value|
17
+ if key == "include"
18
+ included_file = value
19
+ configs_path = File.expand_path("../../../configs", __FILE__)
20
+ read(File.join(configs_path, included_file + ".conf"))
21
+ elsif key == "assertions"
22
+ assertions = value
23
+ if assertions
24
+ assertions.each do |assertion|
25
+ if assertion == "version_number"
26
+ out.puts "Warning: use `version` instead of `version_number`."
27
+ out.puts
28
+ assertion = "version"
29
+ end
33
30
 
34
- @assertions << YSI::Engine.class_for_assertion_name(assertion).new(self)
31
+ @assertions << YSI::Assertion.class_for_name(assertion).new(self)
32
+ end
33
+ end
35
34
  end
36
35
  end
37
36
  end
38
37
 
38
+ def check_assertion(assertion_class)
39
+ assertion_class.new(self).check
40
+ end
41
+
39
42
  def project_name
40
43
  File.basename(Dir.pwd)
41
44
  end
42
45
 
46
+ def tag
47
+ "v#{version}"
48
+ end
49
+
50
+ def dependency_errored?(assertion, errored_assertions)
51
+ assertion.needs.each do |need|
52
+ errored_assertions.each do |errored_assertion|
53
+ if errored_assertion.class == need
54
+ return true
55
+ end
56
+ end
57
+ end
58
+ false
59
+ end
60
+
43
61
  def run
44
62
  failed_assertions = []
45
63
  errored_assertions = []
64
+ skipped_assertions = []
46
65
 
47
66
  @assertions.each do |assertion|
48
67
  out.print "Checking #{assertion.display_name}: "
68
+ if dependency_errored?(assertion, errored_assertions) ||
69
+ dependency_errored?(assertion, skipped_assertions)
70
+ out.puts "skip (because dependency errored)"
71
+ skipped_assertions << assertion
72
+ next
73
+ end
49
74
  success = assertion.check
50
75
  if success
51
76
  out.puts success
data/lib/yes_ship_it.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "yaml"
2
2
  require "rest-client"
3
+ require "optparse"
3
4
 
4
5
  require_relative "yes_ship_it/assertion.rb"
5
6
  require_relative "yes_ship_it/engine.rb"
Binary file
Binary file
@@ -0,0 +1,2 @@
1
+ include:
2
+ ruby_gem
@@ -24,8 +24,7 @@ Warning: use `version` instead of `version_number`.
24
24
 
25
25
  Checking version number: error
26
26
  Expected version in lib/version.rb
27
- Checking change log: error
28
- Expected change log in CHANGELOG.md
27
+ Checking change log: skip (because dependency errored)
29
28
 
30
29
  Couldn't ship red_herring. Help me.
31
30
  EOT
@@ -119,5 +118,79 @@ EOT
119
118
  working_directory: File.join(dir, "red_herring"))).
120
119
  to exit_with_success(expected_output)
121
120
  end
121
+
122
+ it "checks the change log" do
123
+ dir = given_directory
124
+
125
+ setup_test_git_repo("004", dir)
126
+
127
+ expected_output = <<EOT
128
+ Shipping...
129
+
130
+ Checking version number: 0.0.2
131
+ Checking change log: error
132
+ Can't find version 0.0.2 in change log
133
+ Checking built gem: fail
134
+ Checking tag: fail
135
+
136
+ Couldn't ship red_herring. Help me.
137
+ EOT
138
+
139
+ expect(run_command(working_directory: File.join(dir, "red_herring"))).
140
+ to exit_with_error(1, "", expected_output)
141
+ end
142
+
143
+ it "skips assertions with errored dependencies" do
144
+ dir = nil
145
+ given_directory do
146
+ dir = given_directory "test_project" do
147
+ given_file("yes_ship_it.conf", from: "yes_ship_it.include.conf")
148
+ end
149
+ end
150
+
151
+ expected_output = <<EOT
152
+ Shipping...
153
+
154
+ Checking version number: error
155
+ Expected version in lib/version.rb
156
+ Checking change log: skip (because dependency errored)
157
+ Checking tag: skip (because dependency errored)
158
+ Checking built gem: error
159
+ I need a gemspec: test_project.gemspec
160
+ Checking published gem: skip (because dependency errored)
161
+ Checking pushed tag: skip (because dependency errored)
162
+
163
+ Couldn't ship test_project. Help me.
164
+ EOT
165
+
166
+ expect(run_command(working_directory: dir)).
167
+ to exit_with_error(1, "", expected_output)
168
+ end
169
+ end
170
+
171
+ describe "changelog helper" do
172
+ it "shows changelog since last version" do
173
+ dir = given_directory
174
+
175
+ setup_test_git_repo("005", dir)
176
+
177
+ expected_output = <<EOT
178
+ commit 22cb6af3f7ea8385a8d0c62340c99265e0c8a63d
179
+ Author: Cornelius Schumacher <schumacher@kde.org>
180
+ Date: Fri Jul 10 23:54:01 2015 +0200
181
+
182
+ Implement magic method
183
+
184
+ commit 40ec45663e2a3cf32895b451cc43e667463af431
185
+ Author: Cornelius Schumacher <schumacher@kde.org>
186
+ Date: Fri Jul 10 23:50:08 2015 +0200
187
+
188
+ Add magic method
189
+ EOT
190
+
191
+ expect(run_command(args: ["changelog"],
192
+ working_directory: File.join(dir, "red_herring"))).
193
+ to exit_with_success(expected_output)
194
+ end
122
195
  end
123
196
  end
@@ -0,0 +1,15 @@
1
+ require_relative "spec_helper"
2
+
3
+ describe YSI::Assertion do
4
+ describe ".class_for_name" do
5
+ it "creates VersionNumber class" do
6
+ expect(YSI::Assertion.class_for_name("version")).
7
+ to be(YSI::Version)
8
+ end
9
+
10
+ it "creates ChangeLog class" do
11
+ expect(YSI::Assertion.class_for_name("change_log")).
12
+ to be(YSI::ChangeLog)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,52 @@
1
+ require_relative "../spec_helper.rb"
2
+
3
+ describe YSI::ChangeLog do
4
+ describe "checks content of change log" do
5
+ it "when empty" do
6
+ engine = YSI::Engine.new
7
+ engine.version = "1.2.3"
8
+ a = YSI::ChangeLog.new(engine)
9
+ expect(a.check_content("")).to eq("Can't find version 1.2.3 in change log")
10
+ end
11
+
12
+ it "when no version" do
13
+ engine = YSI::Engine.new
14
+ engine.version = "1.2.3"
15
+ a = YSI::ChangeLog.new(engine)
16
+ content = <<EOT
17
+ # Change log
18
+
19
+ ## Version 1.0.0
20
+
21
+ * Some changes
22
+ EOT
23
+ expect(a.check_content(content)).to eq("Can't find version 1.2.3 in change log")
24
+ end
25
+
26
+ it "when all info is there" do
27
+ engine = YSI::Engine.new
28
+ engine.version = "1.2.3"
29
+ a = YSI::ChangeLog.new(engine)
30
+ content = <<EOT
31
+ # Change log
32
+
33
+ ## Version 1.2.3
34
+
35
+ * Some changes
36
+ EOT
37
+ expect(a.check_content(content)).to be_nil
38
+ end
39
+ end
40
+
41
+ describe "dependencies" do
42
+ it "#needs?" do
43
+ a = YSI::ChangeLog.new(YSI::Engine)
44
+ expect(a.needs?(YSI::Version)).to be(true)
45
+ end
46
+
47
+ it "#needs" do
48
+ a = YSI::ChangeLog.new(YSI::Engine)
49
+ expect(a.needs).to eq([YSI::Version])
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,15 @@
1
+ require_relative "../spec_helper.rb"
2
+
3
+ describe YSI::PushedTag do
4
+ describe "dependencies" do
5
+ it "#needs?" do
6
+ a = YSI::PushedTag.new(YSI::Engine)
7
+ expect(a.needs?(YSI::Tag)).to be(true)
8
+ end
9
+
10
+ it "#needs" do
11
+ a = YSI::PushedTag.new(YSI::Engine)
12
+ expect(a.needs).to eq([YSI::Tag])
13
+ end
14
+ end
15
+ end
@@ -5,18 +5,6 @@ include GivenFilesystemSpecHelpers
5
5
  describe YSI::Engine do
6
6
  use_given_filesystem
7
7
 
8
- describe "#class_for_assertion_name" do
9
- it "creates VersionNumber class" do
10
- expect(YSI::Engine.class_for_assertion_name("version")).
11
- to be(YSI::Version)
12
- end
13
-
14
- it "creates ChangeLog class" do
15
- expect(YSI::Engine.class_for_assertion_name("change_log")).
16
- to be(YSI::ChangeLog)
17
- end
18
- end
19
-
20
8
  describe "#read" do
21
9
  it "reads valid configuration" do
22
10
  path = nil
@@ -45,6 +33,13 @@ describe YSI::Engine do
45
33
  ysi.read(path)
46
34
  }.to raise_error YSI::Error
47
35
  end
36
+
37
+ it "throws error when file does not exist" do
38
+ ysi = YSI::Engine.new
39
+ expect {
40
+ ysi.read("/this/file/does/not/exist.conf")
41
+ }.to raise_error Errno::ENOENT
42
+ end
48
43
  end
49
44
 
50
45
  it "runs assertions" do
@@ -65,4 +60,48 @@ describe YSI::Engine do
65
60
 
66
61
  ysi.run
67
62
  end
63
+
64
+ it "runs assertion" do
65
+ ysi = YSI::Engine.new
66
+
67
+ expect_any_instance_of(YSI::Version).to receive(:check)
68
+
69
+ ysi.check_assertion(YSI::Version)
70
+ end
71
+
72
+ it "provides tag" do
73
+ ysi = YSI::Engine.new
74
+ ysi.version = "1.2.3"
75
+
76
+ expect(ysi.tag).to eq("v1.2.3")
77
+ end
78
+
79
+ it "loads standard config" do
80
+ ysi_standard = YSI::Engine.new
81
+ ysi_standard.read("configs/ruby_gem.conf")
82
+
83
+ ysi = YSI::Engine.new
84
+ ysi.read(given_file("yes_ship_it.include.conf"))
85
+
86
+ expect(ysi.assertions.count).to be >= 6
87
+ ysi_standard.assertions.each_with_index do |assertion, i|
88
+ expect(assertion.class).to eq(ysi.assertions[i].class)
89
+ end
90
+ end
91
+
92
+ describe "#dependency_errored?" do
93
+ it "returns true, if no dependency errored" do
94
+ engine = YSI::Engine.new
95
+ errored_assertions = []
96
+ assertion = YSI::ChangeLog.new(engine)
97
+ expect(engine.dependency_errored?(assertion, errored_assertions)).to be(false)
98
+ end
99
+
100
+ it "returns false, if a dependency errored" do
101
+ engine = YSI::Engine.new
102
+ errored_assertions = [YSI::Version.new(engine)]
103
+ assertion = YSI::ChangeLog.new(engine)
104
+ expect(engine.dependency_errored?(assertion, errored_assertions)).to be(true)
105
+ end
106
+ end
68
107
  end
@@ -1,5 +1,7 @@
1
1
  require_relative "../../lib/yes_ship_it.rb"
2
2
 
3
+ require "given_filesystem/spec_helpers"
4
+
3
5
  support = File.expand_path("../support", __FILE__) + "/*.rb"
4
6
 
5
7
  Dir[support].each { |f| require f }
Binary file
data/yes_ship_it.conf CHANGED
@@ -1,9 +1,3 @@
1
1
  # Experimental release automation. See https://github.com/cornelius/yes_ship_it.
2
-
3
- assertions:
4
- - version
5
- - change_log
6
- - built_gem
7
- - published_gem
8
- - tag
9
- - pushed_tag
2
+ include:
3
+ ruby_gem
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "yes_ship_it"
6
+ s.version = YSI::VERSION
7
+ s.license = 'MIT'
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Cornelius Schumacher']
10
+ s.email = ['schumacher@kde.org']
11
+ s.homepage = "http://github.com/cornelius/yes_ship_it"
12
+ s.summary = "The ultimate release script"
13
+ s.description = "Whenever the answer is 'Yes, ship it!' you will need yes_ship_it. It is the ultimate helper in releasing software.."
14
+
15
+ s.required_rubygems_version = ">= 1.3.6"
16
+ s.rubyforge_project = "yes_ship_it"
17
+
18
+ s.add_development_dependency "rspec", "~>3"
19
+ s.add_development_dependency "given_filesystem"
20
+ s.add_development_dependency "cli_tester"
21
+
22
+ s.files = `git ls-files`.split("\n")
23
+ s.require_path = 'lib'
24
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yes_ship_it
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cornelius Schumacher
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-03 00:00:00.000000000 Z
11
+ date: 2015-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -60,7 +60,10 @@ executables: []
60
60
  extensions: []
61
61
  extra_rdoc_files: []
62
62
  files:
63
+ - .gitignore
63
64
  - .rspec
65
+ - CHANGELOG.md
66
+ - Gemfile
64
67
  - README.md
65
68
  - assertions/built_gem.rb
66
69
  - assertions/change_log.rb
@@ -69,6 +72,8 @@ files:
69
72
  - assertions/tag.rb
70
73
  - assertions/version.rb
71
74
  - bin/yes_ship_it
75
+ - configs/ruby_gem.conf
76
+ - lib/version.rb
72
77
  - lib/yes_ship_it.rb
73
78
  - lib/yes_ship_it/assertion.rb
74
79
  - lib/yes_ship_it/engine.rb
@@ -77,15 +82,23 @@ files:
77
82
  - spec/data/red_herring-001.tar.gz
78
83
  - spec/data/red_herring-002.tar.gz
79
84
  - spec/data/red_herring-003.tar.gz
85
+ - spec/data/red_herring-004.tar.gz
86
+ - spec/data/red_herring-005.tar.gz
80
87
  - spec/data/yes_ship_it.conf
88
+ - spec/data/yes_ship_it.include.conf
81
89
  - spec/data/yes_ship_it.unknown.conf
82
90
  - spec/integration/cli_spec.rb
83
91
  - spec/integration/spec_helper.rb
92
+ - spec/unit/assertion_spec.rb
93
+ - spec/unit/assertions/change_log_spec.rb
94
+ - spec/unit/assertions/pushed_tag_spec.rb
84
95
  - spec/unit/assertions_spec.rb
85
96
  - spec/unit/engine_spec.rb
86
97
  - spec/unit/spec_helper.rb
87
98
  - spec/unit/support/assertion_examples.rb
99
+ - yes_ship_it-0.0.1.gem
88
100
  - yes_ship_it.conf
101
+ - yes_ship_it.gemspec
89
102
  homepage: http://github.com/cornelius/yes_ship_it
90
103
  licenses:
91
104
  - MIT