germinate-gist 1.0.0

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.
@@ -0,0 +1 @@
1
+ class GerminateGist::
@@ -0,0 +1,5 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[spec_helper])
3
+
4
+
5
+ # EOF
@@ -0,0 +1,19 @@
1
+ require 'rubygems'
2
+ require 'germinate'
3
+ require 'germinate/publisher'
4
+
5
+ require File.expand_path(
6
+ File.join(File.dirname(__FILE__), %w[.. lib germinate-gist]))
7
+
8
+ Spec::Runner.configure do |config|
9
+ # == Mock Framework
10
+ #
11
+ # RSpec uses it's own mocking framework by default. If you prefer to
12
+ # use mocha, flexmock or RR, uncomment the appropriate line:
13
+ #
14
+ # config.mock_with :mocha
15
+ # config.mock_with :flexmock
16
+ # config.mock_with :rr
17
+ end
18
+
19
+ # EOF
@@ -0,0 +1,80 @@
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
@@ -0,0 +1,20 @@
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
@@ -0,0 +1,200 @@
1
+ require 'find'
2
+ require 'rake/packagetask'
3
+ require 'rubygems/user_interaction'
4
+ require 'rubygems/builder'
5
+
6
+ module Bones
7
+ class GemPackageTask < Rake::PackageTask
8
+ # Ruby GEM spec containing the metadata for this package. The
9
+ # name, version and package_files are automatically determined
10
+ # from the GEM spec and don't need to be explicitly provided.
11
+ #
12
+ attr_accessor :gem_spec
13
+
14
+ # Tasks from the Bones gem directory
15
+ attr_reader :bones_files
16
+
17
+ # Create a GEM Package task library. Automatically define the gem
18
+ # if a block is given. If no block is supplied, then +define+
19
+ # needs to be called to define the task.
20
+ #
21
+ def initialize(gem_spec)
22
+ init(gem_spec)
23
+ yield self if block_given?
24
+ define if block_given?
25
+ end
26
+
27
+ # Initialization tasks without the "yield self" or define
28
+ # operations.
29
+ #
30
+ def init(gem)
31
+ super(gem.name, gem.version)
32
+ @gem_spec = gem
33
+ @package_files += gem_spec.files if gem_spec.files
34
+ @bones_files = []
35
+
36
+ local_setup = File.join(Dir.pwd, %w[tasks setup.rb])
37
+ if !test(?e, local_setup)
38
+ Dir.glob(::Bones.path(%w[lib bones tasks *])).each {|fn| bones_files << fn}
39
+ end
40
+ end
41
+
42
+ # Create the Rake tasks and actions specified by this
43
+ # GemPackageTask. (+define+ is automatically called if a block is
44
+ # given to +new+).
45
+ #
46
+ def define
47
+ super
48
+ task :prereqs
49
+ task :package => ['gem:prereqs', "#{package_dir_path}/#{gem_file}"]
50
+ file "#{package_dir_path}/#{gem_file}" => [package_dir_path] + package_files + bones_files do
51
+ when_writing("Creating GEM") {
52
+ chdir(package_dir_path) do
53
+ Gem::Builder.new(gem_spec).build
54
+ verbose(true) {
55
+ mv gem_file, "../#{gem_file}"
56
+ }
57
+ end
58
+ }
59
+ end
60
+
61
+ file package_dir_path => bones_files do
62
+ mkdir_p package_dir rescue nil
63
+
64
+ gem_spec.files = (gem_spec.files +
65
+ bones_files.map {|fn| File.join('tasks', File.basename(fn))}).sort
66
+
67
+ bones_files.each do |fn|
68
+ base_fn = File.join('tasks', File.basename(fn))
69
+ f = File.join(package_dir_path, base_fn)
70
+ fdir = File.dirname(f)
71
+ mkdir_p(fdir) if !File.exist?(fdir)
72
+ if File.directory?(fn)
73
+ mkdir_p(f)
74
+ else
75
+ raise "file name conflict for '#{base_fn}' (conflicts with '#{fn}')" if test(?e, f)
76
+ safe_ln(fn, f)
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ def gem_file
83
+ if @gem_spec.platform == Gem::Platform::RUBY
84
+ "#{package_name}.gem"
85
+ else
86
+ "#{package_name}-#{@gem_spec.platform}.gem"
87
+ end
88
+ end
89
+ end # class GemPackageTask
90
+ end # module Bones
91
+
92
+ namespace :gem do
93
+
94
+ PROJ.gem._spec = Gem::Specification.new do |s|
95
+ s.name = PROJ.name
96
+ s.version = PROJ.version
97
+ s.summary = PROJ.summary
98
+ s.authors = Array(PROJ.authors)
99
+ s.email = PROJ.email
100
+ s.homepage = Array(PROJ.url).first
101
+ s.rubyforge_project = PROJ.rubyforge.name
102
+
103
+ s.description = PROJ.description
104
+
105
+ PROJ.gem.dependencies.each do |dep|
106
+ s.add_dependency(*dep)
107
+ end
108
+
109
+ PROJ.gem.development_dependencies.each do |dep|
110
+ s.add_development_dependency(*dep)
111
+ end
112
+
113
+ s.files = PROJ.gem.files
114
+ s.executables = PROJ.gem.executables.map {|fn| File.basename(fn)}
115
+ s.extensions = PROJ.gem.files.grep %r/extconf\.rb$/
116
+
117
+ s.bindir = 'bin'
118
+ dirs = Dir["{#{PROJ.libs.join(',')}}"]
119
+ s.require_paths = dirs unless dirs.empty?
120
+
121
+ incl = Regexp.new(PROJ.rdoc.include.join('|'))
122
+ excl = PROJ.rdoc.exclude.dup.concat %w[\.rb$ ^(\.\/|\/)?ext]
123
+ excl = Regexp.new(excl.join('|'))
124
+ rdoc_files = PROJ.gem.files.find_all do |fn|
125
+ case fn
126
+ when excl; false
127
+ when incl; true
128
+ else false end
129
+ end
130
+ s.rdoc_options = PROJ.rdoc.opts + ['--main', PROJ.rdoc.main]
131
+ s.extra_rdoc_files = rdoc_files
132
+ s.has_rdoc = true
133
+
134
+ if test ?f, PROJ.test.file
135
+ s.test_file = PROJ.test.file
136
+ else
137
+ s.test_files = PROJ.test.files.to_a
138
+ end
139
+
140
+ # Do any extra stuff the user wants
141
+ PROJ.gem.extras.each do |msg, val|
142
+ case val
143
+ when Proc
144
+ val.call(s.send(msg))
145
+ else
146
+ s.send "#{msg}=", val
147
+ end
148
+ end
149
+ end # Gem::Specification.new
150
+
151
+ Bones::GemPackageTask.new(PROJ.gem._spec) do |pkg|
152
+ pkg.need_tar = PROJ.gem.need_tar
153
+ pkg.need_zip = PROJ.gem.need_zip
154
+ end
155
+
156
+ desc 'Show information about the gem'
157
+ task :debug => 'gem:prereqs' do
158
+ puts PROJ.gem._spec.to_ruby
159
+ end
160
+
161
+ desc 'Write the gemspec '
162
+ task :spec => 'gem:prereqs' do
163
+ File.open("#{PROJ.name}.gemspec", 'w') do |f|
164
+ f.write PROJ.gem._spec.to_ruby
165
+ end
166
+ end
167
+
168
+ desc 'Install the gem'
169
+ task :install => [:clobber, 'gem:package'] do
170
+ sh "#{SUDO} #{GEM} install --local pkg/#{PROJ.gem._spec.full_name}"
171
+
172
+ # use this version of the command for rubygems > 1.0.0
173
+ #sh "#{SUDO} #{GEM} install --no-update-sources pkg/#{PROJ.gem._spec.full_name}"
174
+ end
175
+
176
+ desc 'Uninstall the gem'
177
+ task :uninstall do
178
+ installed_list = Gem.source_index.find_name(PROJ.name)
179
+ if installed_list and installed_list.collect { |s| s.version.to_s}.include?(PROJ.version) then
180
+ sh "#{SUDO} #{GEM} uninstall --version '#{PROJ.version}' --ignore-dependencies --executables #{PROJ.name}"
181
+ end
182
+ end
183
+
184
+ desc 'Reinstall the gem'
185
+ task :reinstall => [:uninstall, :install]
186
+
187
+ desc 'Cleanup the gem'
188
+ task :cleanup do
189
+ sh "#{SUDO} #{GEM} cleanup #{PROJ.gem._spec.name}"
190
+ end
191
+ end # namespace :gem
192
+
193
+
194
+ desc 'Alias to gem:package'
195
+ task :gem => 'gem:package'
196
+
197
+ task :clobber => 'gem:clobber_package'
198
+ remove_desc_for_task 'gem:clobber_package'
199
+
200
+ # EOF
@@ -0,0 +1,40 @@
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
@@ -0,0 +1,27 @@
1
+
2
+ if HAVE_BONES
3
+
4
+ desc "Enumerate all annotations"
5
+ task :notes do |t|
6
+ id = if t.application.top_level_tasks.length > 1
7
+ t.application.top_level_tasks.slice!(1..-1).join(' ')
8
+ end
9
+ Bones::AnnotationExtractor.enumerate(
10
+ PROJ, PROJ.notes.tags.join('|'), id, :tag => true)
11
+ end
12
+
13
+ namespace :notes do
14
+ PROJ.notes.tags.each do |tag|
15
+ desc "Enumerate all #{tag} annotations"
16
+ task tag.downcase.to_sym do |t|
17
+ id = if t.application.top_level_tasks.length > 1
18
+ t.application.top_level_tasks.slice!(1..-1).join(' ')
19
+ end
20
+ Bones::AnnotationExtractor.enumerate(PROJ, tag, id)
21
+ end
22
+ end
23
+ end
24
+
25
+ end # if HAVE_BONES
26
+
27
+ # EOF
@@ -0,0 +1,34 @@
1
+
2
+ # This file does not define any rake tasks. It is used to load some project
3
+ # settings if they are not defined by the user.
4
+
5
+ PROJ.exclude << ["^#{Regexp.escape(PROJ.ann.file)}$",
6
+ "^#{Regexp.escape(PROJ.ignore_file)}$",
7
+ "^#{Regexp.escape(PROJ.rdoc.dir)}/",
8
+ "^#{Regexp.escape(PROJ.rcov.dir)}/"]
9
+
10
+ flatten_arrays = lambda do |this,os|
11
+ os.instance_variable_get(:@table).each do |key,val|
12
+ next if key == :dependencies \
13
+ or key == :development_dependencies
14
+ case val
15
+ when Array; val.flatten!
16
+ when OpenStruct; this.call(this,val)
17
+ end
18
+ end
19
+ end
20
+ flatten_arrays.call(flatten_arrays,PROJ)
21
+
22
+ PROJ.changes ||= paragraphs_of(PROJ.history_file, 0..1).join("\n\n")
23
+
24
+ PROJ.description ||= paragraphs_of(PROJ.readme_file, 'description').join("\n\n")
25
+
26
+ PROJ.summary ||= PROJ.description.split('.').first
27
+
28
+ PROJ.gem.files ||= manifest
29
+
30
+ PROJ.gem.executables ||= PROJ.gem.files.find_all {|fn| fn =~ %r/^bin/}
31
+
32
+ PROJ.rdoc.main ||= PROJ.readme_file
33
+
34
+ # EOF
@@ -0,0 +1,51 @@
1
+
2
+ require 'rake/rdoctask'
3
+
4
+ namespace :doc do
5
+
6
+ desc 'Generate RDoc documentation'
7
+ Rake::RDocTask.new do |rd|
8
+ rdoc = PROJ.rdoc
9
+ rd.main = rdoc.main
10
+ rd.rdoc_dir = rdoc.dir
11
+
12
+ incl = Regexp.new(rdoc.include.join('|'))
13
+ excl = Regexp.new(rdoc.exclude.join('|'))
14
+ files = PROJ.gem.files.find_all do |fn|
15
+ case fn
16
+ when excl; false
17
+ when incl; true
18
+ else false end
19
+ end
20
+ rd.rdoc_files.push(*files)
21
+
22
+ name = PROJ.name
23
+ rf_name = PROJ.rubyforge.name
24
+
25
+ title = "#{name}-#{PROJ.version} Documentation"
26
+ title = "#{rf_name}'s " + title if rf_name.valid? and rf_name != name
27
+
28
+ rd.options << "-t #{title}"
29
+ rd.options.concat(rdoc.opts)
30
+ end
31
+
32
+ desc 'Generate ri locally for testing'
33
+ task :ri => :clobber_ri do
34
+ sh "#{RDOC} --ri -o ri ."
35
+ end
36
+
37
+ task :clobber_ri do
38
+ rm_r 'ri' rescue nil
39
+ end
40
+
41
+ end # namespace :doc
42
+
43
+ desc 'Alias to doc:rdoc'
44
+ task :doc => 'doc:rdoc'
45
+
46
+ desc 'Remove all build products'
47
+ task :clobber => %w(doc:clobber_rdoc doc:clobber_ri)
48
+
49
+ remove_desc_for_task %w(doc:clobber_rdoc)
50
+
51
+ # EOF