rookie 0.2.1 → 0.3.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.
data/README.markdown CHANGED
@@ -2,11 +2,23 @@
2
2
 
3
3
  Simple Rake tasks that make life easier.
4
4
 
5
+ # Installation
6
+
7
+ Latest version:
8
+
9
+ gem install rookie
10
+
11
+ From source:
12
+
13
+ git clone git://github.com/matheusmoreira/rookie.git
14
+
15
+ # Introduction
16
+
5
17
  Putting this in your `Rakefile`:
6
18
 
7
19
  require 'rookie'
8
20
 
9
- Rookie::Tasks.new 'simple.gemspec'
21
+ Rookie::Tasks.new('simple.gemspec').define_tasks!
10
22
 
11
23
  Gets you a whole set of nice commands to work with your gem. Run `rake -T` for
12
24
  details.
data/Rakefile CHANGED
@@ -1,3 +1,3 @@
1
1
  require 'rookie'
2
2
 
3
- Rookie::Tasks.new 'rookie.gemspec'
3
+ Rookie::Tasks.new('rookie.gemspec').define_tasks!
data/lib/rookie.rb CHANGED
@@ -1,2 +1,6 @@
1
+ # A collection of Rake tasks.
2
+ module Rookie
3
+ end
4
+
1
5
  require 'rookie/tasks'
2
6
  require 'rookie/version'
data/lib/rookie/tasks.rb CHANGED
@@ -4,31 +4,50 @@ require 'rookie/tasks/git'
4
4
  require 'rake/tasklib'
5
5
 
6
6
  module Rookie
7
+
8
+ # Provides many useful tasks, like the Gem, Git and Console tasks.
9
+ #
10
+ # Don't forget to call #define_tasks! after creating an instance of this
11
+ # class!
7
12
  class Tasks < ::Rake::TaskLib
8
13
 
9
- attr_accessor :gem, :git, :console
14
+ # The Gem task.
15
+ attr_accessor :gem
16
+
17
+ # The Git task.
18
+ attr_accessor :git
19
+
20
+ # The Console task.
21
+ attr_accessor :console
10
22
 
11
- def initialize(gemspec = nil, opts = {})
23
+ # Initializes the tasks with the given gem specification and options.
24
+ #
25
+ # Yields the new instance if given a block.
26
+ def initialize(gemspec, opts = {})
12
27
  self.gem = Tasks::Gem.new gemspec
13
28
  self.git = Tasks::Git.new gem.spec.version.to_s
14
29
  self.console = Tasks::Console.new gem.spec, opts
15
30
  yield self if block_given?
16
- define
17
31
  end
18
32
 
19
- def define
33
+ # Defines the tasks for all initialized (not +nil+) tasks.
34
+ def define_tasks!
20
35
  setup_tasks, clean_tasks, release_tasks = [], [], []
21
36
 
22
37
  if git
38
+ git.define_tasks!
23
39
  release_tasks << 'git:release'
24
40
  end
25
41
 
26
42
  if gem
43
+ gem.define_tasks!
27
44
  setup_tasks << 'gem:setup'
28
45
  clean_tasks << 'gem:clean'
29
46
  release_tasks << 'gem:release'
30
47
  end
31
48
 
49
+ console.define_tasks! if console
50
+
32
51
  desc 'Setup project'
33
52
  task :setup => setup_tasks
34
53
 
@@ -42,4 +61,5 @@ module Rookie
42
61
  end
43
62
 
44
63
  end
64
+
45
65
  end
@@ -2,32 +2,59 @@ require 'rake/tasklib'
2
2
 
3
3
  module Rookie
4
4
  class Tasks < ::Rake::TaskLib
5
+
6
+ # This task provides an easy way to interactively test your gem by
7
+ # automatically loading and requiring it in an interactive ruby session.
5
8
  class Console < ::Rake::TaskLib
6
9
 
7
- attr_accessor :spec, :program
10
+ # The gem specification.
11
+ attr_accessor :spec
12
+
13
+ # The name of the program to invoke.
14
+ attr_accessor :program
15
+
16
+ # The full command to execute.
8
17
  attr_writer :command
9
18
 
19
+ # Unless set explicitly, will be automatically generated from the #program
20
+ # name and gem specification.
10
21
  def command
11
22
  @command ||= generate_command_string
12
23
  end
13
24
 
25
+ # Creates a new console task with the given parameters. Options may
26
+ # specify:
27
+ #
28
+ # [:program] the name of the program to invoke; +irb+ by default.
29
+ # [:command] the full command to execute. Use if the command you want to
30
+ # run doesn't take the <tt>-I</tt> and <tt>-r</tt> command
31
+ # line arguments.
32
+ #
33
+ # Yields the instance if given a block.
34
+ #
35
+ # Tasks do not get defined automatically; don't forget to call
36
+ # #define_tasks!
14
37
  def initialize(spec, opts = {})
15
38
  self.spec = spec
16
- self.program = opts.fetch :program, 'irb'
39
+ self.program = opts.fetch :program, :irb
17
40
  self.command = opts.fetch :command, nil
18
41
  yield self if block_given?
19
- define
20
42
  end
21
43
 
22
- def define
23
- desc 'Starts an interactive ruby session with your gem loaded'
44
+ # Defines the console task.
45
+ def define_tasks!
46
+ desc 'Starts an interactive ruby session with the gem loaded'
24
47
  task :console do
25
48
  sh command
26
49
  end
27
50
  end
28
51
 
52
+ # Generates a command string from this task's #program name and gem
53
+ # specification. For example:
54
+ #
55
+ # irb -I lib -r gem_name
29
56
  def generate_command_string
30
- program.dup.tap do |command_string|
57
+ program.to_s.dup.tap do |command_string|
31
58
  spec.require_paths.each do |path|
32
59
  command_string << ' -I ' << path
33
60
  end
@@ -36,5 +63,6 @@ module Rookie
36
63
  end
37
64
 
38
65
  end
66
+
39
67
  end
40
68
  end
@@ -1,54 +1,84 @@
1
- require 'rake/tasklib'
2
1
  require 'fileutils'
2
+ require 'rake/tasklib'
3
3
 
4
4
  module Rookie
5
5
  class Tasks < ::Rake::TaskLib
6
+
7
+ # Adds various gem management tasks that allows you to build, install,
8
+ # uninstall and release your gem with ease.
6
9
  class Gem < ::Rake::TaskLib
7
10
 
8
- attr_reader :spec, :dir
11
+ # The gem specification.
12
+ attr_reader :spec
9
13
 
14
+ # The directory where <tt>.gem</tt> files will be stored. <tt>'gem'</tt>
15
+ # by default.
16
+ #
17
+ # This directory will be completely erased by the +clean+ task. Make sure
18
+ # it is not in use!
19
+ attr_reader :dir
20
+
21
+ # Sets this task's gem specification. Loads it from a file if given a
22
+ # string.
10
23
  def spec=(gemspec)
11
24
  @spec = case gemspec
12
- when ::Gem::Specification
13
- gemspec
14
- when String
15
- ::Gem::Specification.load gemspec if gemspec and File.readable? gemspec
16
- else
17
- nil
25
+ when ::Gem::Specification then gemspec
26
+ when String then ::Gem::Specification.load gemspec if File.readable? gemspec
27
+ else nil
18
28
  end
19
29
  end
20
30
 
31
+ # The directory where packaged gems will be stored. Always relative to the
32
+ # current directory.
33
+ #
34
+ # This directory will be completely erased by the +clean+ task. Make sure
35
+ # it is not in use!
21
36
  def dir=(dir)
22
37
  @dir = File.expand_path File.join(Dir.pwd, dir)
23
38
  end
24
39
 
40
+ # Creates a new gem task with the given gem specification and temporary
41
+ # gem directory.
42
+ #
43
+ # Tasks do not get defined automatically; don't forget to call
44
+ # #define_tasks!
25
45
  def initialize(gemspec = nil, gem_dir = 'gem')
26
46
  self.spec = gemspec
27
47
  self.dir = gem_dir
28
48
  yield self if block_given?
29
- define
30
49
  end
31
50
 
51
+ # The name of the packaged gem file.
52
+ def gem_file_name
53
+ "#{spec.name}-#{spec.version}.gem"
54
+ end
55
+
56
+ # The full path to the gem file.
32
57
  def gem_file
33
- File.join dir, "#{spec.name}-#{spec.version}.gem"
58
+ File.join dir, gem_file_name
34
59
  end
35
60
 
61
+ # Builds the gem from the specification and moves it to the gem directory.
36
62
  def build_gem
37
63
  FileUtils.mkdir_p dir
38
64
  gem = ::Gem::Builder.new(spec).build
39
65
  FileUtils.mv gem, dir
40
66
  end
41
67
 
68
+ # Executes a gem command.
42
69
  def gem(cmd, arg = gem_file)
43
70
  "gem #{cmd} #{arg}"
44
71
  end
45
72
 
73
+ # Removes the gem directory.
46
74
  def clean!
47
75
  FileUtils.rm_rf dir
48
76
  end
49
77
 
50
- def define
78
+ # Defines the gem tasks.
79
+ def define_tasks!
51
80
  directory dir
81
+
52
82
  namespace :gem do
53
83
  desc 'Builds the gem from the specification'
54
84
  task :build => dir do
@@ -60,7 +90,7 @@ module Rookie
60
90
  sh gem :push
61
91
  end
62
92
 
63
- desc 'Same as gem:release'
93
+ desc 'Same as gem:push'
64
94
  task :release => :push
65
95
 
66
96
  desc 'Installs the gem locally'
@@ -81,10 +111,12 @@ module Rookie
81
111
  desc 'Installs the gem locally and cleans up'
82
112
  task :setup => [ :install, :clean ]
83
113
  end
114
+
84
115
  desc 'Same as gem:build'
85
116
  task :gem => 'gem:build'
86
117
  end
87
118
 
88
119
  end
120
+
89
121
  end
90
122
  end
@@ -4,29 +4,49 @@ require 'rake/tasklib'
4
4
 
5
5
  module Rookie
6
6
  class Tasks < ::Rake::TaskLib
7
+
8
+ # This task provides a way to quickly and easily release git projects using
9
+ # a gem specification.
7
10
  class Git < ::Rake::TaskLib
8
11
 
9
- attr_accessor :release_version, :working_directory
12
+ # The version the project will be released under.
13
+ attr_accessor :release_version
14
+
15
+ # Directory which contains the git repository.
16
+ attr_accessor :working_directory
17
+
18
+ # Logger which will be used to log the git messages. Logs to SDTOUT by
19
+ # default.
10
20
  attr_writer :logger
11
21
 
22
+ # Lazily created logger.
12
23
  def logger
13
24
  @logger ||= create_logger
14
25
  end
15
26
 
27
+ # Creates a new git task with the given parameters. Yields the instance
28
+ # if given a block.
29
+ #
30
+ # Tasks do not get defined automatically; don't forget to call
31
+ # #define_tasks!
16
32
  def initialize(release_version = nil, working_dir = Dir.pwd, logger = nil)
17
33
  self.logger = logger
18
34
  self.working_directory = working_dir
19
35
  self.release_version = release_version
20
36
  yield self if block_given?
21
- define
22
37
  end
23
38
 
39
+ # Computes a release tag for the given version.
24
40
  def release_tag(version = release_version)
25
- "v#{version.to_s}"
41
+ "v#{version}"
26
42
  end
27
43
 
44
+ # Tags the latest commit in the repository with the given tag name.
45
+ #
46
+ # If the tag is invalid or already in the repository, an error will be
47
+ # raised prior to tagging.
28
48
  def tag!(tag_name)
29
- raise "Tag '#{tag_name.inspect}' is invalid" if tag_name.nil? or tag_name.empty?
49
+ raise "Tag '#{tag_name}' is invalid" if tag_name.nil? or tag_name.empty?
30
50
  if already_tagged? tag_name
31
51
  raise "Tag '#{tag_name}' already in repository"
32
52
  else
@@ -34,20 +54,29 @@ module Rookie
34
54
  end
35
55
  end
36
56
 
57
+ # Pushes the changes in the given branch to the given remote repository.
58
+ #
59
+ # Tags will be pushed too if +tags+ is +true+.
37
60
  def push!(remote = 'origin', branch = 'master', tags = false)
38
61
  git.push remote, branch, tags
39
62
  end
40
63
 
64
+ # Tags the latest commit with the given version tag and pushes the given
65
+ # branch to the given remote repository, including tags.
41
66
  def release!(version_tag = release_tag, remote = 'origin', branch = 'master')
42
67
  tag! version_tag
43
68
  push! remote, branch, true
44
69
  end
45
70
 
71
+ # Returns whether the repository already contains the given tag name.
46
72
  def already_tagged?(tag_name)
47
- git.tag tag_name rescue nil
73
+ git.tag tag_name
74
+ rescue ::Git::GitTagNameDoesNotExist
75
+ false
48
76
  end
49
77
 
50
- def define
78
+ # Defines the git tasks.
79
+ def define_tasks!
51
80
  namespace :git do
52
81
  desc 'Tags latest commit with the given tag name'
53
82
  task :tag, :tag_name do |task, args|
@@ -78,10 +107,12 @@ module Rookie
78
107
 
79
108
  protected
80
109
 
110
+ # Lazily created git handle. Uses the logger returned by #logger.
81
111
  def git
82
112
  @git ||= ::Git.open working_directory, :log => logger
83
113
  end
84
114
 
115
+ # Creates a logger to STDOUT at INFO level with a custom formatter.
85
116
  def create_logger
86
117
  ::Logger.new(STDOUT).tap do |logger|
87
118
  logger.level = ::Logger::INFO
@@ -90,5 +121,6 @@ module Rookie
90
121
  end
91
122
 
92
123
  end
124
+
93
125
  end
94
126
  end
@@ -1,12 +1,32 @@
1
1
  module Rookie
2
+
3
+ # Rookie's version.
2
4
  module Version
3
5
 
6
+ # Major version.
7
+ #
8
+ # Increments denote backward-incompatible changes and additions.
4
9
  MAJOR = 0
5
- MINOR = 2
6
- PATCH = 1
10
+
11
+ # Minor version.
12
+ #
13
+ # Increments denote backward-compatible changes and additions.
14
+ MINOR = 3
15
+
16
+ # Patch version.
17
+ #
18
+ # Increments denote changes in implementation.
19
+ PATCH = 0
20
+
21
+ # Build version.
22
+ #
23
+ # Used for pre-release versions.
7
24
  BUILD = nil
8
25
 
26
+ # Complete version string, which is every individual version number joined
27
+ # by a dot (<tt>'.'</tt>), in descending order of prescedence.
9
28
  STRING = [ MAJOR, MINOR, PATCH, BUILD ].compact.join '.'
10
29
 
11
30
  end
31
+
12
32
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rookie
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-30 00:00:00.000000000 Z
12
+ date: 2012-01-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &14547320 !ruby/object:Gem::Requirement
16
+ requirement: &12451360 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *14547320
24
+ version_requirements: *12451360
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: git
27
- requirement: &14550400 !ruby/object:Gem::Requirement
27
+ requirement: &12453220 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *14550400
35
+ version_requirements: *12453220
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bundler
38
- requirement: &14553060 !ruby/object:Gem::Requirement
38
+ requirement: &12455200 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *14553060
46
+ version_requirements: *12455200
47
47
  description: Simple Rake tasks that make life easier.
48
48
  email: matheus.a.m.moreira@gmail.com
49
49
  executables: []
@@ -78,7 +78,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
78
78
  version: '0'
79
79
  segments:
80
80
  - 0
81
- hash: -4064470574437623325
81
+ hash: -1447020639505331606
82
82
  required_rubygems_version: !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
@@ -87,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
87
  version: '0'
88
88
  segments:
89
89
  - 0
90
- hash: -4064470574437623325
90
+ hash: -1447020639505331606
91
91
  requirements: []
92
92
  rubyforge_project:
93
93
  rubygems_version: 1.8.10