manifesto 0.1.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -8,12 +8,17 @@ begin
8
8
  gem.summary = %Q{Manifesto is a Ruby library that dynamically generates an HTML5 cache manifest}
9
9
  gem.description = %Q{Dynamically generates an HTML5 cache manifest from the contents of a directory}
10
10
  gem.email = "john@johntopley.com"
11
- gem.homepage = "http://manifesto.rubyforge.org"
11
+ gem.homepage = "http://github.com/johntopley/manifesto"
12
12
  gem.authors = ["John Topley"]
13
13
  gem.add_development_dependency "rspec", ">= 1.2.9"
14
+ gem.rubyforge_project = "manifesto"
14
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
16
  end
16
17
  Jeweler::GemcutterTasks.new
18
+
19
+ Jeweler::RubyforgeTasks.new do |rubyforge|
20
+ rubyforge.doc_task = "rdoc"
21
+ end
17
22
  rescue LoadError
18
23
  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
19
24
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.5.0
data/lib/manifesto.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'digest/md5'
2
2
  require 'find'
3
3
 
4
- module Manifesto
4
+ class Manifesto
5
5
 
6
6
  # Returns an Array of non-hidden files within the <tt>./public</tt> directory, unless <tt>:directory</tt> is specified.
7
7
  # The output also includes a computed hash of the files' contents, unless <tt>:compute_hash</tt> is set to <tt>false</tt>.
@@ -19,10 +19,11 @@ module Manifesto
19
19
  def self.cache(options = {})
20
20
  directory = options.fetch(:directory, './public')
21
21
  compute_hash = options.fetch(:compute_hash, true)
22
- validate_arguments(directory, compute_hash)
22
+ validate_options(directory, compute_hash)
23
23
  manifest = []
24
24
  hashes = ''
25
- Find.find(directory) do |path|
25
+
26
+ get_file_paths(directory).each do |path|
26
27
 
27
28
  # Only include real files (i.e. not directories, symlinks etc.) and non-hidden
28
29
  # files in the manifest.
@@ -39,8 +40,6 @@ module Manifesto
39
40
  manifest.reverse
40
41
  end
41
42
 
42
- private
43
-
44
43
  # Reads the file contents to calculate the MD5 hash, so that if a file is
45
44
  # changed, the manifest is changed too.
46
45
  def self.compute_file_contents_hash(path)
@@ -53,6 +52,13 @@ module Manifesto
53
52
  hash
54
53
  end
55
54
 
55
+ # Recursively find all file entries from within a directory.
56
+ def self.get_file_paths(directory)
57
+ entries = []
58
+ Find.find(directory) { |entry| entries << entry }
59
+ entries
60
+ end
61
+
56
62
  # Strips the directory from the start of path, so that each path is relative
57
63
  # to directory. Add a leading forward slash if not present.
58
64
  def self.normalize_path(directory, path)
@@ -61,7 +67,7 @@ module Manifesto
61
67
  normalized_path
62
68
  end
63
69
 
64
- def self.validate_arguments(directory, compute_hash)
70
+ def self.validate_options(directory, compute_hash)
65
71
  raise(ArgumentError, ":directory must be a real directory") unless valid_directory?(directory)
66
72
  raise(ArgumentError, ":compute_hash must be a boolean") unless valid_compute_hash?(compute_hash)
67
73
  end
data/manifesto.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{manifesto}
8
- s.version = "0.1.0"
8
+ s.version = "0.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["John Topley"]
12
- s.date = %q{2010-06-05}
12
+ s.date = %q{2010-06-09}
13
13
  s.description = %q{Dynamically generates an HTML5 cache manifest from the contents of a directory}
14
14
  s.email = %q{john@johntopley.com}
15
15
  s.extra_rdoc_files = [
@@ -29,9 +29,10 @@ Gem::Specification.new do |s|
29
29
  "spec/spec.opts",
30
30
  "spec/spec_helper.rb"
31
31
  ]
32
- s.homepage = %q{http://manifesto.rubyforge.org}
32
+ s.homepage = %q{http://github.com/johntopley/manifesto}
33
33
  s.rdoc_options = ["--charset=UTF-8"]
34
34
  s.require_paths = ["lib"]
35
+ s.rubyforge_project = %q{manifesto}
35
36
  s.rubygems_version = %q{1.3.7}
36
37
  s.summary = %q{Manifesto is a Ruby library that dynamically generates an HTML5 cache manifest}
37
38
  s.test_files = [
@@ -1,25 +1,130 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
3
  describe Manifesto do
4
- it "should raise ArgumentError if directory is not a real directory" do
5
- expect{ Manifesto.validate_arguments('', false) }.to raise_error(ArgumentError)
4
+ describe ".validate_options" do
5
+ it "should raise ArgumentError if directory is not a real directory" do
6
+ expect{ Manifesto.validate_options('', false) }.to raise_error(ArgumentError)
7
+ end
8
+
9
+ it "should raise ArgumentError if compute_hash is not a boolean" do
10
+ expect{ Manifesto.validate_options('.', nil) }.to raise_error(ArgumentError)
11
+ end
6
12
  end
7
-
8
- it "should raise ArgumentError if compute_hash is not a boolean" do
9
- expect{ Manifesto.validate_arguments('.', nil) }.to raise_error(ArgumentError)
13
+
14
+ describe ".cache" do
15
+ before(:each) do
16
+ Manifesto.stub!(:validate_options).and_return(true)
17
+ end
18
+
19
+ it "should validate the options" do
20
+ Manifesto.should_receive(:validate_options).and_return(true)
21
+ Manifesto.cache
22
+ end
23
+
24
+ context "when default directory" do
25
+ it "should get file paths from the default directory" do
26
+ Manifesto.should_receive(:get_file_paths).with('./public').and_return([])
27
+ Manifesto.cache
28
+ end
29
+ end
30
+
31
+ context "when directory is specified" do
32
+ it "should get file path from within the specified directory" do
33
+ Manifesto.should_receive(:get_file_paths).with('./mobile').and_return([])
34
+ Manifesto.cache(:directory => './mobile')
35
+ end
36
+ end
37
+
38
+ context "when there are no files in the directory" do
39
+ before(:each) do
40
+ Manifesto.stub!(:get_file_paths).and_return([])
41
+ end
42
+
43
+ it "should not compute hash" do
44
+ Manifesto.should_receive(:compute_file_contents_hash).never
45
+ Manifesto.cache
46
+ end
47
+ end
48
+
49
+ context "when there are files in the directories" do
50
+ it "should check the file" do
51
+ File.should_receive(:file?)
52
+ Manifesto.cache
53
+ end
54
+
55
+ context "and path is for the directory or symlink" do
56
+ before(:each) do
57
+ Manifesto.stub!(:get_file_paths).and_return(['public/dir1', 'public/symlink'])
58
+ File.stub!(:file?).and_return(false)
59
+ end
60
+
61
+ it "should not compute hash" do
62
+ Manifesto.should_receive(:compute_file_contents_hash).never
63
+ Manifesto.cache
64
+ end
65
+
66
+ it "should not normalize the path" do
67
+ Manifesto.should_receive(:normalize_path).never
68
+ Manifesto.cache
69
+ end
70
+ end
71
+
72
+ context "and path is for the hidden file" do
73
+ before(:each) do
74
+ Manifesto.stub!(:get_file_paths).and_return(['public/.hiddenfile'])
75
+ File.stub!(:file?).and_return(true)
76
+ end
77
+
78
+ it "should not compute hash" do
79
+ Manifesto.should_receive(:compute_file_contents_hash).never
80
+ Manifesto.cache
81
+ end
82
+
83
+ it "should not normalize the path" do
84
+ Manifesto.should_receive(:normalize_path).never
85
+ Manifesto.cache
86
+ end
87
+ end
88
+
89
+ context "and path is for a valid file" do
90
+ before(:each) do
91
+ Manifesto.stub!(:get_file_paths).and_return(['/public/file1'])
92
+ File.stub!(:file?).and_return(true)
93
+ Manifesto.stub!(:compute_file_contents_hash).and_return('asdfsafasdfsdfszxsd')
94
+ end
95
+
96
+ it "should compute the hash" do
97
+ Manifesto.should_receive(:compute_file_contents_hash).and_return('anything')
98
+ Manifesto.cache
99
+ end
100
+
101
+ it "should normalize path" do
102
+ Manifesto.should_receive(:normalize_path).with('./public', '/public/file1')
103
+ Manifesto.cache
104
+ end
105
+
106
+ context "and return an array of values" do
107
+ it "should return an array of 4 elements" do
108
+ Manifesto.cache.size.should eql(4)
109
+ end
110
+
111
+ it "should have 'CACHE MANIFEST text in the first element of the return array'" do
112
+ Manifesto.cache.first.should eql("CACHE MANIFEST\n")
113
+ end
114
+
115
+ it "should have 'generated by manifesto text'" do
116
+ Manifesto.cache.should be_include("# Generated by manifesto (http://github.com/johntopley/manifesto)\n")
117
+ end
118
+
119
+ it "should have the file name in the last element of the array" do
120
+ Manifesto.cache.last.should eql("/file1\n")
121
+ end
122
+
123
+ it "should return the hash" do
124
+ Manifesto.cache.should be_include("# Hash: f2d6ac219e22a0eed707a24d65777a0e\n")
125
+ end
126
+ end
127
+ end
128
+ end
10
129
  end
11
-
12
- it "should return a list of files within the default directory"
13
-
14
- it "should return a list of files within the specified directory"
15
-
16
- it "should compute a hash of the files within the default directory"
17
-
18
- it "should compute a hash of the files within the specified directory"
19
-
20
- it "should compute a different hash if the content of a file changes"
21
-
22
- it "shouldn't include hidden files or directories within the default directory"
23
-
24
- it "shouldn't include hidden files or directories within the specified directory"
25
130
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: manifesto
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 5
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.5.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - John Topley
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-06-05 00:00:00 +01:00
18
+ date: 2010-06-09 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -56,7 +56,7 @@ files:
56
56
  - spec/spec.opts
57
57
  - spec/spec_helper.rb
58
58
  has_rdoc: true
59
- homepage: http://manifesto.rubyforge.org
59
+ homepage: http://github.com/johntopley/manifesto
60
60
  licenses: []
61
61
 
62
62
  post_install_message:
@@ -84,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
84
  version: "0"
85
85
  requirements: []
86
86
 
87
- rubyforge_project:
87
+ rubyforge_project: manifesto
88
88
  rubygems_version: 1.3.7
89
89
  signing_key:
90
90
  specification_version: 3