rack-pipeline 0.0.10 → 0.0.11
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.
- checksums.yaml +4 -4
- data/lib/rack-pipeline/base.rb +23 -9
- data/lib/rack-pipeline/caching.rb +14 -9
- data/lib/rack-pipeline/compressing.rb +4 -1
- data/lib/rack-pipeline/processing.rb +1 -1
- data/lib/rack-pipeline/sinatra.rb +13 -15
- data/lib/rack-pipeline/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: afe6a32a4e33df67af9184d8bb6776045d3a6311
|
4
|
+
data.tar.gz: cac12bca3ebd20ca96821e4fd81b2a403dccecb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f695115376ef74ff9a39b81a09a491f04f4a0864884e96fa91bd19841f3c19cce7bb90d78406e04f88200be3d95bcb397bfe4c1dc35fd67cbeebe311aa43c02
|
7
|
+
data.tar.gz: 2382d1ef620099cc3d677caa5e7a4794a938d67a124e082218fcb52a58ee420d93b77ac9acc8e62684bdca5478f28c8ac888a55287ad77841204cf9494541d03
|
data/lib/rack-pipeline/base.rb
CHANGED
@@ -37,7 +37,7 @@ module RackPipeline
|
|
37
37
|
},
|
38
38
|
}
|
39
39
|
@settings.merge!(args.pop) if args.last.kind_of?(Hash)
|
40
|
-
|
40
|
+
ensure_temp_directory
|
41
41
|
populate_pipelines
|
42
42
|
@app = app
|
43
43
|
end
|
@@ -47,6 +47,7 @@ module RackPipeline
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def call(env)
|
50
|
+
@env = env
|
50
51
|
env['rack-pipeline'] = self
|
51
52
|
if file_path = prepare_pipe(env['PATH_INFO'])
|
52
53
|
serve_file(file_path, env['HTTP_IF_MODIFIED_SINCE'])
|
@@ -60,15 +61,26 @@ module RackPipeline
|
|
60
61
|
|
61
62
|
private
|
62
63
|
|
64
|
+
def busted?
|
65
|
+
result = settings[:bust_cache] && @busted
|
66
|
+
@busted = false
|
67
|
+
result
|
68
|
+
end
|
69
|
+
|
63
70
|
def serve_file(file, mtime)
|
64
71
|
headers = { 'Last-Modified' => File.mtime(file).httpdate }
|
65
72
|
if mtime == headers['Last-Modified']
|
66
73
|
[304, headers, []]
|
67
74
|
else
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
75
|
+
if busted?
|
76
|
+
headers['Location'] = "#{@env['PATH_INFO']}?#{File.mtime(file).to_i}"
|
77
|
+
[302, headers, []]
|
78
|
+
else
|
79
|
+
body = File.read file
|
80
|
+
headers['Content-Type'] = "#{content_type(file)}; charset=#{body.encoding.to_s}"
|
81
|
+
headers['Content-Length'] = File.size(file).to_s
|
82
|
+
[200, headers, [body]]
|
83
|
+
end
|
72
84
|
end
|
73
85
|
rescue Errno::ENOENT
|
74
86
|
raise MustRepopulate
|
@@ -95,7 +107,7 @@ module RackPipeline
|
|
95
107
|
ready_file = combine(assets[type][pipename], File.basename(file))
|
96
108
|
end
|
97
109
|
end
|
98
|
-
compress(ready_file, ready_file) if ready_file
|
110
|
+
compress(ready_file, File.basename(ready_file)) if ready_file
|
99
111
|
rescue Errno::ENOENT
|
100
112
|
raise MustRepopulate
|
101
113
|
end
|
@@ -116,9 +128,11 @@ module RackPipeline
|
|
116
128
|
static_type(file) ? :raw : :source
|
117
129
|
end
|
118
130
|
|
119
|
-
def glob_files(
|
120
|
-
|
121
|
-
|
131
|
+
def glob_files(globs)
|
132
|
+
Array(globs).each_with_object({}) do |glob,all|
|
133
|
+
Dir.glob(glob).sort.each do |file|
|
134
|
+
all[file] = file_kind(file)
|
135
|
+
end
|
122
136
|
end
|
123
137
|
end
|
124
138
|
|
@@ -4,32 +4,37 @@ require 'fileutils'
|
|
4
4
|
module RackPipeline
|
5
5
|
module Caching
|
6
6
|
def cache_target(source, target)
|
7
|
-
|
7
|
+
ensure_temp_directory
|
8
|
+
caller_method = caller.first[/`([^']*)'/, 1]
|
9
|
+
extname = File.extname(target)
|
10
|
+
target_filename = File.basename(target).sub(/[0-9a-f]{32}\./,'').chomp(extname) << '.' << caller_method
|
11
|
+
target_path = File.join(settings[:temp], target_filename + '.' << calculate_hash(source) << extname)
|
8
12
|
if File.file?(target_path)
|
9
13
|
target_path
|
10
14
|
else
|
11
|
-
cleanup_cache(
|
15
|
+
cleanup_cache(target_filename << '.*' << extname)
|
12
16
|
yield target_path
|
13
17
|
end
|
14
18
|
end
|
15
19
|
|
16
|
-
def
|
17
|
-
temp =
|
18
|
-
|
19
|
-
|
20
|
+
def ensure_temp_directory
|
21
|
+
temp = settings[:temp]
|
22
|
+
return temp if temp.kind_of?(String) && File.directory?(temp)
|
23
|
+
unless temp
|
20
24
|
require 'tmpdir'
|
21
|
-
File.join(Dir.tmpdir, 'RackPipeline')
|
25
|
+
temp = File.join(Dir.tmpdir, 'RackPipeline')
|
22
26
|
end
|
23
27
|
FileUtils.mkdir_p temp
|
24
28
|
settings[:temp] = temp
|
25
29
|
end
|
26
30
|
|
27
31
|
def cleanup_cache(target)
|
28
|
-
|
32
|
+
@busted = true
|
33
|
+
FileUtils.rm Dir.glob(File.join(settings[:temp], target))
|
29
34
|
end
|
30
35
|
|
31
36
|
def calculate_hash(sources)
|
32
|
-
Digest::MD5.hexdigest(Array(sources).inject(''){ |all,(file,_)| all <<
|
37
|
+
Digest::MD5.hexdigest(Array(sources).inject(''){ |all,(file,_)| all << file << File.mtime(file).to_i.to_s })
|
33
38
|
end
|
34
39
|
end
|
35
40
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
1
3
|
module RackPipeline
|
2
4
|
module Compressing
|
3
5
|
def self.process(source, target)
|
@@ -7,7 +9,8 @@ module RackPipeline
|
|
7
9
|
Compressing.const_get(compressor[0]).process(source, target)
|
8
10
|
else
|
9
11
|
warn "no compressor found for #{source}"
|
10
|
-
source
|
12
|
+
FileUtils.cp source, target
|
13
|
+
target
|
11
14
|
end
|
12
15
|
end
|
13
16
|
|
@@ -5,7 +5,7 @@ module RackPipeline
|
|
5
5
|
def combine(sources, target)
|
6
6
|
cache_target(sources, target) do |target_path|
|
7
7
|
body = sources.inject('') do |all,(source,kind)|
|
8
|
-
all << "
|
8
|
+
all << "/*!\n * #{source}\n */\n\n" + File.read(prepare_file(source, static_type(target))).encode('utf-8') + "\n\n"
|
9
9
|
end
|
10
10
|
File.write(target_path, body)
|
11
11
|
target_path
|
@@ -6,13 +6,13 @@ module RackPipeline
|
|
6
6
|
end
|
7
7
|
|
8
8
|
module Helpers
|
9
|
-
def pipeline(pipes = [ :app ], types = [ :css, :js ],
|
9
|
+
def pipeline(pipes = [ :app ], types = [ :css, :js ], options = {})
|
10
10
|
bust_cache = respond_to?(:settings) && settings.respond_to?(:pipeline) && settings.pipeline[:bust_cache]
|
11
|
-
pipeline_object = env['rack-pipeline']
|
11
|
+
@pipeline_object = env['rack-pipeline']
|
12
12
|
Array(types).map do |type|
|
13
|
-
assets = pipeline_object.assets_for(pipes, type,
|
13
|
+
assets = @pipeline_object.assets_for(pipes, type, options)
|
14
14
|
assets.map do |asset|
|
15
|
-
pipe_tag(type, asset, bust_cache)
|
15
|
+
pipe_tag(type, asset + options[:postfix].to_s, bust_cache)
|
16
16
|
end.join("\n")
|
17
17
|
end.join("\n")
|
18
18
|
end
|
@@ -28,20 +28,18 @@ module RackPipeline
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def cache_buster(file)
|
31
|
-
|
31
|
+
compress = respond_to?(:settings) && settings.respond_to?(:pipeline) && settings.pipeline[:compress]
|
32
|
+
if !compress && File.file?(file)
|
32
33
|
"?#{File.mtime(file).to_i}"
|
33
34
|
else
|
34
|
-
temp =
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
temp = @pipeline_object.ensure_temp_directory
|
36
|
+
max_mtime = 0
|
37
|
+
Dir.glob(File.join(temp, File.basename(file,'.*') << '.*' << File.extname(file))).each do |cached_file|
|
38
|
+
mtime = File.mtime(cached_file).to_i
|
39
|
+
max_mtime = mtime if mtime > max_mtime
|
39
40
|
end
|
40
|
-
|
41
|
-
|
42
|
-
mtimes << File.mtime(cached_file).to_i
|
43
|
-
end
|
44
|
-
"?#{mtimes.max || Time.now.to_i}"
|
41
|
+
max_mtime = Time.now.to_i if max_mtime == 0
|
42
|
+
"?#{max_mtime}"
|
45
43
|
end
|
46
44
|
end
|
47
45
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-pipeline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Bochkariov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|