rubygems-tasks 0.1.0.pre1

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,120 @@
1
+ require 'rubygems/tasks/task'
2
+
3
+ module Gem
4
+ class Tasks
5
+ module SCM
6
+ #
7
+ # The `scm:tag` task.
8
+ #
9
+ class Tag < Task
10
+
11
+ # Default format for versions
12
+ DEFAULT_FORMAT = '%s'
13
+
14
+ # The format for version tags.
15
+ #
16
+ # @return [String, Proc]
17
+ # The format String or Proc.
18
+ #
19
+ attr_accessor :format
20
+
21
+ #
22
+ # Initializes the `scm:tag` task.
23
+ #
24
+ # @param [Hash] options
25
+ # Additional options.
26
+ #
27
+ # @option options [String, Proc] :format (DEFAULT_FORMAT)
28
+ # The format String or Proc for version tags.
29
+ #
30
+ def initialize(options={})
31
+ super()
32
+
33
+ @format = options.fetch(:format,DEFAULT_FORMAT)
34
+
35
+ yield self if block_given?
36
+ define
37
+ end
38
+
39
+ #
40
+ # Defines the `scm:tag` task.
41
+ #
42
+ def define
43
+ namespace :scm do
44
+ task :tag, [:name] do |t,args|
45
+ tag = if args.name
46
+ args.name
47
+ else
48
+ version_tag(@project.gemspecs.values.first.version)
49
+ end
50
+
51
+ status "Tagging #{tag} ..."
52
+
53
+ unless tag!(tag)
54
+ error "Could not create tag #{tag}"
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ #
61
+ # Formats the version into a version tag.
62
+ #
63
+ # @param [String] version
64
+ # The version to be formatted.
65
+ #
66
+ # @return [String]
67
+ # The tag for the version.
68
+ #
69
+ # @raise [TypeError]
70
+ # {#format} was not a String or a Proc.
71
+ #
72
+ def version_tag(version)
73
+ case @format
74
+ when String
75
+ (@format % version)
76
+ when Proc
77
+ @format[version]
78
+ else
79
+ raise(TypeError,"tag format must be a String or Proc")
80
+ end
81
+ end
82
+
83
+ #
84
+ # Creates a tag.
85
+ #
86
+ # @param [String] name
87
+ # The name of the tag.
88
+ #
89
+ # @return [Boolean]
90
+ # Specifies whether the tag was successfully created.
91
+ #
92
+ def tag!(name)
93
+ case @project.scm
94
+ when :git then run 'git', 'tag', name
95
+ when :hg then run 'hg', 'tag', name
96
+ when :svn
97
+ branch = File.basename(@project.root)
98
+ tags_dir = if branch == 'trunk'
99
+ # we are in trunk/
100
+ File.join('..','tags')
101
+ else
102
+ # must be within branches/$name/
103
+ File.join('..','..','tags')
104
+ end
105
+
106
+ tag_dir = File.join(tag_dirs,name)
107
+
108
+ mkdir_p tags_dir
109
+ cp_r '.', tag_dir
110
+
111
+ return run('svn', 'add', tag_dir)
112
+ else
113
+ true
114
+ end
115
+ end
116
+
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,2 @@
1
+ require 'rubygems/tasks/sign/checksum'
2
+ require 'rubygems/tasks/sign/pgp'
@@ -0,0 +1,111 @@
1
+ require 'rubygems/tasks/sign/task'
2
+
3
+ require 'digest'
4
+
5
+ module Gem
6
+ class Tasks
7
+ module Sign
8
+ #
9
+ # The `sign:checksum` task.
10
+ #
11
+ class Checksum < Task
12
+
13
+ # Enables or disables MD5 checksums.
14
+ attr_writer :md5
15
+
16
+ # Enables or disables SHA1 checksums.
17
+ attr_writer :sha1
18
+
19
+ # Enables or disables SHA2 checksums.
20
+ attr_writer :sha2
21
+
22
+ # Enables or disables SHA512 checksums.
23
+ attr_writer :sha512
24
+
25
+ #
26
+ # Initializes the `sign:checksum` task.
27
+ #
28
+ # @param [Hash] options
29
+ # Digest options.
30
+ #
31
+ # @option options [Boolean] :md5 (true)
32
+ # Specifies whether MD5 checksums are enabled.
33
+ #
34
+ # @option options [Boolean] :sha1 (true)
35
+ # Specifies whether SHA1 checksums are enabled.
36
+ #
37
+ # @option options [Boolean] :sha2 (false)
38
+ # Specifies whether SHA2 checksums are enabled.
39
+ #
40
+ # @option options [Boolean] :sha512 (false)
41
+ # Specifies whether SHA512 checksums are enabled.
42
+ #
43
+ def initialize(options={})
44
+ super()
45
+
46
+ @md5 = options.fetch(:md5, true)
47
+ @sha1 = options.fetch(:sha1, true)
48
+ @sha2 = options.fetch(:sha2, false)
49
+ @sha512 = options.fetch(:sha512,false)
50
+
51
+ yield self if block_given?
52
+ define
53
+ end
54
+
55
+ #
56
+ # Specifies whether MD5 checksums are enabled.
57
+ #
58
+ # @return [Boolean]
59
+ #
60
+ def md5?; @md5; end
61
+
62
+ #
63
+ # Specifies whether SHA1 checksums are enabled.
64
+ #
65
+ # @return [Boolean]
66
+ #
67
+ def sha1?; @sha1; end
68
+
69
+ #
70
+ # Specifies whether SHA2 checksums are enabled.
71
+ #
72
+ # @return [Boolean]
73
+ #
74
+ def sha2?; @sha2; end
75
+
76
+ #
77
+ # Specifies whether SHA512 checksums are enabled.
78
+ #
79
+ # @return [Boolean]
80
+ #
81
+ def sha512?; @sha512; end
82
+
83
+ #
84
+ # Defines the `sign:checksum` tasks.
85
+ #
86
+ def define
87
+ sign_task :checksum
88
+ task :checksum => 'sign:checksum'
89
+ end
90
+
91
+ #
92
+ # Prints the checksums of a package.
93
+ #
94
+ # @param [String] path
95
+ # The path to the package.
96
+ #
97
+ def sign(path)
98
+ status "Checksums for #{File.basename(path)}:"
99
+
100
+ puts
101
+ puts " md5: #{Digest::MD5.file(path)}" if @md5
102
+ puts " sha1: #{Digest::SHA1.file(path)}" if @sha1
103
+ puts " sha2: #{Digest::SHA2.file(path)}" if @sha2
104
+ puts " sha512: #{Digest::SHA512.file(path)}" if @sha512
105
+ puts
106
+ end
107
+
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,48 @@
1
+ require 'rubygems/tasks/sign/task'
2
+
3
+ module Gem
4
+ class Tasks
5
+ module Sign
6
+ #
7
+ # The `sign:pgp` task.
8
+ #
9
+ class PGP < Task
10
+
11
+ #
12
+ # Initializes the `sign` task.
13
+ #
14
+ # @param [Hash] options
15
+ # Digest options.
16
+ #
17
+ def initialize(options={})
18
+ super()
19
+
20
+ yield self if block_given?
21
+ define
22
+ end
23
+
24
+ #
25
+ # Defines the `sign:pgp` task.
26
+ #
27
+ def define
28
+ sign_task :pgp
29
+
30
+ task :pgp => 'sign:pgp'
31
+ end
32
+
33
+ #
34
+ # PGP signs a package.
35
+ #
36
+ # @param [String] path
37
+ # The path to the package.
38
+ #
39
+ def sign(path)
40
+ status "Signing #{File.basename(path)} ..."
41
+
42
+ run 'gpg', '--sign', path
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,56 @@
1
+ require 'rubygems/tasks/task'
2
+
3
+ require 'digest'
4
+
5
+ module Gem
6
+ class Tasks
7
+ module Sign
8
+ class Task < Tasks::Task
9
+
10
+ #
11
+ # Signs a package.
12
+ #
13
+ # @param [String] path
14
+ # The path to the package.
15
+ #
16
+ # @abstract
17
+ #
18
+ def sign(path)
19
+ end
20
+
21
+ protected
22
+
23
+ #
24
+ # Defines signing tasks for the various packages.
25
+ #
26
+ # @param [Symbol] name
27
+ # The name for the `sign:` task.
28
+ #
29
+ def sign_task(name)
30
+ @project.builds.each do |build,packages|
31
+ packages.each do |format,path|
32
+ namespace :sign do
33
+ namespace name do
34
+ namespace build do
35
+ task format => path do
36
+ sign(path)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ multi_task "sign:#{name}:#{build}", packages.keys
44
+
45
+ task "sign:#{name}" => "sign:#{name}:#{build}"
46
+ task "sign:#{build}" => "sign:#{name}:#{build}"
47
+
48
+ desc "Signs all packages" unless task?(:sign)
49
+ task :sign => "sign:#{name}:#{build}"
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,141 @@
1
+ require 'rubygems/tasks/project'
2
+ require 'rubygems/tasks/printing'
3
+
4
+ require 'rake/tasklib'
5
+
6
+ module Gem
7
+ class Tasks
8
+ class Task < Rake::TaskLib
9
+
10
+ include Printing
11
+
12
+ def initialize
13
+ @project = Project.directories[Dir.pwd]
14
+ end
15
+
16
+ #
17
+ # The task name for the class.
18
+ #
19
+ # @return [String]
20
+ # The task name for the class.
21
+ #
22
+ # @api public
23
+ #
24
+ def self.task_name
25
+ @task_name ||= name.split('::').last.downcase
26
+ end
27
+
28
+ protected
29
+
30
+ #
31
+ # Runs a command.
32
+ #
33
+ # @param [String] command
34
+ # The command to run.
35
+ #
36
+ # @param [Array<String>] arguments
37
+ # Additional arguments for the command.
38
+ #
39
+ # @return [Boolean]
40
+ # Specifies whether the command was successful.
41
+ #
42
+ # @api semipublic
43
+ #
44
+ def run(command,*arguments)
45
+ show_command = [command, *arguments].join(' ')
46
+
47
+ debug show_command
48
+
49
+ unless system(command,*arguments)
50
+ error "Command failed: #{show_command}"
51
+ abort
52
+ end
53
+
54
+ return true
55
+ end
56
+
57
+ #
58
+ # Runs a `gem` command.
59
+ #
60
+ # @param [String] command
61
+ # The `gem` command to run.
62
+ #
63
+ # @param [Array<String>] command
64
+ # Additional arguments for the command.
65
+ #
66
+ # @return [Boolean]
67
+ # Specifies whether the command was successful.
68
+ #
69
+ # @api semipublic
70
+ #
71
+ def gem(command,*arguments)
72
+ run 'gem', command, *arguments
73
+ end
74
+
75
+ #
76
+ # Runs a `bundle` command.
77
+ #
78
+ # @param [String] command
79
+ # The `bundle` command to run.
80
+ #
81
+ # @param [Array<String>] arguments
82
+ # Additional arguments for the command.
83
+ #
84
+ # @return [Boolean]
85
+ # Specifies whether the command was successful.
86
+ #
87
+ # @api semipublic
88
+ #
89
+ def bundle(command,*arguments)
90
+ run 'bundler', command, *arguments
91
+ end
92
+
93
+ #
94
+ # Determines if a task was defined.
95
+ #
96
+ # @param [Symbol, String] name
97
+ # The task name to search for.
98
+ #
99
+ # @return [Boolean]
100
+ # Specifies whether the task was defined.
101
+ #
102
+ # @api semipublic
103
+ #
104
+ def task?(name)
105
+ Rake::Task.task_defined?(name)
106
+ end
107
+
108
+ #
109
+ # Defines a task that will invoke one or all of the specifies tasks
110
+ # within the namespace.
111
+ #
112
+ # @param [String] namespace
113
+ # The namespace of the sub-tasks to call.
114
+ #
115
+ # @param [Array<Symbol>] names
116
+ # The names of the sub-tasks.
117
+ #
118
+ # @example
119
+ # gemspec_tasks 'pkg:tar'
120
+ #
121
+ # @api semipublic
122
+ #
123
+ def multi_task(prefix,names)
124
+ task prefix => names.map { |name| "#{prefix}:#{name}" }
125
+ end
126
+
127
+ #
128
+ # Defines a task that will execute tasks for each gemspec.
129
+ #
130
+ # @param [Symbol, String] name
131
+ # The name for the task.
132
+ #
133
+ # @api semipublic
134
+ #
135
+ def gemspec_tasks(name)
136
+ multi_task name, @project.gemspecs.keys
137
+ end
138
+
139
+ end
140
+ end
141
+ end