homedir 3.0.alpha1 → 3.0.alpha2

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/.gitignore CHANGED
@@ -11,3 +11,4 @@
11
11
  /pkg/
12
12
  /spec/reports
13
13
  /tmp/
14
+ /.rbx/
data/.travis.yml CHANGED
@@ -2,6 +2,7 @@ rvm:
2
2
  - jruby
3
3
  - 1.8.7
4
4
  - 1.9.2
5
+ - 1.9.3
5
6
  script: "bundle exec rake travis"
6
7
  notifications:
7
8
  irc: "irc.freenode.org#homedir"
data/.yardopts ADDED
@@ -0,0 +1,6 @@
1
+ --protected
2
+ --no-private
3
+ --markup markdown
4
+ -
5
+ README.mkd
6
+
data/Guardfile CHANGED
@@ -7,7 +7,7 @@ guard 'bundler' do
7
7
  # watch(/^.+\.gemspec/)
8
8
  end
9
9
 
10
- guard 'rspec', :version => 2, :cli => "--color --format doc" do
10
+ guard 'rspec', :version => 2, :cli => "--color --format doc --fail-fast" do
11
11
  watch(%r{^spec/.+_spec\.rb$})
12
12
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
13
13
  watch('spec/spec_helper.rb') { "spec" }
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2012 Christian Höltje
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a
4
+ copy of this software and associated documentation files (the "Software"),
5
+ to deal in the Software without restriction, including without limitation
6
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
7
+ and/or sell copies of the Software, and to permit persons to whom the
8
+ Software is furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included
11
+ in all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
14
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
19
+ DEALINGS IN THE SOFTWARE.
data/bin/homedir ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems' if Gem.nil?
3
+ require 'homedir/cli'
4
+
5
+ Homedir::CLI.start
data/homedir.gemspec CHANGED
@@ -2,24 +2,29 @@
2
2
  require File.expand_path('../lib/homedir/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
- gem.authors = ["Christian Holtje"]
6
- gem.email = ["docwhat@gerf.org"]
7
- gem.description = %q{Your home directory package management system}
8
- gem.summary = %q{Manage your home manager}
9
- gem.homepage = "http://home-dir.org/"
5
+ gem.authors = ["Christian Holtje"]
6
+ gem.email = ["docwhat@gerf.org"]
7
+ gem.description = %q{Your home directory package management system}
8
+ gem.summary = %q{Manage your home manager}
9
+ gem.homepage = "http://home-dir.org/"
10
+ gem.license = "MIT"
11
+ gem.required_ruby_version = ">= 1.8.7"
10
12
 
11
- gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
- gem.files = `git ls-files`.split("\n")
13
- gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
- gem.name = "homedir"
15
- gem.require_paths = ["lib"]
16
- gem.version = Homedir::VERSION
13
+ #gem.post_install_message = "Type 'homedir' to get started!"
14
+
15
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
+ gem.files = `git ls-files`.split("\n")
17
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ gem.name = "homedir"
19
+ gem.require_paths = ["lib"]
20
+ gem.version = Homedir::VERSION
17
21
 
18
22
  gem.add_development_dependency('rake')
19
23
  gem.add_development_dependency('rspec', ["~> 2.8"])
20
- gem.add_development_dependency('fakefs', ["~> 0.4.0"])
21
24
  gem.add_development_dependency('factory_girl', ["~> 2.5.2"])
22
25
 
26
+ gem.add_development_dependency('yard')
27
+
23
28
  gem.add_development_dependency('guard')
24
29
  gem.add_development_dependency('guard-rspec')
25
30
  gem.add_development_dependency('guard-bundler')
@@ -0,0 +1,47 @@
1
+ require 'homedir/errors'
2
+
3
+ module Homedir
4
+ class Catalog < Set
5
+
6
+ # @param {String} name The name of the {Homedir::Package package} to find.
7
+ # @return {Homedir::Package} The package that matches the `name`
8
+ def find_by_name name
9
+ found = select { |pkg| pkg.name == name }
10
+ raise "Invalid package object(s): #{found.inspect}" unless found.length <= 1
11
+ found.first
12
+ end
13
+
14
+ # Returns all dependencies for `package` including `package` itself.
15
+ #
16
+ # @raise [Homedir::MissingDependendency] if a dependency cannot be found.
17
+ # @param {Homedir::Package} package The package to get dependencies for.
18
+ # @return {Set} The {Homedir::Package Package} objects that `package` depends on.
19
+ def find_all_dependencies package
20
+ found = Set.new([package])
21
+ find_all_dependencies_not_found found, package
22
+ return found
23
+ end
24
+
25
+ private
26
+
27
+ # This is the method that does the work for {#find_all_dependencies}.
28
+ #
29
+ # @param {Set} found The set of all found packages.
30
+ # @param {Homedir::Package} package The package to get dependencies for. It is assumed it is already in `found`
31
+ def find_all_dependencies_not_found found, package
32
+ package.dependencies.each do |dependency_name|
33
+ dependency = find_by_name dependency_name
34
+
35
+ raise MissingDependencyError.new(
36
+ "The package '#{package}' requires '#{dependency_name}' which cannot be found."
37
+ ) if dependency.nil?
38
+
39
+ if not found.include? dependency
40
+ found << dependency
41
+ find_all_dependencies_not_found(found, dependency)
42
+ end
43
+ end
44
+ return nil
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,55 @@
1
+ require 'thor'
2
+
3
+ module Homedir
4
+ # The command line interface for {Homedir}.
5
+ #
6
+ # See the source or the command line tool `bin/homedir` for more
7
+ # information
8
+ class CLI < Thor
9
+
10
+ desc "list", "List all known packages."
11
+ method_option(
12
+ :remote,
13
+ :type => :boolean,
14
+ :default => false,
15
+ :aliases => '-r',
16
+ :description => "Queries the remote server")
17
+ def list
18
+ # FIXME: list needs to do something
19
+ puts "Not implemented yet"
20
+ end
21
+
22
+ desc "info PACKAGE", "Describe a specific PACKAGE in detail."
23
+ def info(package_name)
24
+ # FIXME: info needs to do something
25
+ puts "Not implemented yet #{package_name.inspect}"
26
+ end
27
+
28
+ desc "enable PACKAGE...", "Enable PACKAGE, making it available in your home directory."
29
+ def enable(*packages)
30
+ # FIXME: info needs to do something
31
+ puts "Not implemented yet #{packages.inspect}"
32
+ end
33
+
34
+ desc "disable PACKAGE...", "Disable PACKAGE, removing it from your home directory."
35
+ def disable(*packages)
36
+ # FIXME: info needs to do something
37
+ puts "Not implemented yet #{packages.inspect}"
38
+ end
39
+
40
+ desc "create PACKAGE...", "Create PACKAGE, prompting you for information."
41
+ method_option(
42
+ :directory,
43
+ :type => :string,
44
+ :default => "#{ENV['HOME']}/.homedir/package",
45
+ :aliases => "-d",
46
+ :description => "Where to save the DIRECTORY."
47
+ )
48
+ def create(package_name)
49
+ # FIXME: info needs to do something
50
+ puts "Not implemented yet #{package_name.inspect}"
51
+ end
52
+
53
+ end
54
+ end
55
+
@@ -0,0 +1,17 @@
1
+
2
+ module Homedir
3
+ # When possible, all exceptions raised by Homedir classes
4
+ # will be subclassed from {Homedir::Error}.
5
+ class Error < StandardError
6
+ end
7
+
8
+ # If a dependency is missing from a {Homedir::Package package} (it isn't
9
+ # available in a {Homedir::Catalog Catalog}) then this exception is raised.
10
+ class MissingDependencyError < Error
11
+ end
12
+
13
+ # The name assigned to a {Homedir::Package package} is not legal. Check the
14
+ # message for the list of acceptable characters in a name.
15
+ class InvalidNameError < Error
16
+ end
17
+ end
@@ -1,28 +1,78 @@
1
- require 'homedir'
1
+ require 'homedir/errors'
2
2
  require 'pathname'
3
3
  require 'fileutils'
4
4
  require 'yaml'
5
5
 
6
+ # A package contains all the meta information about the package:
7
+ #
8
+ # * name, description, etc.
9
+ # * pre and post install instructions.
10
+ # * location of the package directory.
11
+ #
6
12
  module Homedir
7
13
  class Package
8
- REQUIRED_OPTIONS = [
14
+ # A list of required values. If a value in this
15
+ # list isn't set, then the object isn't {#valid? valid}.
16
+ # @see #valid?
17
+ REQUIRED_VALUES = [
9
18
  :name,
10
19
  :description,
11
20
  :directory,
12
21
  ].freeze
13
- DEFAULT_OPTIONS = {
14
- :name => nil,
15
- :description => nil,
16
- :dependencies => [],
17
- :post_install => nil,
18
- :pre_install => nil,
19
- :directory => nil,
22
+ DEFAULT_VALUES = {
23
+ :name => nil,
24
+ :description => nil,
25
+ :dependencies => [],
26
+ :post_install => nil,
27
+ :pre_uninstall => nil,
28
+ :directory => nil,
20
29
  }.freeze
21
- attr_accessor *DEFAULT_OPTIONS.keys
22
30
 
31
+ # The name of the package.
32
+ #
33
+ # * It must match the regex: `[a-zA-Z0-9_-]`.
34
+ # * It must match the directory it'll be written-to/read-from
35
+ #
36
+ # @return {String} The name of the package
37
+ attr_reader :name
23
38
 
39
+ # A description of the package for humans.
40
+ #
41
+ # @return {String} The description of the package
42
+ attr_accessor :description
43
+
44
+ # A list of package names this package depends on.
45
+ #
46
+ # When assigning a list, they can either be {Homedir::Package Package} objects or strings.
47
+ # @return [Enumerable] A list of package {#name names}.
48
+ attr_reader :dependencies
49
+
50
+ # A script that should run after install.
51
+ #
52
+ # @return {String}
53
+ attr_accessor :post_install
54
+
55
+ # A script to run before install.
56
+ attr_accessor :pre_uninstall
57
+
58
+ # The directory where the package is stored.
59
+ #
60
+ # * The directory's basename must match {#name}.
61
+ #
62
+ # @return {Pathname}
63
+ attr_reader :directory
64
+
65
+ # Create a new {Homedir::Package Package} instance.
66
+ #
67
+ # @param {Hash} options
68
+ # @option options [String] :name The name of the package.
69
+ # @option options [String] :description The description of the package.
70
+ # @option options [Enumerable] :dependencies A list of {Homedir::Package packages} or {String strings}.
71
+ # @option options [Pathname] :directory The directory the packages is located at.
72
+ # @option options [String] :post_install Commands to run after installing the package.
73
+ # @option options [String] :pre_uninstall Commands to run before uninstalling the package.
24
74
  def initialize(options = {})
25
- options = DEFAULT_OPTIONS.merge(options)
75
+ options = DEFAULT_VALUES.merge(options)
26
76
 
27
77
  # Set the options
28
78
  options.each do |k,v|
@@ -30,19 +80,47 @@ module Homedir
30
80
  end
31
81
  end
32
82
 
83
+ # The hashes are based on the name
84
+ # @return {Fixnum} The hash
85
+ def hash
86
+ @name.hash
87
+ end
88
+
89
+ # Returns true if the packages have the same name.
90
+ #
91
+ # @param {Homedir::Package} other The package to check for equality to.
92
+ # @return {Boolean} `true` if the `name` matches.
93
+ def eql?(other)
94
+ if other.respond_to? :name
95
+ other.name == @name
96
+ else
97
+ false
98
+ end
99
+ end
100
+
101
+ # {include:#dependencies}
33
102
  def dependencies= value
34
103
  @dependencies = value.map { |p| p.to_s }
35
104
  end
36
105
 
106
+ # {include:#directory}
37
107
  def directory= value
38
108
  @directory = value.nil? ? nil : Pathname.new(value)
39
109
  end
40
110
 
111
+ # {include:#name}
112
+ # @param {String} value The new name for the package.
113
+ # @raise [Homedir::InvalidNameError] If the name doesn't match the regexp `/^[0-9a-zA-Z_-]+$/`
41
114
  def name= value
42
- raise "Invalid name: #{value.inspect}" unless value.nil? || value =~ /^[0-9a-zA-Z_-]+$/
115
+ raise InvalidNameError.new(
116
+ "The name #{value.inspect} must only contain numbers, letters, `_` and `-`"
117
+ ) unless value.nil? || value =~ /^[0-9a-zA-Z_-]+$/
43
118
  @name = value
44
119
  end
45
120
 
121
+ # Saves the package info to {#directory}`/.homedir/` if it {#valid? valid}.
122
+ #
123
+ # @see #valid?
46
124
  def save!
47
125
  raise "The package is not valid: #{self}" unless valid?
48
126
 
@@ -54,12 +132,30 @@ module Homedir
54
132
  end
55
133
  end
56
134
 
135
+ # Verifies the package is valid to save.
136
+ #
137
+ # @return {Boolean} `true` if the package is valid.
57
138
  def valid?
58
- REQUIRED_OPTIONS.reduce(true) do |is_valid, opt|
59
- is_valid && !instance_variable_get("@#{opt}").nil?
139
+ errors = []
140
+ REQUIRED_VALUES.each do |value|
141
+ errors << "#{value} must not be empty." if instance_variable_get("@#{value}").nil?
60
142
  end
143
+ # FIXME: This should check that .directory.basename == .name
144
+ @errors = errors
145
+ @errors.length == 0
146
+ end
147
+
148
+ # A list of errors
149
+ #
150
+ # This list is only filled after {#.valid?} is run.
151
+ # @return [Array] An array of strings describing the problems.
152
+ def errors
153
+ @errors || []
61
154
  end
62
155
 
156
+ # Returns the {#name} attribute
157
+ #
158
+ # @return {String} The {#name} of the package.
63
159
  def to_s
64
160
  @name
65
161
  end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Homedir
3
- VERSION = '3.0.alpha1'
3
+ VERSION = '3.0.alpha2'
4
4
  end
data/lib/homedir.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # AUTHOR:: Christian Höltje <docwhat@gerf.org>
2
+ # COPYRIGHT:: Copyright (c) 2012 Christian Höltje
3
+ # LICENSE:: The MIT License. See the file LICENSE distributed with this source.
1
4
  require 'homedir/package'
2
5
 
3
6
  module Homedir
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+ require 'homedir/catalog'
3
+ require 'homedir/errors'
4
+
5
+
6
+ describe Homedir::Catalog do
7
+ def mkpkg(name, dependencies=[])
8
+ double(name).tap do |pkg|
9
+ pkg.stub(:name) { name }
10
+ pkg.stub(:dependencies) { dependencies }
11
+ end
12
+ end
13
+
14
+ describe ".add" do
15
+ it "adds the package to the catalog" do
16
+ pkg = mkpkg('somename')
17
+ subject.add pkg
18
+ subject.should include(pkg)
19
+ end
20
+ end
21
+
22
+ describe ".find_all_dependencies" do
23
+ let(:pkg) { mkpkg('pkg', ['pkg2']) }
24
+
25
+ context "in an acyclic graph" do
26
+ before(:each) do
27
+ subject.add mkpkg('pkg2', ['pkg3'])
28
+ subject.add mkpkg('pkg3')
29
+ subject.add mkpkg('lonelypkg')
30
+ end
31
+
32
+ it "should all dependencies" do
33
+ dependents = subject.find_all_dependencies(pkg)
34
+ dependents.size.should == 3
35
+ end
36
+
37
+ it "should be packages" do
38
+ dependents = subject.find_all_dependencies(pkg)
39
+ dependents.each do |p|
40
+ p.should respond_to(:name)
41
+ end
42
+ end
43
+ end
44
+
45
+ context "in a cyclic graph" do
46
+ before(:each) do
47
+ subject.add pkg
48
+ subject.add mkpkg('pkg2', [pkg.name])
49
+ end
50
+
51
+ it "should return only two" do
52
+ dependents = subject.find_all_dependencies(pkg)
53
+ dependents.size.should == 2
54
+ end
55
+ end
56
+
57
+ context "with a missing dependency" do
58
+ it "should raise an error" do
59
+ expect { subject.find_all_dependencies(pkg) }.to raise_error(Homedir::MissingDependencyError)
60
+ end
61
+ end
62
+ end
63
+
64
+ describe ".find_by_name" do
65
+ let(:pkg) { mkpkg('a-name') }
66
+ before(:each) do
67
+ subject.add(pkg)
68
+ end
69
+
70
+ it "return pkg" do
71
+ subject.find_by_name(pkg.name).should == pkg
72
+ end
73
+ end
74
+ end
75
+
@@ -1,13 +1,10 @@
1
1
  require 'spec_helper'
2
2
  require 'homedir/package'
3
+ require 'homedir/errors'
3
4
  require 'pathname'
4
5
 
5
6
  describe Homedir::Package do
6
7
 
7
- context "loading a v3 package from disk" do
8
- describe "#read_from_directory"
9
- end
10
-
11
8
  describe "#new" do
12
9
  context "creating a package from scratch" do
13
10
  describe "dependencies" do
@@ -36,24 +33,52 @@ describe Homedir::Package do
36
33
  end
37
34
  end
38
35
 
39
- describe "#from_directory" do
40
- it "should read its configuration from a directory"
36
+ describe ".hash" do
37
+ it "should be the same for two identically named packages" do
38
+ pkg1 = build(:package, :name => 'samename')
39
+ pkg2 = build(:package, :name => pkg1.name)
40
+ pkg1.hash.should == pkg2.hash
41
+ end
42
+ end
43
+
44
+ describe ".eql?" do
45
+ it "should be true for identically named packages" do
46
+ pkg1 = build(:package, :name => 'samename')
47
+ pkg2 = build(:package, :name => pkg1.name)
48
+ pkg1.should eql(pkg2)
49
+ end
41
50
  end
42
51
 
43
52
  describe ".name" do
44
- it "should not accept an invalid name" do
53
+ it "cannot have spaces" do
45
54
  pkg = build(:package)
46
- expect { pkg.name = "a name" }.to raise_error
55
+ expect { pkg.name = "a name" }.to raise_error(Homedir::InvalidNameError)
47
56
  end
48
57
  end
49
58
 
50
59
  describe ".valid?" do
51
- it "should require a name" do
52
- build(:package, :name => nil).should_not be_valid
60
+ context "name" do
61
+ it "is required" do
62
+ build(:package, :name => nil).should_not be_valid
63
+ end
64
+
65
+ it "should be shown in .errors" do
66
+ pkg = build(:package, :name => nil)
67
+ pkg.valid?
68
+ pkg.errors.join.should include("name must not be empty")
69
+ end
53
70
  end
54
71
 
55
- it "should require a description" do
56
- build(:package, :description => nil).should_not be_valid
72
+ context "description" do
73
+ it "should require a description" do
74
+ build(:package, :description => nil).should_not be_valid
75
+ end
76
+
77
+ it "should be shown in .errors" do
78
+ pkg = build(:package, :description=> nil)
79
+ pkg.valid?
80
+ pkg.errors.join.should include("description must not be empty")
81
+ end
57
82
  end
58
83
  end
59
84
 
data/spec/spec_helper.rb CHANGED
@@ -1,12 +1,19 @@
1
- require 'fakefs'
2
- require 'fakefs/spec_helpers'
1
+ require 'tmpdir'
3
2
  require 'factory_girl'
4
3
  require 'factories'
5
4
 
5
+ def within_a_tmpdir
6
+ Dir.mktmpdir('homedir-spec-') do |dir|
7
+ Dir.chdir(dir)
8
+ yield
9
+ end
10
+ end
11
+
6
12
  RSpec.configure do |config|
7
13
  # Allows using build(), create(), etc. without the "FactoryGirl." part.
8
14
  config.include FactoryGirl::Syntax::Methods
9
15
 
10
- # resets the fake filesystem after each example
11
- config.include FakeFS::SpecHelpers
16
+ config.around(:each) do |example|
17
+ within_a_tmpdir(&example)
18
+ end
12
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: homedir
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.alpha1
4
+ version: 3.0.alpha2
5
5
  prerelease: 4
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: 2012-02-16 00:00:00.000000000Z
12
+ date: 2012-02-18 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70278115028520 !ruby/object:Gem::Requirement
16
+ requirement: &70240106090360 !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: :development
23
23
  prerelease: false
24
- version_requirements: *70278115028520
24
+ version_requirements: *70240106090360
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70278115027880 !ruby/object:Gem::Requirement
27
+ requirement: &70240106089100 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,32 +32,32 @@ dependencies:
32
32
  version: '2.8'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70278115027880
35
+ version_requirements: *70240106089100
36
36
  - !ruby/object:Gem::Dependency
37
- name: fakefs
38
- requirement: &70278115024500 !ruby/object:Gem::Requirement
37
+ name: factory_girl
38
+ requirement: &70240106087000 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
42
42
  - !ruby/object:Gem::Version
43
- version: 0.4.0
43
+ version: 2.5.2
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70278115024500
46
+ version_requirements: *70240106087000
47
47
  - !ruby/object:Gem::Dependency
48
- name: factory_girl
49
- requirement: &70278115023820 !ruby/object:Gem::Requirement
48
+ name: yard
49
+ requirement: &70240106085920 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
- - - ~>
52
+ - - ! '>='
53
53
  - !ruby/object:Gem::Version
54
- version: 2.5.2
54
+ version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70278115023820
57
+ version_requirements: *70240106085920
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: guard
60
- requirement: &70278115023440 !ruby/object:Gem::Requirement
60
+ requirement: &70240106084680 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70278115023440
68
+ version_requirements: *70240106084680
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: guard-rspec
71
- requirement: &70278115022940 !ruby/object:Gem::Requirement
71
+ requirement: &70240106083380 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70278115022940
79
+ version_requirements: *70240106083380
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: guard-bundler
82
- requirement: &70278115022440 !ruby/object:Gem::Requirement
82
+ requirement: &70240106081940 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70278115022440
90
+ version_requirements: *70240106081940
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rb-fsevent
93
- requirement: &70278115022020 !ruby/object:Gem::Requirement
93
+ requirement: &70240106080280 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70278115022020
101
+ version_requirements: *70240106080280
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: growl
104
- requirement: &70278115021580 !ruby/object:Gem::Requirement
104
+ requirement: &70240106078640 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,31 +109,38 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70278115021580
112
+ version_requirements: *70240106078640
113
113
  description: Your home directory package management system
114
114
  email:
115
115
  - docwhat@gerf.org
116
- executables: []
116
+ executables:
117
+ - homedir
117
118
  extensions: []
118
119
  extra_rdoc_files: []
119
120
  files:
120
121
  - .gitignore
121
122
  - .travis.yml
123
+ - .yardopts
122
124
  - Gemfile
123
125
  - Guardfile
126
+ - LICENSE
124
127
  - README.mkd
125
128
  - Rakefile
129
+ - bin/homedir
126
130
  - homedir.gemspec
127
131
  - lib/homedir.rb
132
+ - lib/homedir/catalog.rb
133
+ - lib/homedir/cli.rb
134
+ - lib/homedir/errors.rb
128
135
  - lib/homedir/package.rb
129
- - lib/homedir/repository.rb
130
136
  - lib/homedir/version.rb
131
137
  - spec/factories.rb
138
+ - spec/lib/homedir/catalog_spec.rb
132
139
  - spec/lib/homedir/package_spec.rb
133
- - spec/lib/homedir/repository_spec.rb
134
140
  - spec/spec_helper.rb
135
141
  homepage: http://home-dir.org/
136
- licenses: []
142
+ licenses:
143
+ - MIT
137
144
  post_install_message:
138
145
  rdoc_options: []
139
146
  require_paths:
@@ -143,10 +150,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
143
150
  requirements:
144
151
  - - ! '>='
145
152
  - !ruby/object:Gem::Version
146
- version: '0'
147
- segments:
148
- - 0
149
- hash: -3141288371879137994
153
+ version: 1.8.7
150
154
  required_rubygems_version: !ruby/object:Gem::Requirement
151
155
  none: false
152
156
  requirements:
@@ -161,6 +165,7 @@ specification_version: 3
161
165
  summary: Manage your home manager
162
166
  test_files:
163
167
  - spec/factories.rb
168
+ - spec/lib/homedir/catalog_spec.rb
164
169
  - spec/lib/homedir/package_spec.rb
165
- - spec/lib/homedir/repository_spec.rb
166
170
  - spec/spec_helper.rb
171
+ has_rdoc:
@@ -1,27 +0,0 @@
1
- require 'pathname'
2
- require 'homedir/package'
3
-
4
- class Homedir::Repository
5
- attr_reader :directory, :package_loader, :packages, :name
6
-
7
- def initialize(directory, options={})
8
- options = {
9
- :package_loader => Homedir::Package,
10
- }.merge(options)
11
- @directory = Pathname.new(directory)
12
- @name = @directory.basename.to_s
13
- @package_loader = options[:package_loader]
14
- end
15
-
16
- def scan
17
- packages = []
18
- directory.each_entry do |entry|
19
- next if entry.to_s.start_with? '.'
20
- path = directory + entry
21
- packages << package_loader.load_directory(path)
22
- end
23
- @packages = packages.freeze
24
- return @packages
25
- end
26
-
27
- end
@@ -1,62 +0,0 @@
1
- require 'spec_helper'
2
- require 'homedir/repository'
3
- require 'pathname'
4
-
5
- describe Homedir::Repository do
6
- subject { Homedir::Repository.new directory, :package_loader => package_loader }
7
- let(:package_loader) do
8
- double().tap do |pl|
9
- # :package is a placeholder for a Package instance
10
- pl.stub(:load_directory) { :package }
11
- end
12
- end
13
- let(:directory) { Pathname.new('/') } # an absolute directory
14
- let(:package_dirs) { (1..10).map { |n| directory + "package-#{n}" } }
15
-
16
- before(:each) do
17
- # We need to make the directories exist so it can be scaned
18
- package_dirs.each { |p| p.mkdir }
19
- end
20
-
21
- describe "#new" do
22
- subject { Homedir::Repository }
23
-
24
- it "should take a directory name" do
25
- subject.new directory.to_s
26
- end
27
-
28
- it "should accept a pathname object" do
29
- subject.new directory
30
- end
31
-
32
- it "should accept a Package class" do
33
- subject.new directory, :package_loader => double()
34
- end
35
- end
36
-
37
- describe ".scan" do
38
- it "should load each package" do
39
- package_dirs.each do |p|
40
- package_loader.should_receive(:load_directory).with(p)
41
- end
42
- subject.scan.size.should == package_dirs.size
43
- end
44
- end
45
-
46
- describe ".packages" do
47
- it "should contain package objects" do
48
- subject.scan
49
- subject.packages.each do |p|
50
- p.should == :package
51
- end
52
- end
53
- end
54
-
55
- describe ".name" do
56
- it "should return the basename of the directory" do
57
- repo = Homedir::Repository.new Pathname.new('/a/b/my-name')
58
- repo.name.should == 'my-name'
59
- end
60
- end
61
-
62
- end