manifesto 0.6.0 → 0.7.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.rdoc +10 -0
- data/VERSION +1 -1
- data/lib/manifesto.rb +53 -5
- data/manifesto.gemspec +3 -4
- data/spec/manifesto_spec.rb +34 -2
- metadata +6 -8
data/README.rdoc
CHANGED
@@ -32,17 +32,27 @@ You might need administrator privileges on your system to install it.
|
|
32
32
|
# Specify a directory and don't compute the hash
|
33
33
|
Manifesto.cache :directory => './mobile', :compute_hash => false
|
34
34
|
|
35
|
+
# Add network includes
|
36
|
+
Manifesto.cache :directory => '.mobile', :network_includes => ['http://google.com', 'http://github.com']
|
37
|
+
|
38
|
+
# Add file exclusions
|
39
|
+
Manifesto.cache :directory => '.mobile', :excludes => ['dynamic-dir/', 'dynamic.js')]
|
40
|
+
|
35
41
|
== Sample Output
|
36
42
|
|
37
43
|
CACHE MANIFEST
|
38
44
|
# Generated by manifesto (http://github.com/johntopley/manifesto)
|
39
45
|
# Hash: 7013a3b8292ceeeb6336849bee1d1365
|
46
|
+
CACHE:
|
40
47
|
/apple-touch-icon.png
|
41
48
|
/apple-touch-startup.png
|
42
49
|
/index.html
|
43
50
|
/mobile/mobile.css
|
44
51
|
/mobile/mobile.js
|
45
52
|
|
53
|
+
NETWORK:
|
54
|
+
http://github.com
|
55
|
+
|
46
56
|
== Sinatra Example
|
47
57
|
|
48
58
|
require 'manifesto.rb'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.7.0
|
data/lib/manifesto.rb
CHANGED
@@ -19,25 +19,40 @@ class Manifesto
|
|
19
19
|
def self.cache(options = {})
|
20
20
|
directory = options.fetch(:directory, './public')
|
21
21
|
compute_hash = options.fetch(:compute_hash, true)
|
22
|
-
|
22
|
+
timestamp = options.fetch(:timestamp, true)
|
23
|
+
timestamp_exclusions = options.fetch(:timestamp_exclusions, [])
|
24
|
+
network_includes = options.fetch(:network_includes, [])
|
25
|
+
excludes = options.fetch(:excludes, [])
|
26
|
+
validate_options(directory, compute_hash, timestamp, network_includes, excludes)
|
23
27
|
manifest = []
|
24
28
|
hashes = ''
|
25
29
|
|
30
|
+
if !network_includes.empty? then
|
31
|
+
network_includes.each { |inc| manifest << "#{inc}\n" }
|
32
|
+
manifest << "\nNETWORK:\n"
|
33
|
+
end
|
34
|
+
|
26
35
|
get_file_paths(directory).each do |path|
|
27
|
-
|
28
36
|
# Only include real files (i.e. not directories, symlinks etc.) and non-hidden
|
29
37
|
# files in the manifest.
|
30
38
|
if File.file?(path) && File.basename(path)[0,1] != '.'
|
31
|
-
|
39
|
+
if not in_path(path, excludes) then
|
40
|
+
if timestamp and not in_path(path, timestamp_exclusions)
|
41
|
+
manifest << "#{normalize_path(directory, path)}?#{get_timestamp(path)}\n"
|
42
|
+
else
|
43
|
+
manifest << "#{normalize_path(directory, path)}\n"
|
44
|
+
end
|
45
|
+
end
|
32
46
|
hashes += compute_file_contents_hash(path) if compute_hash
|
33
47
|
end
|
34
48
|
end
|
35
49
|
|
36
50
|
# Hash the hashes of each file and output as a comment.
|
51
|
+
manifest << "CACHE:\n"
|
37
52
|
manifest << "# Hash: #{Digest::MD5.hexdigest(hashes)}\n" if compute_hash
|
38
53
|
manifest << "# Generated by manifesto (http://github.com/johntopley/manifesto)\n"
|
39
54
|
manifest << "CACHE MANIFEST\n"
|
40
|
-
manifest.reverse
|
55
|
+
manifest.reverse.join
|
41
56
|
end
|
42
57
|
|
43
58
|
# Reads the file contents to calculate the MD5 hash, so that if a file is
|
@@ -66,11 +81,29 @@ class Manifesto
|
|
66
81
|
normalized_path = '/' + normalized_path unless normalized_path[0,1] == '/'
|
67
82
|
normalized_path
|
68
83
|
end
|
84
|
+
|
85
|
+
# Calculates the timestamp for a given file using same methodology as Rails' asset timestamps.
|
86
|
+
def self.get_timestamp(path)
|
87
|
+
File.mtime(path).to_i.to_s
|
88
|
+
end
|
89
|
+
|
90
|
+
# Determines whether or not the path contains any of the targets; used for exclusions/inclusions.
|
91
|
+
def self.in_path(path, targets)
|
92
|
+
targets.each do |target|
|
93
|
+
if path.include? target
|
94
|
+
return true
|
95
|
+
end
|
96
|
+
end
|
97
|
+
false
|
98
|
+
end
|
69
99
|
|
70
100
|
# Checks that the options passed to the <tt>cache</tt> method are valid.
|
71
|
-
def self.validate_options(directory, compute_hash)
|
101
|
+
def self.validate_options(directory, compute_hash, timestamp, network_includes, excludes)
|
72
102
|
raise(ArgumentError, ":directory must be a real directory") unless valid_directory?(directory)
|
73
103
|
raise(ArgumentError, ":compute_hash must be a boolean") unless valid_compute_hash?(compute_hash)
|
104
|
+
raise(ArgumentError, ":timestamp must be a boolean") unless valid_timestamp?(timestamp)
|
105
|
+
raise(ArgumentError, ":network_includes must be an array") unless valid_network_includes?(network_includes)
|
106
|
+
raise(ArgumentError, ":excludes must be an array") unless valid_excludes?(excludes)
|
74
107
|
end
|
75
108
|
|
76
109
|
# Checks that the <tt>compute_hash</tt> option is a boolean.
|
@@ -82,4 +115,19 @@ class Manifesto
|
|
82
115
|
def self.valid_directory?(directory)
|
83
116
|
File.directory?(directory)
|
84
117
|
end
|
118
|
+
|
119
|
+
# Checks that the <tt>timestamp</tt> option is a boolean.
|
120
|
+
def self.valid_timestamp?(timestamp)
|
121
|
+
timestamp.is_a?(TrueClass) || timestamp.is_a?(FalseClass)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Checks that the <tt>network_includes</tt> option is a boolean.
|
125
|
+
def self.valid_network_includes?(network_includes)
|
126
|
+
network_includes.is_a?(Array)
|
127
|
+
end
|
128
|
+
|
129
|
+
# Checks that the <tt>excludes</tt> option is a boolean.
|
130
|
+
def self.valid_excludes?(excludes)
|
131
|
+
excludes.is_a?(Array)
|
132
|
+
end
|
85
133
|
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.
|
8
|
+
s.version = "0.7.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", "Nasir Jamal"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2012-02-04}
|
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 = [
|
@@ -33,7 +33,7 @@ Gem::Specification.new do |s|
|
|
33
33
|
s.rdoc_options = ["--charset=UTF-8"]
|
34
34
|
s.require_paths = ["lib"]
|
35
35
|
s.rubyforge_project = %q{manifesto}
|
36
|
-
s.rubygems_version = %q{1.
|
36
|
+
s.rubygems_version = %q{1.7.2}
|
37
37
|
s.summary = %q{Manifesto is a Ruby library that dynamically generates an HTML5 cache manifest}
|
38
38
|
s.test_files = [
|
39
39
|
"spec/manifesto_spec.rb",
|
@@ -41,7 +41,6 @@ Gem::Specification.new do |s|
|
|
41
41
|
]
|
42
42
|
|
43
43
|
if s.respond_to? :specification_version then
|
44
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
45
44
|
s.specification_version = 3
|
46
45
|
|
47
46
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
data/spec/manifesto_spec.rb
CHANGED
@@ -3,11 +3,23 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
3
3
|
describe Manifesto do
|
4
4
|
describe ".validate_options" do
|
5
5
|
it "should raise ArgumentError if directory is not a real directory" do
|
6
|
-
expect{ Manifesto.validate_options('', false) }.to raise_error(ArgumentError)
|
6
|
+
expect{ Manifesto.validate_options('', false, false, [], []) }.to raise_error(ArgumentError)
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should raise ArgumentError if compute_hash is not a boolean" do
|
10
|
-
expect{ Manifesto.validate_options('.', nil) }.to raise_error(ArgumentError)
|
10
|
+
expect{ Manifesto.validate_options('.', nil, false, [], []) }.to raise_error(ArgumentError)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should raise ArgumentError if timestamp is not a boolean" do
|
14
|
+
expect{ Manifesto.validate_options('.', false, nil, [], []) }.to raise_error(ArgumentError)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should raise ArgumentError if network_includes is not an array" do
|
18
|
+
expect{ Manifesto.validate_options('.', false, false, nil, []) }.to raise_error(ArgumentError)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should raise ArgumentError if excludes is not an array" do
|
22
|
+
expect{ Manifesto.validate_options('.', false, false, [], nil) }.to raise_error(ArgumentError)
|
11
23
|
end
|
12
24
|
end
|
13
25
|
|
@@ -40,6 +52,11 @@ describe Manifesto do
|
|
40
52
|
Manifesto.stub!(:get_file_paths).and_return([])
|
41
53
|
end
|
42
54
|
|
55
|
+
it "should not get the timestamp" do
|
56
|
+
Manifesto.should_receive(:get_timestamp).never
|
57
|
+
Manifesto.cache
|
58
|
+
end
|
59
|
+
|
43
60
|
it "should not compute hash" do
|
44
61
|
Manifesto.should_receive(:compute_file_contents_hash).never
|
45
62
|
Manifesto.cache
|
@@ -58,6 +75,11 @@ describe Manifesto do
|
|
58
75
|
File.stub!(:file?).and_return(false)
|
59
76
|
end
|
60
77
|
|
78
|
+
it "should not get the timestamp" do
|
79
|
+
Manifesto.should_receive(:get_timestamp).never
|
80
|
+
Manifesto.cache
|
81
|
+
end
|
82
|
+
|
61
83
|
it "should not compute hash" do
|
62
84
|
Manifesto.should_receive(:compute_file_contents_hash).never
|
63
85
|
Manifesto.cache
|
@@ -75,6 +97,11 @@ describe Manifesto do
|
|
75
97
|
File.stub!(:file?).and_return(true)
|
76
98
|
end
|
77
99
|
|
100
|
+
it "should not get the timestamp" do
|
101
|
+
Manifesto.should_receive(:get_timestamp).never
|
102
|
+
Manifesto.cache
|
103
|
+
end
|
104
|
+
|
78
105
|
it "should not compute hash" do
|
79
106
|
Manifesto.should_receive(:compute_file_contents_hash).never
|
80
107
|
Manifesto.cache
|
@@ -93,6 +120,11 @@ describe Manifesto do
|
|
93
120
|
Manifesto.stub!(:compute_file_contents_hash).and_return('asdfsafasdfsdfszxsd')
|
94
121
|
end
|
95
122
|
|
123
|
+
it "should get the timestamp" do
|
124
|
+
Manifesto.should_receive(:get_timestamp).and_return('anything')
|
125
|
+
Manifesto.cache
|
126
|
+
end
|
127
|
+
|
96
128
|
it "should compute the hash" do
|
97
129
|
Manifesto.should_receive(:compute_file_contents_hash).and_return('anything')
|
98
130
|
Manifesto.cache
|
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:
|
5
|
-
prerelease:
|
4
|
+
hash: 3
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 7
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.7.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Topley
|
@@ -16,8 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
20
|
-
default_executable:
|
19
|
+
date: 2012-02-04 00:00:00 Z
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
23
22
|
name: rspec
|
@@ -56,7 +55,6 @@ files:
|
|
56
55
|
- spec/manifesto_spec.rb
|
57
56
|
- spec/spec.opts
|
58
57
|
- spec/spec_helper.rb
|
59
|
-
has_rdoc: true
|
60
58
|
homepage: http://github.com/johntopley/manifesto
|
61
59
|
licenses: []
|
62
60
|
|
@@ -86,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
86
84
|
requirements: []
|
87
85
|
|
88
86
|
rubyforge_project: manifesto
|
89
|
-
rubygems_version: 1.
|
87
|
+
rubygems_version: 1.7.2
|
90
88
|
signing_key:
|
91
89
|
specification_version: 3
|
92
90
|
summary: Manifesto is a Ruby library that dynamically generates an HTML5 cache manifest
|