Fingertips-jewelry_portfolio 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -16,18 +16,29 @@ Jeweler[http://github.com/technicalpickles/jeweler/tree/master] does.
16
16
  First things first; create a GitHub pages repository if you haven't done so
17
17
  already. See http://github.com/guides/pages for more info.
18
18
 
19
- Then create the following files, and content, in the gh-pages branch of your
19
+ Then create the following files, and content, in the master branch of your
20
20
  pages repository (<em>for a more elaborate example see:
21
- http://github.com/alloy/alloy.github.com/tree/gh-pages</em>):
21
+ http://github.com/alloy/alloy.github.com/tree/master</em>):
22
22
 
23
23
  * <b>Rakefile:</b>
24
24
 
25
25
  require 'jewelry_portfolio/tasks'
26
26
  JewelryPortfolio::Tasks.new do |t|
27
- # Only specify the account if it's different from `github.user' in the git config.
28
- t.account = 'Fingertips'
27
+ t.account = 'Fingertips'
28
+ t.name = 'passengerpane'
29
+ t.version = '1.2.0'
30
+ t.summary = 'A short summary about the project.'
31
+ t.description = 'A longer description about the project.'
29
32
  end
30
33
 
34
+ The +account+ is only necessary when you haven't configured github.user in
35
+ the local or global git config. (For more info see:
36
+ http://github.com/guides/local-github-config.) Or if you want to override the
37
+ +account+ that was retrieved from the git config.
38
+
39
+ The other attributes are only necessary when there's no gemspec file in the
40
+ work directory.
41
+
31
42
  * <b>template.html.erb:</b>
32
43
 
33
44
  This is the main template file which will be used to generate the index.html
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :minor: 1
3
- :patch: 1
4
2
  :major: 0
3
+ :minor: 2
4
+ :patch: 0
@@ -5,21 +5,24 @@ require 'jewelry_portfolio/template'
5
5
  class JewelryPortfolio
6
6
  class FileMissingError < StandardError; end
7
7
 
8
- attr_reader :account, :spec, :index, :template
8
+ attr_reader :account, :repo, :index, :template
9
9
 
10
10
  # Initializes a JewelryPortfolio instance for the specified +account+.
11
11
  #
12
- # If an optional +spec+ is provided it will be added to, or updated in, the
13
- # index. If no +spec+ is provided it is assumed you are working in a clone of
12
+ # If an optional +repo+ is provided it will be added to, or updated in, the
13
+ # index. If no +repo+ is provided it is assumed you are working in a clone of
14
14
  # your GitHub pages repo. In this case no fetching and merging will be
15
15
  # performed.
16
- def initialize(account, spec = nil)
16
+ def initialize(account, repo = nil)
17
+ raise ArgumentError, "No `account' given." unless account
18
+ raise ArgumentError, "No valid `repo' given." if repo && !repo.valid?
19
+
17
20
  @account = account
18
- @spec = spec
19
- @index = ReposIndex.new(@account, (Dir.pwd unless @spec))
21
+ @repo = repo
22
+ @index = ReposIndex.new(@account, (Dir.pwd unless @repo))
20
23
  @template = Template.new(File.join(@index.path, 'template'), @index.repos)
21
24
 
22
- @index.add(@spec) if @spec
25
+ @index.add(@repo) if @repo
23
26
  end
24
27
 
25
28
  # Renders the index.html file.
@@ -38,8 +41,8 @@ class JewelryPortfolio
38
41
  private
39
42
 
40
43
  def commit_message
41
- if @spec
42
- "Updated github pages for: #{@spec.name}-#{@spec.version}"
44
+ if @repo
45
+ "Updated github pages for: #{@repo.name}-#{@repo.version}"
43
46
  else
44
47
  "Re-generated github pages"
45
48
  end
@@ -1,14 +1,42 @@
1
1
  class JewelryPortfolio
2
2
  class Repo
3
- attr_accessor :spec, :account
3
+ class InvalidError < StandardError; end
4
4
 
5
- def initialize(spec, account)
6
- @spec, @account = spec, account
5
+ # The GitHub user account that this repo belongs to.
6
+ attr_accessor :account
7
+
8
+ # The name of the repo.
9
+ #
10
+ # Not needed when initialized with a Gem::Specification.
11
+ attr_accessor :name
12
+
13
+ # The version of the current version of the project.
14
+ #
15
+ # Not needed when initialized with a Gem::Specification.
16
+ attr_accessor :version
17
+
18
+ # The summary of the project.
19
+ #
20
+ # Not needed when initialized with a Gem::Specification.
21
+ attr_accessor :summary
22
+
23
+ # The description of the project.
24
+ #
25
+ # Not needed when initialized with a Gem::Specification.
26
+ attr_accessor :description
27
+
28
+ def initialize(account = nil, spec = nil)
29
+ @account = account
30
+ @gem = !spec.nil?
31
+
32
+ %w{ name version summary description }.each do |attr|
33
+ send("#{attr}=", spec.send(attr).to_s)
34
+ end if spec
7
35
  end
8
36
 
9
- # Returns the name of the gem.
10
- def name
11
- @spec.name
37
+ # Returns whether or not there's a Ruby gem for this repo.
38
+ def gem?
39
+ @gem
12
40
  end
13
41
 
14
42
  # Returns the URL to the project page on GitHub.
@@ -24,7 +52,7 @@ class JewelryPortfolio
24
52
  # Returns the name of the gem file from GitHub, which is made up of the
25
53
  # account name and the gem name.
26
54
  def gem_name
27
- "#{@account}-#{name}"
55
+ "#{@account}-#{@name}"
28
56
  end
29
57
 
30
58
  # Returns the command to install the gem. This is a helper for your views.
@@ -32,12 +60,19 @@ class JewelryPortfolio
32
60
  "sudo gem install #{gem_name} -s http://gems.github.com"
33
61
  end
34
62
 
35
- def ==(other)
36
- other.is_a?(Repo) && name == other.name
63
+ # Raises a JewelryPortfolio::Repo::InvalidError if any of: account, name,
64
+ # version, summary, or description is +nil+.
65
+ def valid?
66
+ @account && @name && @version && @summary && @description
67
+ end
68
+
69
+ def hash
70
+ @name.hash
37
71
  end
38
72
 
39
- def inspect
40
- "#<#{self.class.name} name=\"#{name}\">"
73
+ def ==(other)
74
+ other.is_a?(Repo) && hash == other.hash
41
75
  end
76
+ alias_method :eql?, :==
42
77
  end
43
78
  end
@@ -1,5 +1,6 @@
1
1
  require 'git'
2
2
  require 'rubygems/specification'
3
+ require 'set'
3
4
  require 'tempfile'
4
5
  require 'yaml'
5
6
 
@@ -32,24 +33,17 @@ class JewelryPortfolio
32
33
  File.join(path, 'repos.yml')
33
34
  end
34
35
 
35
- def specs
36
- unless @specs
36
+ def repos
37
+ unless @repos
37
38
  load_pages_repo!
38
- @specs = File.exist?(repos_file) ? YAML.load(File.read(repos_file)) : []
39
+ data = File.read(repos_file) if File.exist?(repos_file)
40
+ @repos = data.nil? || data.empty? ? Set.new : YAML.load(data).to_set
39
41
  end
40
- @specs
42
+ @repos
41
43
  end
42
44
 
43
- def repos
44
- specs.map { |spec| Repo.new(spec, @account) }
45
- end
46
-
47
- def add(spec)
48
- if old_spec = specs.find { |s| s.name == spec.name }
49
- specs[specs.index(old_spec)] = spec
50
- else
51
- specs << spec
52
- end
45
+ def add(repo)
46
+ @repos = Set.new([repo]).merge(@repos)
53
47
  update_repos_file!
54
48
  end
55
49
 
@@ -59,12 +53,12 @@ class JewelryPortfolio
59
53
  end
60
54
 
61
55
  def push!
62
- puts "Pushing branch `gh-pages' to remote `#{url}'"
63
- reraise_with_path { pages_repo.push('origin', 'gh-pages') }
56
+ puts "Pushing branch `master' to remote `#{url}'"
57
+ reraise_with_path { pages_repo.push('origin', 'master') }
64
58
  end
65
59
 
66
60
  def to_yaml
67
- specs.to_yaml
61
+ repos.to_a.to_yaml
68
62
  end
69
63
 
70
64
  private
@@ -90,9 +84,9 @@ class JewelryPortfolio
90
84
  @pages_repo = Git.open(path)
91
85
  unless @custom_work_directory
92
86
  puts "Pulling `#{url}'"
93
- @pages_repo.checkout('gh-pages')
87
+ @pages_repo.checkout('master')
94
88
  @pages_repo.fetch('origin')
95
- @pages_repo.merge('origin/gh-pages')
89
+ @pages_repo.merge('origin/master')
96
90
  end
97
91
  end
98
92
  end
@@ -101,8 +95,8 @@ class JewelryPortfolio
101
95
  reraise_with_path do
102
96
  puts "Cloning `#{url}'"
103
97
  @pages_repo = Git.clone(url, repo_name, :path => File.dirname(path))
104
- @pages_repo.checkout('origin/gh-pages')
105
- branch = @pages_repo.branch('gh-pages')
98
+ @pages_repo.checkout('origin/master')
99
+ branch = @pages_repo.branch('master')
106
100
  branch.create
107
101
  branch.checkout
108
102
  end
@@ -1,35 +1,35 @@
1
1
  require 'jewelry_portfolio'
2
2
 
3
- if defined?(Jeweler)
4
- class Jeweler
5
- alias_method :release_before_jewelry_portfolio, :release
6
- def release
7
- release_before_jewelry_portfolio
8
- Rake::Task['portfolio:release'].invoke
9
- end
3
+ # Add the JewelryPortfolio `portfolio:release' Rake task so it's ran after the
4
+ # original `release' Rake task if it exists.
5
+ if defined?(Rake) && Rake::Task.task_defined?('release')
6
+ task :release do
7
+ Rake::Task['portfolio:release'].invoke
10
8
  end
11
9
  end
12
10
 
13
11
  class JewelryPortfolio
14
12
  class Tasks
15
- # Override this if this project is on another account than the one
16
- # specified by `github.user' in your global or local git config.
17
- attr_accessor :account
13
+ # The JewelryPortfolio::Repo instance. If a block is given to ::new, this
14
+ # instance will be yielded.
15
+ attr_reader :repo
18
16
 
19
- # Initialize the JewelryPortfolio rake tasks. The instance is yielded so
20
- # additional configuration can be performed.
17
+ # Initialize the JewelryPortfolio rake tasks. A JewelryPortfolio::Repo is
18
+ # yielded so additional configuration can be performed.
19
+ #
20
+ # If the repo you're working in does _not_ contain a +gemspec+ file, then
21
+ # you'll need to assign all values to the Repo yourself.
21
22
  #
22
23
  # JewelryPortfolio::Tasks.new do |t|
23
- # t.account = 'Fingertips'
24
+ # t.account = 'Fingertips'
25
+ # t.name = 'passengerpane'
26
+ # t.version = '1.2.0'
27
+ # t.summary = 'A short summary about the project.'
28
+ # t.description = 'A longer description about the project.'
24
29
  # end
25
30
  def initialize
26
- yield self if block_given?
27
-
28
- @account ||= github_username
29
- unless @account
30
- raise ArgumentError, "Unable to determine `account'. Add a github user entry to your global, or local, git config. Or explicitely set the `account' on the JewelryPortfolio::Tasks instance."
31
- end
32
-
31
+ @repo = Repo.new(retrieve_github_username, retrieve_gemspec)
32
+ yield @repo if block_given?
33
33
  define
34
34
  end
35
35
 
@@ -51,17 +51,24 @@ class JewelryPortfolio
51
51
  end
52
52
 
53
53
  def portfolio
54
- if @portfolio.nil?
55
- if spec_file = Dir.glob('*.gemspec').first
56
- spec = eval(File.read(spec_file))
57
- end
58
- @portfolio = JewelryPortfolio.new(@account, spec)
54
+ validate_account!
55
+ @portfolio ||= JewelryPortfolio.new(@repo.account, (@repo if @repo.valid?))
56
+ end
57
+
58
+ def retrieve_gemspec
59
+ if spec_file = Dir.glob('*.gemspec').first
60
+ spec = eval(File.read(spec_file))
59
61
  end
60
- @portfolio
61
62
  end
62
63
 
63
- def github_username
64
+ def retrieve_github_username
64
65
  Git.open('.').config['github.user']
65
66
  end
67
+
68
+ def validate_account!
69
+ unless @repo.account
70
+ raise ArgumentError, "Unable to determine `account'. Add a github user entry to your global, or local, git config. Or explicitely set the `account' on the JewelryPortfolio::Tasks instance."
71
+ end
72
+ end
66
73
  end
67
74
  end
@@ -3,7 +3,14 @@ require 'erb'
3
3
  class JewelryPortfolio
4
4
  # This class is responsible for rendering a template.
5
5
  class Template
6
- attr_reader :template, :repos, :view_path
6
+ # The full path to the template file.
7
+ attr_reader :template
8
+
9
+ # The directory in which the template resides.
10
+ attr_reader :view_path
11
+
12
+ # The array of JewelryPortfolio::Repo instances.
13
+ attr_reader :repos
7
14
 
8
15
  # Initialize with the path to the +template+, minus the extensions, and an
9
16
  # array of JewelryPortfolio::Repo instances as +repos+.
@@ -11,7 +18,7 @@ class JewelryPortfolio
11
18
  template = File.expand_path(template)
12
19
  @view_path = File.dirname(template)
13
20
  @template = html_template_file(File.basename(template))
14
- @repos = repos
21
+ @repos = repos.to_a
15
22
  end
16
23
 
17
24
  # Renders the template and returns the output.
@@ -44,7 +51,7 @@ class JewelryPortfolio
44
51
  #
45
52
  # See partial for more info.
46
53
  def repo_partial(repo, local_variables = {})
47
- partial 'repo', local_variables.merge(:repo => repo, :spec => repo.spec)
54
+ partial 'repo', local_variables.merge(:repo => repo)
48
55
  end
49
56
 
50
57
  private
Binary file
@@ -5,7 +5,8 @@ Gem::Specification.new do |spec|
5
5
  spec.author = 'John Barnette'
6
6
  spec.email = 'jbarnette@example.com'
7
7
 
8
- spec.description = spec.summary = %{ Magically fix your projects overnight! }
8
+ spec.summary = %{ Magically fix your projects overnight! }
9
+ spec.description = %{ A gem which summons Dr. Nic to fix all your projects while you are cuddled underneath your blankie. }
9
10
 
10
11
  spec.files = Dir['lib/**/*.rb', 'bin/*', '[A-Z]*', 'test/**/*']
11
12
 
@@ -1,2 +1,2 @@
1
1
  <h1>dr-nic-magic-awesome</h1>
2
- <p>Magically fix your projects overnight!</p>
2
+ <p>A gem which summons Dr. Nic to fix all your projects while you are cuddled underneath your blankie.</p>
@@ -1,2 +1,2 @@
1
- <h1><%= spec.name %></h1>
2
- <p><%= repo.spec.description %></p>
1
+ <h1><%= repo.name %></h1>
2
+ <p><%= repo.description %></p>
@@ -1,109 +1,15 @@
1
1
  ---
2
- - !ruby/object:Gem::Specification
2
+ - !ruby/object:JewelryPortfolio::Repo
3
+ account: alloy
4
+ description: A gem which summons Dr. Nic to fix all your projects while you are cuddled underneath your blankie.
5
+ gem: true
3
6
  name: dr-nic-magic-awesome
4
- version: !ruby/object:Gem::Version
5
- version: 1.0.0
6
- platform: ruby
7
- authors:
8
- - John Barnette
9
- autorequire:
10
- bindir: bin
11
- cert_chain: []
12
-
13
- date: &id001 2009-02-27 00:00:00 +01:00
14
- default_executable:
15
- dependencies: []
16
-
17
- description: Magically fix your projects overnight!
18
- email: jbarnette@example.com
19
- executables: []
20
-
21
- extensions: []
22
-
23
- extra_rdoc_files:
24
- - README.rdoc
25
- - LICENSE
26
- - TODO
27
- files: []
28
-
29
- has_rdoc: true
30
- homepage:
31
- post_install_message:
32
- rdoc_options:
33
- - --charset=utf-8
34
- - --main
35
- - README.rdoc
36
- require_paths:
37
- - lib
38
- required_ruby_version: !ruby/object:Gem::Requirement
39
- requirements: &id002
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: "0"
43
- version:
44
- required_rubygems_version: !ruby/object:Gem::Requirement
45
- requirements: &id003
46
- - - ">="
47
- - !ruby/object:Gem::Version
48
- version: "0"
49
- version:
50
- requirements: []
51
-
52
- rubyforge_project:
53
- rubygems_version: 1.3.1
54
- signing_key:
55
- specification_version: 2
56
7
  summary: Magically fix your projects overnight!
57
- test_files: []
58
-
59
- - !ruby/object:Gem::Specification
60
- name: microgem
61
- version: !ruby/object:Gem::Version
62
- version: 0.2.0
63
- platform: ruby
64
- authors:
65
- - Eloy Duran
66
- autorequire:
67
- bindir: bin
68
- cert_chain: []
69
-
70
- date: *id001
71
- default_executable:
72
- dependencies: []
73
-
8
+ version: 1.0.0
9
+ - !ruby/object:JewelryPortfolio::Repo
10
+ account: alloy
74
11
  description: MicroGem provides a simple naive replacement for the `gem install' command in the form of the `mgem' commandline utility.
75
- email: eloy.de.enige@gmail.com
76
- executables:
77
- - ugem
78
- extensions: []
79
-
80
- extra_rdoc_files:
81
- - README.rdoc
82
- - LICENSE
83
- - TODO
84
- files: []
85
-
86
- has_rdoc: true
87
- homepage:
88
- post_install_message:
89
- rdoc_options:
90
- - --charset=utf-8
91
- - --main
92
- - README.rdoc
93
- require_paths:
94
- - lib
95
- required_ruby_version: !ruby/object:Gem::Requirement
96
- requirements: *id002
97
- version:
98
- required_rubygems_version: !ruby/object:Gem::Requirement
99
- requirements: *id003
100
- version:
101
- requirements: []
102
-
103
- rubyforge_project:
104
- rubygems_version: 1.3.1
105
- signing_key:
106
- specification_version: 2
12
+ gem: true
13
+ name: microgem
107
14
  summary: MicroGem provides a simple naive replacement for the `gem install' command in the form of the `mgem' commandline utility.
108
- test_files: []
109
-
15
+ version: 0.2.0
@@ -1,7 +1,7 @@
1
1
  <html>
2
2
  <body>
3
3
  <h1>dr-nic-magic-awesome</h1>
4
- <p>Magically fix your projects overnight!</p>
4
+ <p>A gem which summons Dr. Nic to fix all your projects while you are cuddled underneath your blankie.</p>
5
5
  <h1>microgem</h1>
6
6
  <p>MicroGem provides a simple naive replacement for the `gem install' command in the form of the `mgem' commandline utility.</p>
7
7
  </body>
@@ -7,15 +7,28 @@ describe "JewelryPortfolio" do
7
7
  JewelryPortfolio::ReposIndex.any_instance.stubs(:puts)
8
8
  FileUtils.rm_rf(TMP_PAGES_REPO)
9
9
 
10
- @spec = eval(fixture_read('dr-nic-magic-awesome.gemspec_'))
11
- @portfolio = JewelryPortfolio.new('alloy', @spec)
10
+ @repo = JewelryPortfolio::Repo.new('alloy', eval(fixture_read('dr-nic-magic-awesome.gemspec_')))
11
+ @portfolio = JewelryPortfolio.new('alloy', @repo)
12
12
 
13
13
  @portfolio.stubs(:puts)
14
14
  end
15
15
 
16
+ it "should raise an ArgumentError if no account is given" do
17
+ lambda {
18
+ JewelryPortfolio.new(nil, @repo)
19
+ }.should.raise ArgumentError
20
+ end
21
+
22
+ it "should raise a JewelryPortfolio::Repo::InvalidError if the given repo isn't valid" do
23
+ @repo.version = nil
24
+ lambda {
25
+ JewelryPortfolio.new('alloy', @repo)
26
+ }.should.raise ArgumentError
27
+ end
28
+
16
29
  it "should add the spec to the index" do
17
- JewelryPortfolio::ReposIndex.any_instance.expects(:add).with(@spec)
18
- JewelryPortfolio.new('alloy', @spec)
30
+ JewelryPortfolio::ReposIndex.any_instance.expects(:add).with(@repo)
31
+ JewelryPortfolio.new('alloy', @repo)
19
32
  end
20
33
 
21
34
  it "should also initialize without gemspec" do
@@ -26,14 +39,14 @@ describe "JewelryPortfolio" do
26
39
  it "should return the local pages repos index" do
27
40
  index = @portfolio.index
28
41
  index.should.be.instance_of JewelryPortfolio::ReposIndex
29
- index.repos.map { |r| r.spec.name }.should == %w{ dr-nic-magic-awesome microgem }
42
+ index.repos.map { |r| r.name }.should == %w{ dr-nic-magic-awesome microgem }
30
43
  end
31
44
 
32
45
  it "should return the template" do
33
46
  template = @portfolio.template
34
47
  template.should.be.instance_of JewelryPortfolio::Template
35
48
  template.template.should == File.join(@portfolio.index.path, 'template.html.erb')
36
- template.repos.should == @portfolio.index.repos
49
+ template.repos.should == @portfolio.index.repos.to_a
37
50
  end
38
51
 
39
52
  it "should write out the template" do
@@ -41,7 +54,7 @@ describe "JewelryPortfolio" do
41
54
  File.read(File.join(@portfolio.index.path, 'index.html')).should == File.read(fixture('template.html'))
42
55
  end
43
56
 
44
- it "should render, commit, and push the `gh-pages' branch" do
57
+ it "should render, commit, and push the master branch" do
45
58
  @portfolio.expects(:render!)
46
59
  @portfolio.index.expects(:commit!).with("Updated github pages for: dr-nic-magic-awesome-1.0.0")
47
60
  @portfolio.index.expects(:push!)
@@ -61,7 +74,7 @@ describe "JewelryPortfolio, with a custom work_directory" do
61
74
  @portfolio.index.instance_variable_get("@custom_work_directory").should == Dir.pwd
62
75
  end
63
76
 
64
- it "should render, commit, and push the `gh-pages' branch" do
77
+ it "should render, commit, and push the master branch" do
65
78
  @portfolio.expects(:render!)
66
79
  @portfolio.index.expects(:commit!).with("Re-generated github pages")
67
80
  @portfolio.index.expects(:push!)
data/test/repo_test.rb CHANGED
@@ -1,25 +1,104 @@
1
1
  require File.expand_path('../test_helper', __FILE__)
2
2
 
3
- describe "JewelryPortfolio::Repo" do
3
+ module SharedRepoSpecs
4
+ def self.included(klass)
5
+ klass.class_eval do
6
+ it "should return the name of the repo it represents" do
7
+ @repo.name.should == 'dr-nic-magic-awesome'
8
+ end
9
+
10
+ it "should return the version of the project" do
11
+ @repo.version.should == '1.0.0'
12
+ end
13
+
14
+ it "should return the summary of the project" do
15
+ @repo.summary.should == 'Magically fix your projects overnight!'
16
+ end
17
+
18
+ it "should return the description of the project" do
19
+ @repo.description.should == 'A gem which summons Dr. Nic to fix all your projects while you are cuddled underneath your blankie.'
20
+ end
21
+
22
+ it "should return the url to the github project page" do
23
+ @repo.url.should == 'http://github.com/alloy/dr-nic-magic-awesome/tree/master'
24
+ end
25
+
26
+ it "should return the public clone url" do
27
+ @repo.clone_url.should == 'git://github.com/alloy/dr-nic-magic-awesome.git'
28
+ end
29
+
30
+ it "should return a custom #hash" do
31
+ @repo.hash.should == 'dr-nic-magic-awesome'.hash
32
+ end
33
+
34
+ it "should be equal if the name is equal" do
35
+ other = JewelryPortfolio::Repo.new('alloy')
36
+ other.name = @repo.name
37
+
38
+ @repo.should == other
39
+ @repo.should.eql other
40
+ end
41
+
42
+ it "should not be equal if the name doesn't match" do
43
+ other = JewelryPortfolio::Repo.new('alloy')
44
+ other.name = 'other-gem'
45
+
46
+ @repo.should.not == other
47
+ @repo.should.not.eql other
48
+ end
49
+
50
+ it "should return itself serialized as YAML" do
51
+ loaded_repo = YAML.load(@repo.to_yaml)
52
+
53
+ loaded_repo.name.should == @repo.name
54
+ loaded_repo.version.should == @repo.version
55
+ loaded_repo.summary.should == @repo.summary
56
+ loaded_repo.description.should == @repo.description
57
+ end
58
+
59
+ it "should be valid with all necessary attributes set" do
60
+ @repo.should.be.valid
61
+ end
62
+
63
+ it "should not be valid with any of its attributes missing" do
64
+ %w{ account name version summary description }.each do |attr|
65
+ repo = @repo.dup
66
+ repo.send("#{attr}=", nil)
67
+
68
+ repo.should.not.be.valid
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ describe "JewelryPortfolio::Repo, when initialized without a gemspec" do
4
76
  before do
5
- @spec = fixture_eval('dr-nic-magic-awesome.gemspec_')
6
- @repo = JewelryPortfolio::Repo.new(@spec, 'alloy')
77
+ @repo = JewelryPortfolio::Repo.new
78
+ @repo.account = 'alloy'
79
+ @repo.name = 'dr-nic-magic-awesome'
80
+ @repo.version = '1.0.0'
81
+ @repo.summary = 'Magically fix your projects overnight!'
82
+ @repo.description = 'A gem which summons Dr. Nic to fix all your projects while you are cuddled underneath your blankie.'
7
83
  end
8
84
 
9
- it "should return the Gem::Specification instance" do
10
- @repo.spec.should == @spec
11
- end
85
+ include SharedRepoSpecs
12
86
 
13
- it "should return the name of the gem it represents" do
14
- @repo.name.should == 'dr-nic-magic-awesome'
87
+ it "should return that there's _no_ a gem for the repo" do
88
+ @repo.gem?.should.be false
15
89
  end
16
-
17
- it "should return the url to the github project page" do
18
- @repo.url.should == 'http://github.com/alloy/dr-nic-magic-awesome/tree/master'
90
+ end
91
+
92
+ describe "JewelryPortfolio::Repo, when initialized with a gemspec" do
93
+ before do
94
+ @spec = fixture_eval('dr-nic-magic-awesome.gemspec_')
95
+ @repo = JewelryPortfolio::Repo.new('alloy', @spec)
19
96
  end
20
97
 
21
- it "should return the public clone url" do
22
- @repo.clone_url.should == 'git://github.com/alloy/dr-nic-magic-awesome.git'
98
+ include SharedRepoSpecs
99
+
100
+ it "should return that there's a gem for the repo" do
101
+ @repo.gem?.should.be true
23
102
  end
24
103
 
25
104
  it "should return the gem name" do
@@ -29,16 +108,4 @@ describe "JewelryPortfolio::Repo" do
29
108
  it "should return the gem install command" do
30
109
  @repo.gem_install_command.should == "sudo gem install #{@repo.gem_name} -s http://gems.github.com"
31
110
  end
32
-
33
- xit "should return itself serialized as YAML" do
34
- @repo.to_yaml.should == fixture_read('dr-nic-magic-awesome_repo.yml')
35
- end
36
-
37
- it "should be equal if the name matches" do
38
- JewelryPortfolio::Repo.new(fixture_eval('dr-nic-magic-awesome.gemspec_'), 'alloy').should ==
39
- JewelryPortfolio::Repo.new(fixture_eval('dr-nic-magic-awesome.gemspec_'), 'alloy')
40
-
41
- JewelryPortfolio::Repo.new(fixture_eval('dr-nic-magic-awesome.gemspec_'), 'alloy').should.not ==
42
- JewelryPortfolio::Repo.new(fixture_eval('microgem.gemspec_'), 'alloy')
43
- end
44
111
  end
@@ -72,22 +72,20 @@ describe "JewelryPortfolio::ReposIndex, when working with a pages repo" do
72
72
  File.should.exist File.join(TMP_PAGES_REPO, 'repos.yml')
73
73
  end
74
74
 
75
- it "should not create a new checkout if it already exists, but do a pull" do
75
+ it "should not create a new checkout if it already exists, but fetch and merge" do
76
76
  @index.pages_repo # make sure it exists
77
77
  @index.instance_variable_set("@pages_repo", nil)
78
78
 
79
79
  Git.expects(:clone).never
80
- Git::Base.any_instance.expects(:checkout).with('gh-pages')
80
+ Git::Base.any_instance.expects(:checkout).with('master')
81
81
  Git::Base.any_instance.expects(:fetch).with('origin')
82
- Git::Base.any_instance.expects(:merge).with('origin/gh-pages')
82
+ Git::Base.any_instance.expects(:merge).with('origin/master')
83
83
  @index.pages_repo
84
84
  end
85
85
 
86
- it "should create and checkout the `gh-pages' branch" do
86
+ it "should create and checkout the `master' branch" do
87
87
  FileUtils.rm_rf(TMP_PAGES_REPO)
88
- @index.pages_repo.branch('gh-pages').should.be.current
89
- @index.pages_repo.config('branch.gh-pages.remote').should == 'origin'
90
- @index.pages_repo.config('branch.gh-pages.merge').should == 'refs/heads/gh-pages'
88
+ @index.pages_repo.branch('master').should.be.current
91
89
  end
92
90
 
93
91
  it "should return the pages repo" do
@@ -95,33 +93,33 @@ describe "JewelryPortfolio::ReposIndex, when working with a pages repo" do
95
93
  repo.should.be.instance_of Git::Base
96
94
  end
97
95
 
98
- it "should return an array of specs" do
96
+ xit "should return an array of specs" do
99
97
  FileUtils.rm_rf(TMP_PAGES_REPO)
100
98
 
101
99
  @index.specs.each { |s| s.should.be.instance_of Gem::Specification }
102
100
  @index.specs.map { |s| s.name }.should == %w{ dr-nic-magic-awesome microgem }
103
101
  end
104
102
 
105
- it "should return an empty array if the repos.yml file does not exist yet" do
103
+ it "should return an empty set if the repos.yml file does not exist yet" do
106
104
  FileUtils.rm(@index.repos_file)
107
- @index.specs.should == []
105
+ @index.repos.should == Set.new
108
106
  end
109
107
 
110
- it "should return an array of repos with their gemspecs" do
108
+ it "should return a set of repos with their gemspecs" do
111
109
  FileUtils.rm_rf(TMP_PAGES_REPO)
112
110
 
113
111
  @index.repos.should == [
114
- JewelryPortfolio::Repo.new(fixture_eval('dr-nic-magic-awesome.gemspec_'), 'alloy'),
115
- JewelryPortfolio::Repo.new(fixture_eval('microgem.gemspec_'), 'alloy')
116
- ]
112
+ JewelryPortfolio::Repo.new('alloy', fixture_eval('dr-nic-magic-awesome.gemspec_')),
113
+ JewelryPortfolio::Repo.new('alloy', fixture_eval('microgem.gemspec_'))
114
+ ].to_set
117
115
  end
118
116
 
119
117
  xit "should serialize the array of repos as YAML" do
120
118
  @index.to_yaml.should == fixture_read('repos.yml')
121
119
  end
122
120
 
123
- it "should push the `gh-pages' branch" do
124
- @index.pages_repo.expects(:push).with('origin', 'gh-pages')
121
+ it "should push the to origin/master" do
122
+ @index.pages_repo.expects(:push).with('origin', 'master')
125
123
  @index.push!
126
124
  end
127
125
 
@@ -139,20 +137,15 @@ describe "JewelryPortfolio::ReposIndex, when working with a pages repo" do
139
137
  end
140
138
  end
141
139
 
142
- it "should push the `gh-pages' branch" do
143
- @index.pages_repo.expects(:push).with('origin', 'gh-pages')
144
- @index.push!
145
- end
146
-
147
- it "should add a new spec to the repos.yml" do
140
+ it "should add a new repo to the repos.yml" do
148
141
  FileUtils.rm_rf(TMP_PAGES_REPO)
149
142
  @index.repos # make sure its loaded
150
143
 
151
- spec = eval(fixture_read('dr-nic-magic-awesome.gemspec_').
152
- gsub('dr-nic-magic-awesome', 'dr-nic-magic-awesome-v2'))
144
+ repo = JewelryPortfolio::Repo.new('alloy', eval(fixture_read('dr-nic-magic-awesome.gemspec_').
145
+ gsub('dr-nic-magic-awesome', 'dr-nic-magic-awesome-v2')))
153
146
 
154
147
  assert_difference('repos_from_file.length', +1) do
155
- @index.add(spec)
148
+ @index.add(repo)
156
149
  end
157
150
 
158
151
  repos_from_file.last.name.should == 'dr-nic-magic-awesome-v2'
@@ -162,10 +155,10 @@ describe "JewelryPortfolio::ReposIndex, when working with a pages repo" do
162
155
  FileUtils.rm_rf(TMP_PAGES_REPO)
163
156
  @index.repos # make sure its loaded
164
157
 
165
- spec = eval(fixture_read('dr-nic-magic-awesome.gemspec_').gsub('1.0.0', '1.1.1'))
158
+ repo = JewelryPortfolio::Repo.new('alloy', eval(fixture_read('dr-nic-magic-awesome.gemspec_').gsub('1.0.0', '1.1.1')))
166
159
 
167
160
  assert_no_difference('repos_from_file.length') do
168
- @index.add(spec)
161
+ @index.add(repo)
169
162
  end
170
163
 
171
164
  repos_from_file.first.version.to_s.should == '1.1.1'
@@ -0,0 +1,108 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+ require 'jewelry_portfolio/tasks'
3
+
4
+ module RakeTaskTestHelper
5
+ class Namespace
6
+ attr_reader :tasks
7
+
8
+ def initialize(tasks_helper)
9
+ @tasks = {}
10
+ @tasks_helper = tasks_helper
11
+ end
12
+
13
+ def task(name, &block)
14
+ @tasks[name] = block
15
+ end
16
+
17
+ def desc(title)
18
+ # nothing
19
+ end
20
+
21
+ def method_missing(method, *args, &block)
22
+ @tasks_helper.send(method, *args, &block)
23
+ end
24
+ end
25
+
26
+ def namespace(name, &block)
27
+ @namespaces ||= {}
28
+ (@namespaces[name] = Namespace.new(self)).instance_eval(&block)
29
+ end
30
+
31
+ def namespaces
32
+ @namespaces
33
+ end
34
+ end
35
+
36
+ JewelryPortfolio::Tasks.send(:include, RakeTaskTestHelper)
37
+
38
+ describe "JewelryPortfolio::Tasks" do
39
+ before do
40
+ @tasks_helper = JewelryPortfolio::Tasks.new
41
+ @tasks_helper.stubs(:portfolio).returns(stub('JewelryPortfolio instance'))
42
+ end
43
+
44
+ it "should define a portfolio namespace" do
45
+ @tasks_helper.namespaces.should.has_key :portfolio
46
+ end
47
+
48
+ it "should define a portfolio:generate task which calls render! on the portfolio instance and opens the index.html file" do
49
+ @tasks_helper.portfolio.stubs(:index).returns(stub('JewelryPortfolio::ReposIndex', :path => '/path/to/repo'))
50
+
51
+ @tasks_helper.portfolio.expects(:render!)
52
+ @tasks_helper.expects(:sh).with("open '/path/to/repo/index.html'")
53
+
54
+ @tasks_helper.namespaces[:portfolio].tasks[:generate].call
55
+ end
56
+
57
+ it "should define a portfolio:release task which calls release! on the portfolio instance" do
58
+ @tasks_helper.portfolio.expects(:release!)
59
+ @tasks_helper.namespaces[:portfolio].tasks[:release].call
60
+ end
61
+ end
62
+
63
+ describe "JewelryPortfolio::Tasks, in general" do
64
+ before do
65
+ Git.stubs(:open).with('.').returns(stub('Git config', :config => { 'github.user' => 'joe_the_plumber' }))
66
+
67
+ @tasks_helper = JewelryPortfolio::Tasks.new
68
+ @tasks_helper.stubs(:portfolio).returns(stub('JewelryPortfolio instance'))
69
+ end
70
+
71
+ it "should yield a JewelryPortfolio::Repo when initializing" do
72
+ repo = nil
73
+ @tasks_helper = JewelryPortfolio::Tasks.new { |t| repo = t }
74
+
75
+ repo.should.be.instance_of JewelryPortfolio::Repo
76
+ @tasks_helper.repo.should.be repo
77
+ end
78
+
79
+ it "should assign the account to use on the repo, from the local/global git config if the user didn't specify one" do
80
+ @tasks_helper.repo.account.should == 'joe_the_plumber'
81
+ end
82
+
83
+ it "should raise an ArgumentError if no account could be resolved" do
84
+ Git.stubs(:open).with('.').returns(stub('Git config', :config => {}))
85
+ @tasks_helper = JewelryPortfolio::Tasks.new
86
+
87
+ lambda { @tasks_helper.send(:portfolio) }.should.raise ArgumentError
88
+ end
89
+
90
+ it "should try to find a gemspec file in the current work directory and return a JewelryPortfolio instance with that spec" do
91
+ Dir.expects(:glob).with('*.gemspec').returns([fixture('dr-nic-magic-awesome.gemspec_')])
92
+ @tasks_helper = JewelryPortfolio::Tasks.new
93
+
94
+ JewelryPortfolio.expects(:new).with('joe_the_plumber',
95
+ JewelryPortfolio::Repo.new('joe_the_plumber', fixture_eval('dr-nic-magic-awesome.gemspec_'))).
96
+ returns('JewelryPortfolio')
97
+
98
+ @tasks_helper.send(:portfolio).should == 'JewelryPortfolio'
99
+ end
100
+
101
+ it "should not pass the Repo instance if it's not valid" do
102
+ Dir.stubs(:glob).with('*.gemspec').returns([])
103
+ @tasks_helper = JewelryPortfolio::Tasks.new
104
+
105
+ JewelryPortfolio.expects(:new).with('joe_the_plumber', nil).returns('JewelryPortfolio')
106
+ @tasks_helper.send(:portfolio).should == 'JewelryPortfolio'
107
+ end
108
+ end
@@ -1,21 +1,15 @@
1
1
  require File.expand_path('../test_helper', __FILE__)
2
2
 
3
- class GemSpecMock
4
- attr_accessor :name, :description
5
-
6
- def initialize(name, description)
7
- @name, @description = name, description
8
- end
9
- end
10
-
11
3
  describe "JewelryPortfolio::Template" do
12
4
  before do
13
- @repos = [
14
- JewelryPortfolio::Repo.new(GemSpecMock.new('dr-nic-magic-awesome', "Magically fix your projects overnight!"), 'alloy'),
15
- JewelryPortfolio::Repo.new(GemSpecMock.new('microgem', "MicroGem provides a simple naive replacement for the `gem install' command in the form of the `mgem' commandline utility."), 'alloy')
16
- ]
5
+ @repos = %w{ dr-nic-magic-awesome.gemspec_ microgem.gemspec_ }.
6
+ map { |spec| JewelryPortfolio::Repo.new('alloy', fixture_eval(spec)) }
17
7
 
18
- @page = JewelryPortfolio::Template.new(fixture('template'), @repos)
8
+ @page = JewelryPortfolio::Template.new(fixture('template'), @repos.to_set)
9
+ end
10
+
11
+ it "should turn the repos set into an array" do
12
+ @page.repos.should.be.instance_of Array
19
13
  end
20
14
 
21
15
  it "should raise a JewelryPortfolio::FileMissingError if the specified template does not exist" do
@@ -47,7 +41,7 @@ describe "JewelryPortfolio::Template" do
47
41
  end
48
42
 
49
43
  it "should render an ERB partial with the specified local variables" do
50
- @page.partial('repo', :repo => @repos.first, :spec => @repos.first.spec).should ==
44
+ @page.partial('repo', :repo => @repos.first).should ==
51
45
  File.read(fixture('dr-nic-magic-awesome.html'))
52
46
  end
53
47
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Fingertips-jewelry_portfolio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Duran
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-01 00:00:00 -08:00
12
+ date: 2009-03-03 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -48,6 +48,7 @@ files:
48
48
  - test/jewelry_portfolio_test.rb
49
49
  - test/repo_test.rb
50
50
  - test/repos_index_test.rb
51
+ - test/tasks_test.rb
51
52
  - test/template_test.rb
52
53
  - test/test_helper.rb
53
54
  - test/tmp