hoe 1.12.2 → 2.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,36 @@
1
+ ##
2
+ # Clean plugin for hoe.
3
+ #
4
+ # === Tasks Provided:
5
+ #
6
+ # clean:: Clean up all the extras.
7
+
8
+ module Hoe::Clean
9
+ Hoe.plugin :clean # activate globally, fine for general purpose tasks
10
+
11
+ ##
12
+ # Optional: An array of file patterns to delete on clean.
13
+
14
+ attr_accessor :clean_globs
15
+
16
+ ##
17
+ # Initialize variables for plugin.
18
+
19
+ def initialize_clean
20
+ self.clean_globs ||= %w(diff diff.txt email.txt ri deps .source_index
21
+ *.gem **/*~ **/.*~ **/*.rbc coverage*)
22
+ end
23
+
24
+ ##
25
+ # Define tasks for plugin.
26
+
27
+ def define_clean_tasks
28
+ desc 'Clean up all the extras.'
29
+ task :clean => [ :clobber_docs, :clobber_package ] do
30
+ clean_globs.each do |pattern|
31
+ files = Dir[pattern]
32
+ rm_rf files, :verbose => true unless files.empty?
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,68 @@
1
+ ##
2
+ # Debug plugin for hoe.
3
+ #
4
+ # === Tasks Provided:
5
+ #
6
+ # check_manifest:: Verify the manifest.
7
+ # config_hoe:: Create a fresh ~/.hoerc file.
8
+ # debug_gem:: Show information about the gem.
9
+
10
+ module Hoe::Debug
11
+ Hoe.plugin :debug
12
+
13
+ # :stopdoc:
14
+
15
+ DIFF = if Hoe::WINDOZE
16
+ 'diff.exe'
17
+ else
18
+ if system("gdiff", __FILE__, __FILE__)
19
+ 'gdiff' # solaris and kin suck
20
+ else
21
+ 'diff'
22
+ end
23
+ end unless defined? DIFF
24
+
25
+ # :startdoc:
26
+
27
+ ##
28
+ # Define tasks for plugin.
29
+
30
+ def define_debug_tasks
31
+ desc 'Create a fresh ~/.hoerc file.'
32
+ task :config_hoe do
33
+ with_config do |config, path|
34
+ File.open(path, "w") do |f|
35
+ YAML.dump(Hoe::DEFAULT_CONFIG.merge(config), f)
36
+ end
37
+
38
+ editor = ENV['EDITOR'] || 'vi'
39
+ system "#{editor} #{path}" if ENV['SHOW_EDITOR'] != 'no'
40
+ end
41
+ end
42
+
43
+ desc 'Verify the manifest.'
44
+ task :check_manifest => :clean do
45
+ f = "Manifest.tmp"
46
+ require 'find'
47
+ files = []
48
+ with_config do |config, _|
49
+ exclusions = config["exclude"]
50
+ abort "exclude entry missing from .hoerc. Aborting." if exclusions.nil?
51
+ Find.find '.' do |path|
52
+ next unless File.file? path
53
+ next if path =~ exclusions
54
+ files << path[2..-1]
55
+ end
56
+ files = files.sort.join "\n"
57
+ File.open f, 'w' do |fp| fp.puts files end
58
+ system "#{DIFF} -du Manifest.txt #{f}"
59
+ rm f
60
+ end
61
+ end
62
+
63
+ desc 'Show information about the gem.'
64
+ task :debug_gem do
65
+ puts spec.to_ruby
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,169 @@
1
+ require 'rubygems/remote_fetcher'
2
+
3
+ ##
4
+ # Deps plugin for hoe.
5
+ #
6
+ # === Tasks Provided:
7
+ #
8
+ # check_extra_deps:: Install missing dependencies.
9
+ # deps:email:: Print a contact list for gems dependent on this gem
10
+ # deps:fetch:: Fetch all the dependent gems of this gem into tarballs
11
+ # deps:list:: List all the dependent gems of this gem
12
+
13
+ module Hoe::Deps
14
+ Hoe.plugin :deps
15
+
16
+ ##
17
+ # The main rubygems repository.
18
+
19
+ GEMURL = URI.parse 'http://gems.rubyforge.org'
20
+
21
+ ##
22
+ # Define tasks for plugin.
23
+
24
+ def define_deps_tasks
25
+ namespace :deps do
26
+ desc "List all the dependent gems of this gem"
27
+ task :list do
28
+ gems = self.get_gems_by_name
29
+ gem = gems[self.name]
30
+
31
+ abort "Couldn't find gem: #{self.name}" unless gem
32
+
33
+ deps = self.dependent_upon self.name
34
+ max = deps.map { |s| s.full_name.size }.max
35
+
36
+ puts " dependents:"
37
+ unless deps.empty? then
38
+ deps.sort_by { |spec| spec.full_name }.each do |spec|
39
+ vers = spec.dependencies.find {|s| s.name == name }.requirement_list
40
+ puts " %-*s - %s" % [max, spec.full_name, vers.join(", ")]
41
+ end
42
+ else
43
+ puts " none"
44
+ end
45
+ end
46
+
47
+ desc "Print a contact list for gems dependent on this gem"
48
+ task :email do
49
+ gems = self.get_gems_by_name
50
+ gem = gems[self.name]
51
+
52
+ abort "Couldn't find gem: #{self.name}" unless gem
53
+
54
+ deps = self.dependent_upon self.name
55
+
56
+ email = deps.map { |s| s.email }.flatten.sort.uniq
57
+ email = email.map { |s| s.split(/,\s*/) }.flatten.sort.uniq
58
+
59
+ email.map! { |s| # don't you people realize how easy this is?
60
+ s.gsub(/ at | _at_ |\s*(atmark|@nospam@|-at?-|@at?@|<at?>|\[at?\]|\(at?\))\s*/i, '@').gsub(/\s*(dot|\[d(ot)?\]|\.dot\.)\s*/i, '.').gsub(/\s+com$/, '.com')
61
+ }
62
+
63
+ bad, good = email.partition { |e| e !~ /^[\w.+-]+\@[\w.+-]+$/ }
64
+
65
+ warn "Rejecting #{bad.size} email. I couldn't unmunge them." unless
66
+ bad.empty?
67
+
68
+ puts good.join(", ")
69
+ end
70
+
71
+ desc "Fetch all the dependent gems of this gem into tarballs"
72
+ task :fetch do
73
+ gems = self.get_gems_by_name
74
+ gem = gems[self.name]
75
+ deps = self.dependent_upon self.name
76
+
77
+ mkdir "deps" unless File.directory? "deps"
78
+ Dir.chdir "deps" do
79
+ begin
80
+ deps.sort_by { |spec| spec.full_name }.each do |spec|
81
+ full_name = spec.full_name
82
+ tgz_name = "#{full_name}.tgz"
83
+ gem_name = "#{full_name}.gem"
84
+
85
+ next if File.exist? tgz_name
86
+ FileUtils.rm_rf [full_name, gem_name]
87
+
88
+ begin
89
+ warn "downloading #{full_name}"
90
+ Gem::RemoteFetcher.fetcher.download(spec, GEMURL, Dir.pwd)
91
+ FileUtils.mv "cache/#{gem_name}", '.'
92
+ rescue Gem::RemoteFetcher::FetchError
93
+ warn " failed"
94
+ next
95
+ end
96
+
97
+ warn "converting #{gem_name} to tarball"
98
+
99
+ system "gem unpack #{gem_name} 2> /dev/null"
100
+ system "gem spec -l #{gem_name} > #{full_name}/gemspec.rb"
101
+ system "tar zmcf #{tgz_name} #{full_name}"
102
+ FileUtils.rm_rf [full_name, gem_name, "cache"]
103
+ end
104
+ ensure
105
+ FileUtils.rm_rf "cache"
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ desc 'Install missing dependencies.'
112
+ task :check_extra_deps do
113
+ # extra_deps = [["rubyforge", ">= 1.0.0"], ["rake", ">= 0.8.1"]]
114
+ extra_deps.each do |dep|
115
+ begin
116
+ gem(*dep)
117
+ rescue Gem::LoadError
118
+ install_gem(*dep)
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ ##
125
+ # Return the rubygems source index.
126
+
127
+ def get_source_index
128
+ @@index ||= nil
129
+
130
+ return @@index if @@index
131
+
132
+ dump = unless File.exist? '.source_index' then
133
+ url = GEMURL + "Marshal.#{Gem.marshal_version}.Z"
134
+ dump = Gem::RemoteFetcher.fetcher.fetch_path url
135
+ dump = Gem.inflate dump
136
+ open '.source_index', 'wb' do |io| io.write dump end
137
+ dump
138
+ else
139
+ open '.source_index', 'rb' do |io| io.read end
140
+ end
141
+
142
+ @@index = Marshal.load dump
143
+ end
144
+
145
+ ##
146
+ # Return the latest rubygems.
147
+
148
+ def get_latest_gems
149
+ @@cache ||= get_source_index.latest_specs
150
+ end
151
+
152
+ ##
153
+ # Return a hash of the latest rubygems keyed by name.
154
+
155
+ def get_gems_by_name
156
+ @@by_name ||= Hash[*get_latest_gems.map { |gem|
157
+ [gem.name, gem, gem.full_name, gem]
158
+ }.flatten]
159
+ end
160
+
161
+ ##
162
+ # Return all the dependencies on the named rubygem.
163
+
164
+ def dependent_upon name
165
+ get_latest_gems.find_all { |gem|
166
+ gem.dependencies.any? { |dep| dep.name == name }
167
+ }
168
+ end
169
+ end
@@ -0,0 +1,35 @@
1
+ ##
2
+ # Flay plugin for hoe.
3
+ #
4
+ # === Tasks Provided:
5
+ #
6
+ # flay:: Analyze for code duplication.
7
+
8
+ module Hoe::Flay
9
+ Hoe.plugin :flay
10
+
11
+ ##
12
+ # Optional: flay threshold to determine threshold failure. [default: 1200-100]
13
+
14
+ attr_accessor :flay_threshold
15
+
16
+ ##
17
+ # Initialize variables for plugin.
18
+
19
+ def initialize_flay
20
+ self.flay_threshold ||= timebomb 1200, 100 # 80% of average :(
21
+ end
22
+
23
+ ##
24
+ # Define tasks for plugin.
25
+
26
+ def define_flay_tasks
27
+ begin
28
+ require 'flay'
29
+ require 'flay_task'
30
+ FlayTask.new :flay, self.flay_threshold
31
+ rescue Exception
32
+ # skip
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,35 @@
1
+ ##
2
+ # Flog plugin for hoe.
3
+ #
4
+ # === Tasks Provided:
5
+ #
6
+ # flog:: Analyze code complexity.
7
+
8
+ module Hoe::Flog
9
+ Hoe.plugin :flog
10
+
11
+ ##
12
+ # Optional: flog threshold to determine threshold failure. [default: 1500-200]
13
+
14
+ attr_accessor :flog_threshold
15
+
16
+ ##
17
+ # Initialize variables for plugin.
18
+
19
+ def initialize_flog
20
+ self.flog_threshold ||= timebomb 1500, 1000 # 80% of average :(
21
+ end
22
+
23
+ ##
24
+ # Define tasks for plugin.
25
+
26
+ def define_flog_tasks
27
+ begin
28
+ require 'flog'
29
+ require 'flog_task'
30
+ FlogTask.new :flog, self.flog_threshold
31
+ rescue Exception
32
+ # skip
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,58 @@
1
+ ##
2
+ # Hoe allows bundling of pre-compiled extensions in the +package+ task.
3
+ #
4
+ # To create a package for your current platform:
5
+ #
6
+ # rake package INLINE=1
7
+ #
8
+ # This will force Hoe analize your +Inline+ already compiled
9
+ # extensions and include them in your gem.
10
+ #
11
+ # If somehow you need to force a specific platform:
12
+ #
13
+ # rake package INLINE=1 FORCE_PLATFORM=mswin32
14
+ #
15
+ # This will set the +Gem::Specification+ platform to the one indicated in
16
+ # +FORCE_PLATFORM+ (instead of default Gem::Platform::CURRENT)
17
+
18
+ module Hoe::Inline
19
+
20
+ ##
21
+ # Define tasks for plugin.
22
+
23
+ def define_inline_tasks
24
+ if ENV['INLINE'] then
25
+ s.platform = ENV['FORCE_PLATFORM'] || Gem::Platform::CURRENT
26
+
27
+ # Try collecting Inline extensions for +name+
28
+ if defined?(Inline) then
29
+ directory 'lib/inline'
30
+
31
+ dlext = Config::CONFIG['DLEXT']
32
+
33
+ Inline.registered_inline_classes.each do |cls|
34
+ name = cls.name # TODO: what about X::Y::Z?
35
+ # name of the extension is CamelCase
36
+ alternate_name = if name =~ /[A-Z]/ then
37
+ name.gsub(/([A-Z])/, '_\1').downcase.sub(/^_/, '')
38
+ elsif name =~ /_/ then
39
+ name.capitalize.gsub(/_([a-z])/) { $1.upcase }
40
+ end
41
+ extensions = Dir.chdir(Inline::directory) {
42
+ Dir["Inline_{#{name},#{alternate_name}}_*.#{dlext}"]
43
+ }
44
+
45
+ extensions.each do |ext|
46
+ # add the inlined extension to the spec files
47
+ s.files += ["lib/inline/#{ext}"]
48
+
49
+ # include the file in the tasks
50
+ file "lib/inline/#{ext}" => ["lib/inline"] do
51
+ cp File.join(Inline::directory, ext), "lib/inline"
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,83 @@
1
+ ##
2
+ # Package plugin for hoe.
3
+ #
4
+ # === Tasks Provided:
5
+ #
6
+ # install_gem:: Install the package as a gem.
7
+ # release:: Package and upload the release to rubyforge.
8
+
9
+ module Hoe::Package
10
+ Hoe.plugin :package
11
+
12
+ ##
13
+ # Optional: Should package create a tarball? [default: true]
14
+
15
+ attr_accessor :need_tar
16
+
17
+ ##
18
+ # Optional: Should package create a zipfile? [default: false]
19
+
20
+ attr_accessor :need_zip
21
+
22
+ ##
23
+ # Initialize variables for plugin.
24
+
25
+ def initialize_package
26
+ self.need_tar ||= true
27
+ self.need_zip ||= false
28
+ end
29
+
30
+ ##
31
+ # Define tasks for plugin.
32
+
33
+ def define_package_tasks
34
+ Rake::GemPackageTask.new spec do |pkg|
35
+ pkg.need_tar = @need_tar
36
+ pkg.need_zip = @need_zip
37
+ end
38
+
39
+ desc 'Install the package as a gem.'
40
+ task :install_gem => [:clean, :package, :check_extra_deps] do
41
+ install_gem Dir['pkg/*.gem'].first
42
+ end
43
+
44
+ desc 'Package and upload the release to rubyforge.'
45
+ task :release => [:clean, :package] do |t|
46
+ v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
47
+ abort "Versions don't match #{v} vs #{version}" if v != version
48
+ pkg = "pkg/#{name}-#{version}"
49
+
50
+ if $DEBUG then
51
+ puts "release_id = rf.add_release #{rubyforge_name.inspect}, #{name.inspect}, #{version.inspect}, \"#{pkg}.tgz\""
52
+ puts "rf.add_file #{rubyforge_name.inspect}, #{name.inspect}, release_id, \"#{pkg}.gem\""
53
+ end
54
+
55
+ rf = RubyForge.new.configure
56
+ puts "Logging in"
57
+ rf.login
58
+
59
+ c = rf.userconfig
60
+ c["release_notes"] = description if description
61
+ c["release_changes"] = changes if changes
62
+ c["preformatted"] = true
63
+
64
+ files = [(@need_tar ? "#{pkg}.tgz" : nil),
65
+ (@need_zip ? "#{pkg}.zip" : nil),
66
+ "#{pkg}.gem"].compact
67
+
68
+ puts "Releasing #{name} v. #{version}"
69
+ rf.add_release rubyforge_name, name, version, *files
70
+ end
71
+ end
72
+
73
+ ##
74
+ # Install the named gem.
75
+
76
+ def install_gem name, version = nil
77
+ gem_cmd = Gem.default_exec_format % 'gem'
78
+ sudo = 'sudo ' unless Hoe::WINDOZE
79
+ local = '--local' unless version
80
+ version = "--version '#{version}'" if version
81
+ sh "#{sudo}#{gem_cmd} install #{local} #{name} #{version}"
82
+ end
83
+ end