concord_cacher 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'spec/rake/spectask'
6
6
  require './lib/concord_cacher.rb'
7
7
 
8
8
  require 'echoe'
9
- Echoe.new('concord_cacher', '0.0.2') do |p|
9
+ Echoe.new('concord_cacher', '0.0.3') do |p|
10
10
  p.description = "concord_cacher provides support for locally caching a resource and all referenced resources in multiple different ways. It is intended for using with other Concord Consortium projects and not necessarily for outside projects."
11
11
  p.summary = "Support for locally caching a resource and all referenced resources in multiple different ways"
12
12
  p.url = "http://github.com/psndcsrv/concord_cacher"
@@ -2,12 +2,12 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{concord_cacher}
5
- s.version = "0.0.2"
5
+ s.version = "0.0.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Aaron Unger"]
9
9
  s.cert_chain = ["/Users/aunger/gem-public_cert.pem"]
10
- s.date = %q{2010-03-25}
10
+ s.date = %q{2010-03-26}
11
11
  s.description = %q{concord_cacher provides support for locally caching a resource and all referenced resources in multiple different ways. It is intended for using with other Concord Consortium projects and not necessarily for outside projects.}
12
12
  s.email = %q{aunger @nospam@ concord.org}
13
13
  s.extra_rdoc_files = ["README.textile", "lib/concord_cacher.rb", "lib/concord/cacher.rb", "lib/concord/diy_local_cacher.rb", "lib/concord/java_proxy_cacher.rb"]
@@ -1,6 +1,7 @@
1
1
  class ::Concord::DiyLocalCacher < ::Concord::Cacher
2
2
  require 'uri'
3
3
  require 'digest/sha1'
4
+ require 'fileutils'
4
5
 
5
6
  def initialize(opts = {})
6
7
  raise InvalidArgumentError, "Must include :activity in the options hash." unless opts[:activity]
@@ -21,11 +22,14 @@ class ::Concord::DiyLocalCacher < ::Concord::Cacher
21
22
 
22
23
  def generate_filename(opts = {})
23
24
  raise InvalidArgumentError, "Must include :url key in opts" unless opts[:url]
24
- url = opts[:url]
25
- if url.kind_of?(::URI) && url.scheme == 'file'
26
- url = url.path
27
- end
28
- url = url.to_s
29
- return ::Digest::SHA1.hexdigest(url)
25
+ raise InvalidArgumentError, ":url value must be an instance of URI" unless opts[:url].kind_of?(::URI)
26
+ uri = opts[:url]
27
+ uri_path = uri.path.split('/')
28
+ uri_path = ["","index.html"] if uri_path.size == 0
29
+ uri_path.unshift("") if uri_path.size == 1
30
+ file_dir = File.join("#{uri.scheme}","#{uri.host}","#{uri.port}",uri_path[0..-2])
31
+ file = uri_path[-1]
32
+ mkdir_p(File.join(@cache_dir,file_dir))
33
+ return File.join(file_dir,file)
30
34
  end
31
35
  end
@@ -30,12 +30,31 @@ describe 'DIY Local Cacher' do
30
30
  @cache += '/'
31
31
  end
32
32
 
33
+ after(:each) do
34
+ rm_rf(@cache)
35
+ end
36
+
33
37
  def mockup(file)
34
38
  return mock('activity',{:uuid => 'hash', :url => file})
35
39
  end
36
40
 
37
- after(:each) do
38
- rm_rf(@cache)
41
+ def filename_for(url, parent=nil)
42
+ uri = nil
43
+ if parent
44
+ parent_uri = URI.parse(parent)
45
+ parent_uri = URI.parse("file:///").merge(parent_uri) if parent_uri.relative?
46
+
47
+ uri = parent_uri.merge(url)
48
+ else
49
+ uri = URI.parse(url)
50
+ end
51
+
52
+ uri_path = uri.path.split('/')
53
+ uri_path = ["","index.html"] if uri_path.size == 0
54
+ uri_path.unshift("") if uri_path.size == 1
55
+ file_dir = File.join("#{uri.scheme}","#{uri.host}","#{uri.port}",uri_path[0..-2])
56
+ file = uri_path[-1]
57
+ return File.join(file_dir,file)
39
58
  end
40
59
 
41
60
  describe 'empty otml' do
@@ -62,8 +81,8 @@ describe 'DIY Local Cacher' do
62
81
  it 'should cache 2 referenced files' do
63
82
  expected_files = []
64
83
  expected_files << 'hash.otml' # standard_uri.otml
65
- expected_files << ::Digest::SHA1.hexdigest('http://portal.concord.org/images/icons/delete.png')
66
- expected_files << ::Digest::SHA1.hexdigest('https://mail.google.com/mail/images/2/5/mountains/base/gmail_solid_white.png')
84
+ expected_files << filename_for('http://portal.concord.org/images/icons/delete.png')
85
+ expected_files << filename_for('https://mail.google.com/mail/images/2/5/mountains/base/gmail_solid_white.png')
67
86
 
68
87
  cache('standard_uri.otml', :activity => mockup('standard_uri.otml'))
69
88
 
@@ -81,8 +100,8 @@ describe 'DIY Local Cacher' do
81
100
  file_content = File.read(File.join(@cache,'hash.otml'))
82
101
 
83
102
  file_content.should_not match(/http:/)
84
- file_content.should match(::Digest::SHA1.hexdigest('http://portal.concord.org/images/icons/delete.png'))
85
- file_content.should match(::Digest::SHA1.hexdigest('https://mail.google.com/mail/images/2/5/mountains/base/gmail_solid_white.png'))
103
+ file_content.should match(filename_for('http://portal.concord.org/images/icons/delete.png'))
104
+ file_content.should match(filename_for('https://mail.google.com/mail/images/2/5/mountains/base/gmail_solid_white.png'))
86
105
  end
87
106
  end
88
107
 
@@ -90,12 +109,12 @@ describe 'DIY Local Cacher' do
90
109
  it 'should cache 6 referenced files' do
91
110
  expected_files = []
92
111
  expected_files << 'hash.otml' # element_reference.otml
93
- expected_files << ::Digest::SHA1.hexdigest('http://loops.diy.concord.org/')
94
- expected_files << ::Digest::SHA1.hexdigest('http://portal.concord.org/images/icons/chart_bar.png')
95
- expected_files << ::Digest::SHA1.hexdigest('http://portal.concord.org/images/icons/chart_pie.png')
96
- expected_files << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','text.txt'))
97
- expected_files << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','delete.png'))
98
- expected_files << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','chart_line.png'))
112
+ expected_files << filename_for('http://loops.diy.concord.org/')
113
+ expected_files << filename_for('http://portal.concord.org/images/icons/chart_bar.png')
114
+ expected_files << filename_for('http://portal.concord.org/images/icons/chart_pie.png')
115
+ expected_files << filename_for('resources/text.txt', File.join(SPEC_ROOT,'data','element_reference.otml'))
116
+ expected_files << filename_for('resources/delete.png', File.join(SPEC_ROOT,'data','element_reference.otml'))
117
+ expected_files << filename_for('resources/chart_line.png', File.join(SPEC_ROOT,'data','element_reference.otml'))
99
118
 
100
119
  cache('element_reference.otml', :activity => mockup('element_reference.otml'))
101
120
 
@@ -117,9 +136,9 @@ describe 'DIY Local Cacher' do
117
136
 
118
137
  unexpected_urls.each do |url|
119
138
  if url =~ /^http/
120
- expected_urls << ::Digest::SHA1.hexdigest(url)
139
+ expected_urls << filename_for(url)
121
140
  else
122
- expected_urls << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data',url))
141
+ expected_urls << filename_for(url, File.join(SPEC_ROOT,'data','element_reference.otml'))
123
142
  end
124
143
  end
125
144
 
@@ -128,7 +147,7 @@ describe 'DIY Local Cacher' do
128
147
  file_content = File.read(File.join(@cache,'hash.otml'))
129
148
 
130
149
  unexpected_urls.each do |url|
131
- file_content.should_not match(Regexp.new(url))
150
+ file_content.should_not match(Regexp.new('"'+url))
132
151
  end
133
152
 
134
153
  expected_urls.each do |url|
@@ -141,10 +160,10 @@ describe 'DIY Local Cacher' do
141
160
  it 'should cache 4 referenced files in otml files' do
142
161
  expected_files = []
143
162
  expected_files << 'hash.otml' # recursion.otml
144
- expected_files << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','recurse1.otml'))
145
- expected_files << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','delete.png'))
146
- expected_files << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','recurse2.otml'))
147
- expected_files << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','chart_line.png'))
163
+ expected_files << filename_for('resources/recurse1.otml', File.join(SPEC_ROOT,'data','recursion.otml'))
164
+ expected_files << filename_for('resources/delete.png', File.join(SPEC_ROOT,'data','recursion.otml'))
165
+ expected_files << filename_for('resources/recurse2.otml', File.join(SPEC_ROOT,'data','recursion.otml'))
166
+ expected_files << filename_for('resources/chart_line.png', File.join(SPEC_ROOT,'data','recursion.otml'))
148
167
 
149
168
  cache('recursion.otml', :activity => mockup('recursion.otml'))
150
169
 
@@ -155,7 +174,7 @@ describe 'DIY Local Cacher' do
155
174
  end
156
175
 
157
176
  it 'should rewrite urls in first level recursion otml' do
158
- recurse_otml = ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','recurse1.otml'))
177
+ recurse_otml = filename_for('resources/recurse1.otml', File.join(SPEC_ROOT,'data','recursion.otml'))
159
178
 
160
179
  expected_urls = []
161
180
  unexpected_urls = []
@@ -164,7 +183,7 @@ describe 'DIY Local Cacher' do
164
183
  unexpected_urls << File.join('resources','delete.png')
165
184
 
166
185
  unexpected_urls.each do |url|
167
- expected_urls << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data',url))
186
+ expected_urls << filename_for(url, File.join(SPEC_ROOT,'data','recursion.otml'))
168
187
  end
169
188
 
170
189
  cache('recursion.otml', :activity => mockup('recursion.otml'))
@@ -172,7 +191,7 @@ describe 'DIY Local Cacher' do
172
191
  file_content = File.read(File.join(@cache,recurse_otml))
173
192
 
174
193
  unexpected_urls.each do |url|
175
- file_content.should_not match(Regexp.new(url))
194
+ file_content.should_not match(Regexp.new('"'+url))
176
195
  end
177
196
 
178
197
  expected_urls.each do |url|
@@ -181,7 +200,7 @@ describe 'DIY Local Cacher' do
181
200
  end
182
201
 
183
202
  it 'should rewrite urls in second level recursion otml' do
184
- recurse_otml = ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','recurse2.otml'))
203
+ recurse_otml = recurse_otml = filename_for('resources/recurse2.otml', File.join(SPEC_ROOT,'data','recursion.otml'))
185
204
 
186
205
  expected_urls = []
187
206
  unexpected_urls = []
@@ -189,7 +208,7 @@ describe 'DIY Local Cacher' do
189
208
  unexpected_urls << File.join('resources','chart_line.png')
190
209
 
191
210
  unexpected_urls.each do |url|
192
- expected_urls << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data',url))
211
+ expected_urls << filename_for(url, File.join(SPEC_ROOT,'data','recursion.otml'))
193
212
  end
194
213
 
195
214
  cache('recursion.otml', :activity => mockup('recursion.otml'))
@@ -197,7 +216,7 @@ describe 'DIY Local Cacher' do
197
216
  file_content = File.read(File.join(@cache,recurse_otml))
198
217
 
199
218
  unexpected_urls.each do |url|
200
- file_content.should_not match(Regexp.new(url))
219
+ file_content.should_not match(Regexp.new('"'+url))
201
220
  end
202
221
 
203
222
  expected_urls.each do |url|
@@ -208,10 +227,10 @@ describe 'DIY Local Cacher' do
208
227
  it 'should not get stuck when handling circular loops' do
209
228
  expected_files = []
210
229
  expected_files << 'hash.otml' # recursion.otml
211
- expected_files << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','loop1.otml'))
212
- expected_files << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','delete.png'))
213
- expected_files << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','loop2.otml'))
214
- expected_files << ::Digest::SHA1.hexdigest(File.join(SPEC_ROOT,'data','resources','chart_line.png'))
230
+ expected_files << filename_for('resources/loop1.otml', File.join(SPEC_ROOT,'data','recursive_loop.otml'))
231
+ expected_files << filename_for('resources/delete.png', File.join(SPEC_ROOT,'data','recursive_loop.otml'))
232
+ expected_files << filename_for('resources/loop2.otml', File.join(SPEC_ROOT,'data','recursive_loop.otml'))
233
+ expected_files << filename_for('resources/chart_line.png', File.join(SPEC_ROOT,'data','recursive_loop.otml'))
215
234
 
216
235
  lambda {
217
236
  cache('recursive_loop.otml', :activity => mockup('recursive_loop.otml'))
@@ -8,6 +8,7 @@ module CacheHelper
8
8
  def exists?(file)
9
9
  f = File.join(@cache,file)
10
10
  File.should be_exists(f)
11
+ File.should be_file(f)
11
12
  end
12
13
 
13
14
  def does_not_exist?(file)
@@ -16,6 +17,6 @@ module CacheHelper
16
17
  end
17
18
 
18
19
  def cache_size
19
- Dir.glob(@cache + "/*").size
20
+ Dir.glob(@cache + "/**/*").select{|f| File.file?(f) }.size
20
21
  end
21
22
  end
@@ -38,6 +38,7 @@ describe 'Java Proxy Cacher' do
38
38
  describe 'empty otml' do
39
39
  it 'should create a url map xml file' do
40
40
  cache('empty.otml')
41
+ cache_size.should == 3
41
42
  exists?('url_map.xml')
42
43
  end
43
44
 
@@ -45,6 +46,7 @@ describe 'Java Proxy Cacher' do
45
46
  url = File.join(SPEC_ROOT,'data','empty.otml')
46
47
  expected_filename = ::Digest::SHA1.hexdigest(File.read(url))
47
48
  cache('empty.otml')
49
+ cache_size.should == 3
48
50
  exists?(expected_filename)
49
51
  end
50
52
 
@@ -52,10 +54,48 @@ describe 'Java Proxy Cacher' do
52
54
  url = File.join(SPEC_ROOT,'data','empty.otml')
53
55
  expected_filename = ::Digest::SHA1.hexdigest(File.read(url))
54
56
  cache('empty.otml')
57
+ cache_size.should == 3
55
58
  exists?("#{expected_filename}.hdrs")
56
59
  end
57
60
  end
58
61
 
62
+ describe 'error handling' do
63
+ it 'should handle a bad url gracefully' do
64
+ url = File.join(SPEC_ROOT,'data','bad_url.otml')
65
+ expected_filename = ::Digest::SHA1.hexdigest(File.read(url))
66
+
67
+ lambda {
68
+ cache('bad_url.otml')
69
+ }.should_not raise_error
70
+
71
+ cache_size.should == 3
72
+
73
+ exists?(expected_filename)
74
+ does_not_exist?('8f0ebcb45d7ba71a541d4781329f4a6900c7ee65') # http://portal.concord.org/images/icons/delete.png
75
+ end
76
+
77
+ it 'should handle an empty url gracefully' do
78
+ url = File.join(SPEC_ROOT,'data','empty_url.otml')
79
+ expected_filename = ::Digest::SHA1.hexdigest(File.read(url))
80
+
81
+ lambda {
82
+ cache('empty_url.otml')
83
+ }.should_not raise_error
84
+
85
+ cache_size.should == 3
86
+
87
+ exists?(expected_filename)
88
+ end
89
+
90
+ it 'should handle an empty root url gracefully' do
91
+ lambda {
92
+ cache('')
93
+ }.should_not raise_error
94
+
95
+ cache_size.should == 1
96
+ end
97
+ end
98
+
59
99
  describe 'standard uri syntax' do
60
100
  it 'should cache 2 referenced files' do
61
101
  expected_files = []
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Aaron Unger
@@ -35,7 +35,7 @@ cert_chain:
35
35
  8kT2T2VF
36
36
  -----END CERTIFICATE-----
37
37
 
38
- date: 2010-03-25 00:00:00 -04:00
38
+ date: 2010-03-26 00:00:00 -04:00
39
39
  default_executable:
40
40
  dependencies: []
41
41
 
metadata.gz.sig CHANGED
Binary file