rookie 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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