slither 0.99.3 → 0.99.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,42 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper')
2
-
3
- describe Slither::Generator do
4
- before(:each) do
5
- @definition = Slither.define :test do |d|
6
- d.header do |h|
7
- h.trap { |line| line[0,4] == 'HEAD' }
8
- h.column :type, 4
9
- h.column :file_id, 10
10
- end
11
- d.body do |b|
12
- b.trap { |line| line[0,4] =~ /[^(HEAD|FOOT)]/ }
13
- b.column :first, 10
14
- b.column :last, 10
15
- end
16
- d.footer do |f|
17
- f.trap { |line| line[0,4] == 'FOOT' }
18
- f.column :type, 4
19
- f.column :file_id, 10
20
- end
21
- end
22
- @data = {
23
- :header => [ {:type => "HEAD", :file_id => "1" }],
24
- :body => [
25
- {:first => "Paul", :last => "Hewson" },
26
- {:first => "Dave", :last => "Evans" }
27
- ],
28
- :footer => [ {:type => "FOOT", :file_id => "1" }]
29
- }
30
- @generator = Slither::Generator.new(@definition)
31
- end
32
-
33
- it "should raise an error if there is no data for a required section" do
34
- @data.delete :header
35
- lambda { @generator.generate(@data) }.should raise_error(Slither::RequiredSectionEmptyError, "Required section 'header' was empty.")
36
- end
37
-
38
- it "should generate a string" do
39
- expected = "HEAD 1\n Paul Hewson\n Dave Evans\nFOOT 1"
40
- @generator.generate(@data).should == expected
41
- end
42
- end
data/spec/parser_spec.rb DELETED
@@ -1,74 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper')
2
-
3
- describe Slither::Parser do
4
- before(:each) do
5
- @definition = mock('definition', :sections => [])
6
- @file = mock("file", :gets => nil)
7
- @file_name = 'test.txt'
8
- @parser = Slither::Parser.new(@definition, @file_name)
9
- end
10
-
11
- it "should open and yield the source file" do
12
- File.should_receive(:open).with(@file_name, 'r').and_yield(@file)
13
- @parser.parse
14
- end
15
-
16
- describe "when parsing sections" do
17
- before(:each) do
18
- @definition = Slither.define :test do |d|
19
- d.header do |h|
20
- h.trap { |line| line[0,4] == 'HEAD' }
21
- h.column :type, 4
22
- h.column :file_id, 10
23
- end
24
- d.body do |b|
25
- b.trap { |line| line[0,4] =~ /[^(HEAD|FOOT)]/ }
26
- b.column :first, 10
27
- b.column :last, 10
28
- end
29
- d.footer do |f|
30
- f.trap { |line| line[0,4] == 'FOOT' }
31
- f.column :type, 4
32
- f.column :file_id, 10
33
- end
34
- end
35
- File.should_receive(:open).with(@file_name, 'r').and_yield(@file)
36
- @parser = Slither::Parser.new(@definition, @file_name)
37
- end
38
-
39
- it "should add lines to the proper sections" do
40
- @file.should_receive(:gets).exactly(4).times.and_return(
41
- 'HEAD 1',
42
- ' Paul Hewson',
43
- ' Dave Evans',
44
- 'FOOT 1',
45
- nil
46
- )
47
- expected = {
48
- :header => [ {:type => "HEAD", :file_id => "1" }],
49
- :body => [
50
- {:first => "Paul", :last => "Hewson" },
51
- {:first => "Dave", :last => "Evans" }
52
- ],
53
- :footer => [ {:type => "FOOT", :file_id => "1" }]
54
- }
55
- result = @parser.parse
56
- result.should == expected
57
- end
58
-
59
- it "should allow optional sections to be skipped" do
60
- @definition.sections[0].optional = true
61
- @definition.sections[2].optional = true
62
- @file.should_receive(:gets).twice.and_return(' Paul Hewson', nil)
63
- expected = { :body => [ {:first => "Paul", :last => "Hewson" } ] }
64
- @parser.parse.should == expected
65
- end
66
-
67
- it "should raise an error if a required section is not found" do
68
- @file.should_receive(:gets).twice.and_return(' Ryan Wood', nil)
69
- lambda { @parser.parse }.should raise_error(Slither::RequiredSectionNotFoundError, "Required section 'header' was not found.")
70
- end
71
-
72
- # it "raise an error if a section limit is over run"
73
- end
74
- end
data/spec/section_spec.rb DELETED
@@ -1,146 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper')
2
-
3
- describe Slither::Section do
4
- before(:each) do
5
- @section = Slither::Section.new(:body)
6
- end
7
-
8
- it "should have no columns after creation" do
9
- @section.columns.should be_empty
10
- end
11
-
12
- it "should know it's reserved names" do
13
- Slither::Section::RESERVED_NAMES.should == [:spacer]
14
- end
15
-
16
- describe "when adding columns" do
17
- it "should build an ordered column list" do
18
- @section.should have(0).columns
19
-
20
- col1 = @section.column :id, 10
21
- col2 = @section.column :name, 30
22
- col3 = @section.column :state, 2
23
-
24
- @section.should have(3).columns
25
- @section.columns[0].should be(col1)
26
- @section.columns[1].should be(col2)
27
- @section.columns[2].should be(col3)
28
- end
29
-
30
- it "should create spacer columns" do
31
- @section.should have(0).columns
32
- @section.spacer(5)
33
- @section.should have(1).columns
34
- end
35
-
36
- it "can should override the alignment of the definition" do
37
- section = Slither::Section.new('name', :align => :left)
38
- section.options[:align].should == :left
39
- end
40
-
41
- it "should use a missing method to create a column" do
42
- @section.should have(0).columns
43
- @section.first_name 5
44
- @section.should have(1).columns
45
- end
46
-
47
- it "should prevent duplicate column names" do
48
- @section.column :id, 10
49
- lambda { @section.column(:id, 30) }.should raise_error(Slither::DuplicateColumnNameError, "You have already defined a column named 'id'.")
50
- end
51
-
52
- it "should allow duplicate column names that are reserved (i.e. spacer)" do
53
- @section.spacer 10
54
- lambda { @section.spacer 10 }.should_not raise_error(Slither::DuplicateColumnNameError)
55
- end
56
- end
57
-
58
- it "should accept and store the trap as a block" do
59
- @section.trap { |v| v == 4 }
60
- trap = @section.instance_variable_get(:@trap)
61
- trap.should be_a(Proc)
62
- trap.call(4).should == true
63
- end
64
-
65
- describe "when adding a template" do
66
- before(:each) do
67
- @template = mock('templated section', :columns => [1,2,3], :options => {})
68
- @definition = mock("definition", :templates => { :test => @template } )
69
- @section.definition = @definition
70
- end
71
-
72
- it "should ensure the template exists" do
73
- @definition.stub! :templates => {}
74
- lambda { @section.template(:none) }.should raise_error(ArgumentError)
75
- end
76
-
77
- it "should add the template columns to the current column list" do
78
- @section.template :test
79
- @section.should have(3).columns
80
- end
81
-
82
- it "should merge the template option" do
83
- @section = Slither::Section.new(:body, :align => :left)
84
- @section.definition = @definition
85
- @template.stub! :options => {:align => :right}
86
- @section.template :test
87
- @section.options.should == {:align => :left}
88
- end
89
- end
90
-
91
- describe "when formatting a row" do
92
- before(:each) do
93
- @data = { :id => 3, :name => "Ryan" }
94
- end
95
-
96
- it "should default to string data aligned right" do
97
- @section.column(:id, 5)
98
- @section.column(:name, 10)
99
- @section.format( @data ).should == " 3 Ryan"
100
- end
101
-
102
- it "should left align if asked" do
103
- @section.column(:id, 5)
104
- @section.column(:name, 10, :align => :left)
105
- @section.format(@data).should == " 3Ryan "
106
- end
107
-
108
- # it "should raise an error if the data and column definitions aren't the same size" do
109
- # @section.column(:id, 5)
110
- # lambda { @section.format(@data) }.should raise_error(
111
- # Slither::ColumnMismatchError,
112
- # "The 'body' section has 1 column(s) defined, but there are 2 column(s) provided in the data."
113
- # )
114
- # end
115
- end
116
-
117
- describe "when parsing a file" do
118
- before(:each) do
119
- @line = ' 45 Ryan WoodSC '
120
- @section = Slither::Section.new(:body)
121
- @column_content = { :id => 5, :first => 10, :last => 10, :state => 2 }
122
- end
123
-
124
- it "should return a key for key column" do
125
- @column_content.each { |k,v| @section.column(k, v) }
126
- parsed = @section.parse(@line)
127
- @column_content.each_key { |name| parsed.should have_key(name) }
128
- end
129
-
130
- it "should not return a key for reserved names" do
131
- @column_content.each { |k,v| @section.column(k, v) }
132
- @section.spacer 5
133
- @section.should have(5).columns
134
- parsed = @section.parse(@line)
135
- parsed.should have(4).keys
136
- end
137
- end
138
-
139
- it "should try to match a line using the trap" do
140
- @section.trap do |line|
141
- line == 'hello'
142
- end
143
- @section.match('hello').should be_true
144
- @section.match('goodbye').should be_false
145
- end
146
- end
data/spec/slither_spec.rb DELETED
@@ -1,84 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper')
2
-
3
- describe Slither do
4
-
5
- before(:each) do
6
- @name = :doc
7
- @options = { :align => :left }
8
- end
9
-
10
- describe "when defining a format" do
11
- before(:each) do
12
- @definition = mock('definition')
13
- end
14
-
15
- it "should create a new definition using the specified name and options" do
16
- Slither.should_receive(:define).with(@name, @options).and_return(@definition)
17
- Slither.define(@name , @options)
18
- end
19
-
20
- it "should pass the definition to the block" do
21
- yielded = nil
22
- Slither.define(@name) do |y|
23
- yielded = y
24
- end
25
- yielded.should be_a( Slither::Definition )
26
- end
27
-
28
- it "should add to the internal definition count" do
29
- Slither.definitions.clear
30
- Slither.should have(0).definitions
31
- Slither.define(@name , @options) {}
32
- Slither.should have(1).definitions
33
- end
34
- end
35
-
36
- describe "when creating file from data" do
37
- it "should raise an error if the definition name is not found" do
38
- lambda { Slither.generate(:not_there, {}) }.should raise_error(ArgumentError)
39
- end
40
-
41
- it "should output a string" do
42
- definition = mock('definition')
43
- generator = mock('generator')
44
- generator.should_receive(:generate).with({})
45
- Slither.should_receive(:definition).with(:test).and_return(definition)
46
- Slither::Generator.should_receive(:new).with(definition).and_return(generator)
47
- Slither.generate(:test, {})
48
- end
49
-
50
- it "should output a file" do
51
- file = mock('file')
52
- text = mock('string')
53
- file.should_receive(:write).with(text)
54
- File.should_receive(:open).with('file.txt', 'w').and_yield(file)
55
- Slither.should_receive(:generate).with(:test, {}).and_return(text)
56
- Slither.write('file.txt', :test, {})
57
- end
58
- end
59
-
60
- describe "when parsing a file" do
61
- before(:each) do
62
- @file_name = 'file.txt'
63
- end
64
-
65
- it "should check the file exists" do
66
- lambda { Slither.parse(@file_name, :test, {}) }.should raise_error(ArgumentError)
67
- end
68
-
69
- it "should raise an error if the definition name is not found" do
70
- Slither.definitions.clear
71
- File.stub!(:exists? => true)
72
- lambda { Slither.parse(@file_name, :test, {}) }.should raise_error(ArgumentError)
73
- end
74
-
75
- it "should create a parser and call parse" do
76
- File.stub!(:exists? => true)
77
- parser = mock("parser", :null_object => true)
78
- definition = mock('definition')
79
- Slither.should_receive(:definition).with(:test).and_return(definition)
80
- Slither::Parser.should_receive(:new).with(definition, @file_name).and_return(parser)
81
- Slither.parse(@file_name, :test)
82
- end
83
- end
84
- end
data/spec/spec_helper.rb DELETED
@@ -1,4 +0,0 @@
1
- require 'rubygems'
2
- require 'spec'
3
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'slither'))
4
-
data/tasks/ann.rake DELETED
@@ -1,80 +0,0 @@
1
-
2
- begin
3
- require 'bones/smtp_tls'
4
- rescue LoadError
5
- require 'net/smtp'
6
- end
7
- require 'time'
8
-
9
- namespace :ann do
10
-
11
- # A prerequisites task that all other tasks depend upon
12
- task :prereqs
13
-
14
- file PROJ.ann.file do
15
- ann = PROJ.ann
16
- puts "Generating #{ann.file}"
17
- File.open(ann.file,'w') do |fd|
18
- fd.puts("#{PROJ.name} version #{PROJ.version}")
19
- fd.puts(" by #{Array(PROJ.authors).first}") if PROJ.authors
20
- fd.puts(" #{PROJ.url}") if PROJ.url.valid?
21
- fd.puts(" (the \"#{PROJ.release_name}\" release)") if PROJ.release_name
22
- fd.puts
23
- fd.puts("== DESCRIPTION")
24
- fd.puts
25
- fd.puts(PROJ.description)
26
- fd.puts
27
- fd.puts(PROJ.changes.sub(%r/^.*$/, '== CHANGES'))
28
- fd.puts
29
- ann.paragraphs.each do |p|
30
- fd.puts "== #{p.upcase}"
31
- fd.puts
32
- fd.puts paragraphs_of(PROJ.readme_file, p).join("\n\n")
33
- fd.puts
34
- end
35
- fd.puts ann.text if ann.text
36
- end
37
- end
38
-
39
- desc "Create an announcement file"
40
- task :announcement => ['ann:prereqs', PROJ.ann.file]
41
-
42
- desc "Send an email announcement"
43
- task :email => ['ann:prereqs', PROJ.ann.file] do
44
- ann = PROJ.ann
45
- from = ann.email[:from] || Array(PROJ.authors).first || PROJ.email
46
- to = Array(ann.email[:to])
47
-
48
- ### build a mail header for RFC 822
49
- rfc822msg = "From: #{from}\n"
50
- rfc822msg << "To: #{to.join(',')}\n"
51
- rfc822msg << "Subject: [ANN] #{PROJ.name} #{PROJ.version}"
52
- rfc822msg << " (#{PROJ.release_name})" if PROJ.release_name
53
- rfc822msg << "\n"
54
- rfc822msg << "Date: #{Time.new.rfc822}\n"
55
- rfc822msg << "Message-Id: "
56
- rfc822msg << "<#{"%.8f" % Time.now.to_f}@#{ann.email[:domain]}>\n\n"
57
- rfc822msg << File.read(ann.file)
58
-
59
- params = [:server, :port, :domain, :acct, :passwd, :authtype].map do |key|
60
- ann.email[key]
61
- end
62
-
63
- params[3] = PROJ.email if params[3].nil?
64
-
65
- if params[4].nil?
66
- STDOUT.write "Please enter your e-mail password (#{params[3]}): "
67
- params[4] = STDIN.gets.chomp
68
- end
69
-
70
- ### send email
71
- Net::SMTP.start(*params) {|smtp| smtp.sendmail(rfc822msg, from, to)}
72
- end
73
- end # namespace :ann
74
-
75
- desc 'Alias to ann:announcement'
76
- task :ann => 'ann:announcement'
77
-
78
- CLOBBER << PROJ.ann.file
79
-
80
- # EOF
data/tasks/bones.rake DELETED
@@ -1,20 +0,0 @@
1
-
2
- if HAVE_BONES
3
-
4
- namespace :bones do
5
-
6
- desc 'Show the PROJ open struct'
7
- task :debug do |t|
8
- atr = if t.application.top_level_tasks.length == 2
9
- t.application.top_level_tasks.pop
10
- end
11
-
12
- if atr then Bones::Debug.show_attr(PROJ, atr)
13
- else Bones::Debug.show PROJ end
14
- end
15
-
16
- end # namespace :bones
17
-
18
- end # HAVE_BONES
19
-
20
- # EOF
data/tasks/gem.rake DELETED
@@ -1,201 +0,0 @@
1
-
2
- require 'find'
3
- require 'rake/packagetask'
4
- require 'rubygems/user_interaction'
5
- require 'rubygems/builder'
6
-
7
- module Bones
8
- class GemPackageTask < Rake::PackageTask
9
- # Ruby GEM spec containing the metadata for this package. The
10
- # name, version and package_files are automatically determined
11
- # from the GEM spec and don't need to be explicitly provided.
12
- #
13
- attr_accessor :gem_spec
14
-
15
- # Tasks from the Bones gem directory
16
- attr_reader :bones_files
17
-
18
- # Create a GEM Package task library. Automatically define the gem
19
- # if a block is given. If no block is supplied, then +define+
20
- # needs to be called to define the task.
21
- #
22
- def initialize(gem_spec)
23
- init(gem_spec)
24
- yield self if block_given?
25
- define if block_given?
26
- end
27
-
28
- # Initialization tasks without the "yield self" or define
29
- # operations.
30
- #
31
- def init(gem)
32
- super(gem.name, gem.version)
33
- @gem_spec = gem
34
- @package_files += gem_spec.files if gem_spec.files
35
- @bones_files = []
36
-
37
- local_setup = File.join(Dir.pwd, %w[tasks setup.rb])
38
- if !test(?e, local_setup)
39
- Dir.glob(::Bones.path(%w[lib bones tasks *])).each {|fn| bones_files << fn}
40
- end
41
- end
42
-
43
- # Create the Rake tasks and actions specified by this
44
- # GemPackageTask. (+define+ is automatically called if a block is
45
- # given to +new+).
46
- #
47
- def define
48
- super
49
- task :prereqs
50
- task :package => ['gem:prereqs', "#{package_dir_path}/#{gem_file}"]
51
- file "#{package_dir_path}/#{gem_file}" => [package_dir_path] + package_files + bones_files do
52
- when_writing("Creating GEM") {
53
- chdir(package_dir_path) do
54
- Gem::Builder.new(gem_spec).build
55
- verbose(true) {
56
- mv gem_file, "../#{gem_file}"
57
- }
58
- end
59
- }
60
- end
61
-
62
- file package_dir_path => bones_files do
63
- mkdir_p package_dir rescue nil
64
-
65
- gem_spec.files = (gem_spec.files +
66
- bones_files.map {|fn| File.join('tasks', File.basename(fn))}).sort
67
-
68
- bones_files.each do |fn|
69
- base_fn = File.join('tasks', File.basename(fn))
70
- f = File.join(package_dir_path, base_fn)
71
- fdir = File.dirname(f)
72
- mkdir_p(fdir) if !File.exist?(fdir)
73
- if File.directory?(fn)
74
- mkdir_p(f)
75
- else
76
- raise "file name conflict for '#{base_fn}' (conflicts with '#{fn}')" if test(?e, f)
77
- safe_ln(fn, f)
78
- end
79
- end
80
- end
81
- end
82
-
83
- def gem_file
84
- if @gem_spec.platform == Gem::Platform::RUBY
85
- "#{package_name}.gem"
86
- else
87
- "#{package_name}-#{@gem_spec.platform}.gem"
88
- end
89
- end
90
- end # class GemPackageTask
91
- end # module Bones
92
-
93
- namespace :gem do
94
-
95
- PROJ.gem._spec = Gem::Specification.new do |s|
96
- s.name = PROJ.name
97
- s.version = PROJ.version
98
- s.summary = PROJ.summary
99
- s.authors = Array(PROJ.authors)
100
- s.email = PROJ.email
101
- s.homepage = Array(PROJ.url).first
102
- s.rubyforge_project = PROJ.rubyforge.name
103
-
104
- s.description = PROJ.description
105
-
106
- PROJ.gem.dependencies.each do |dep|
107
- s.add_dependency(*dep)
108
- end
109
-
110
- PROJ.gem.development_dependencies.each do |dep|
111
- s.add_development_dependency(*dep)
112
- end
113
-
114
- s.files = PROJ.gem.files
115
- s.executables = PROJ.gem.executables.map {|fn| File.basename(fn)}
116
- s.extensions = PROJ.gem.files.grep %r/extconf\.rb$/
117
-
118
- s.bindir = 'bin'
119
- dirs = Dir["{#{PROJ.libs.join(',')}}"]
120
- s.require_paths = dirs unless dirs.empty?
121
-
122
- incl = Regexp.new(PROJ.rdoc.include.join('|'))
123
- excl = PROJ.rdoc.exclude.dup.concat %w[\.rb$ ^(\.\/|\/)?ext]
124
- excl = Regexp.new(excl.join('|'))
125
- rdoc_files = PROJ.gem.files.find_all do |fn|
126
- case fn
127
- when excl; false
128
- when incl; true
129
- else false end
130
- end
131
- s.rdoc_options = PROJ.rdoc.opts + ['--main', PROJ.rdoc.main]
132
- s.extra_rdoc_files = rdoc_files
133
- s.has_rdoc = true
134
-
135
- if test ?f, PROJ.test.file
136
- s.test_file = PROJ.test.file
137
- else
138
- s.test_files = PROJ.test.files.to_a
139
- end
140
-
141
- # Do any extra stuff the user wants
142
- PROJ.gem.extras.each do |msg, val|
143
- case val
144
- when Proc
145
- val.call(s.send(msg))
146
- else
147
- s.send "#{msg}=", val
148
- end
149
- end
150
- end # Gem::Specification.new
151
-
152
- Bones::GemPackageTask.new(PROJ.gem._spec) do |pkg|
153
- pkg.need_tar = PROJ.gem.need_tar
154
- pkg.need_zip = PROJ.gem.need_zip
155
- end
156
-
157
- desc 'Show information about the gem'
158
- task :debug => 'gem:prereqs' do
159
- puts PROJ.gem._spec.to_ruby
160
- end
161
-
162
- desc 'Write the gemspec '
163
- task :spec => 'gem:prereqs' do
164
- File.open("#{PROJ.name}.gemspec", 'w') do |f|
165
- f.write PROJ.gem._spec.to_ruby
166
- end
167
- end
168
-
169
- desc 'Install the gem'
170
- task :install => [:clobber, 'gem:package'] do
171
- sh "#{SUDO} #{GEM} install --local pkg/#{PROJ.gem._spec.full_name}"
172
-
173
- # use this version of the command for rubygems > 1.0.0
174
- #sh "#{SUDO} #{GEM} install --no-update-sources pkg/#{PROJ.gem._spec.full_name}"
175
- end
176
-
177
- desc 'Uninstall the gem'
178
- task :uninstall do
179
- installed_list = Gem.source_index.find_name(PROJ.name)
180
- if installed_list and installed_list.collect { |s| s.version.to_s}.include?(PROJ.version) then
181
- sh "#{SUDO} #{GEM} uninstall --version '#{PROJ.version}' --ignore-dependencies --executables #{PROJ.name}"
182
- end
183
- end
184
-
185
- desc 'Reinstall the gem'
186
- task :reinstall => [:uninstall, :install]
187
-
188
- desc 'Cleanup the gem'
189
- task :cleanup do
190
- sh "#{SUDO} #{GEM} cleanup #{PROJ.gem._spec.name}"
191
- end
192
- end # namespace :gem
193
-
194
-
195
- desc 'Alias to gem:package'
196
- task :gem => 'gem:package'
197
-
198
- task :clobber => 'gem:clobber_package'
199
- remove_desc_for_task 'gem:clobber_package'
200
-
201
- # EOF
data/tasks/git.rake DELETED
@@ -1,40 +0,0 @@
1
-
2
- if HAVE_GIT
3
-
4
- namespace :git do
5
-
6
- # A prerequisites task that all other tasks depend upon
7
- task :prereqs
8
-
9
- desc 'Show tags from the Git repository'
10
- task :show_tags => 'git:prereqs' do |t|
11
- puts %x/git tag/
12
- end
13
-
14
- desc 'Create a new tag in the Git repository'
15
- task :create_tag => 'git:prereqs' do |t|
16
- v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
17
- abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
18
-
19
- tag = "%s-%s" % [PROJ.name, PROJ.version]
20
- msg = "Creating tag for #{PROJ.name} version #{PROJ.version}"
21
-
22
- puts "Creating Git tag '#{tag}'"
23
- unless system "git tag -a -m '#{msg}' #{tag}"
24
- abort "Tag creation failed"
25
- end
26
-
27
- if %x/git remote/ =~ %r/^origin\s*$/
28
- unless system "git push origin #{tag}"
29
- abort "Could not push tag to remote Git repository"
30
- end
31
- end
32
- end
33
-
34
- end # namespace :git
35
-
36
- task 'gem:release' => 'git:create_tag'
37
-
38
- end # if HAVE_GIT
39
-
40
- # EOF