dassets 0.5.0 → 0.6.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.md +8 -13
- data/lib/dassets/asset_file.rb +7 -7
- data/lib/dassets/digest_cmd.rb +6 -1
- data/lib/dassets/file_store.rb +1 -2
- data/lib/dassets/server/request.rb +1 -1
- data/lib/dassets/source.rb +38 -0
- data/lib/dassets/source_file.rb +23 -23
- data/lib/dassets/source_proxy.rb +56 -0
- data/lib/dassets/version.rb +1 -1
- data/lib/dassets.rb +14 -19
- data/test/helper.rb +3 -0
- data/test/support/config/assets.rb +4 -3
- data/test/system/digest_cmd_run_tests.rb +2 -2
- data/test/system/rack_tests.rb +1 -1
- data/test/unit/asset_file_tests.rb +11 -11
- data/test/unit/config_tests.rb +22 -31
- data/test/unit/dassets_tests.rb +6 -46
- data/test/unit/file_store_tests.rb +5 -4
- data/test/unit/source_file_tests.rb +9 -8
- data/test/unit/source_proxy_tests.rb +92 -0
- data/test/unit/source_tests.rb +89 -0
- metadata +10 -8
- data/lib/dassets/root_path.rb +0 -12
- data/lib/dassets/source_cache.rb +0 -39
- data/test/unit/source_cache_tests.rb +0 -50
data/README.md
CHANGED
@@ -14,22 +14,13 @@ require 'dassets'
|
|
14
14
|
|
15
15
|
Dassets.configure do |c|
|
16
16
|
|
17
|
-
# tell Dassets
|
18
|
-
c.
|
19
|
-
|
20
|
-
# tell Dassets where to look for source files and (optionally) how to filter those files
|
21
|
-
c.source_path 'lib/asset_files' # default: '{root_path}/app/assets'
|
22
|
-
c.source_filter proc{ |paths| paths.select{ |p| ... } }
|
23
|
-
# --OR--
|
24
|
-
c.source 'lib/asset_files' do |paths|
|
25
|
-
# return the filtered source path list
|
26
|
-
paths.select{ |p| ... }
|
27
|
-
end
|
17
|
+
# tell Dassets where to look for source files
|
18
|
+
c.source '/path/to/app/assets'
|
28
19
|
|
29
20
|
# (optional) tell Dassets where to store digested asset files
|
30
21
|
# if none given, Dassets will not write any digested output
|
31
22
|
# use this to "cache" digested assets to the public dir (for example)
|
32
|
-
c.file_store 'public' # default: `NullFileStore.new`
|
23
|
+
c.file_store '/path/to/public' # default: `NullFileStore.new`
|
33
24
|
|
34
25
|
end
|
35
26
|
```
|
@@ -81,7 +72,7 @@ TODO: programmatically cache asset files
|
|
81
72
|
|
82
73
|
## Compiling
|
83
74
|
|
84
|
-
Dassets
|
75
|
+
Dassets compiles your asset source as part of its digest pipeline using "engines". Engines transform source extensions and content.
|
85
76
|
|
86
77
|
Engines are "registered" with dassets based on source extensions. Name your source file with registered extensions and those engines will be used to compile your source content.
|
87
78
|
|
@@ -98,6 +89,10 @@ TODO
|
|
98
89
|
* override the `compile` method to specify how the input content should be transformed
|
99
90
|
* register your engine class with Dassets
|
100
91
|
|
92
|
+
## Sources
|
93
|
+
|
94
|
+
TODO: filtering files, registering engines
|
95
|
+
|
101
96
|
## Combinations
|
102
97
|
|
103
98
|
TODO
|
data/lib/dassets/asset_file.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
require 'rack/utils'
|
2
2
|
require 'rack/mime'
|
3
|
-
require 'dassets/
|
3
|
+
require 'dassets/source_proxy'
|
4
4
|
|
5
5
|
module Dassets; end
|
6
6
|
class Dassets::AssetFile
|
7
7
|
|
8
|
-
attr_reader :digest_path, :dirname, :extname, :basename, :
|
8
|
+
attr_reader :digest_path, :dirname, :extname, :basename, :source_proxy
|
9
9
|
|
10
10
|
def initialize(digest_path)
|
11
11
|
@digest_path = digest_path
|
12
12
|
@dirname = File.dirname(@digest_path)
|
13
13
|
@extname = File.extname(@digest_path)
|
14
14
|
@basename = File.basename(@digest_path, @extname)
|
15
|
-
@
|
15
|
+
@source_proxy = Dassets::SourceProxy.new(@digest_path, Dassets.config.cache)
|
16
16
|
end
|
17
17
|
|
18
18
|
def digest!
|
@@ -33,17 +33,17 @@ class Dassets::AssetFile
|
|
33
33
|
|
34
34
|
def fingerprint
|
35
35
|
return nil if !self.exists?
|
36
|
-
@fingerprint ||= @
|
36
|
+
@fingerprint ||= @source_proxy.fingerprint
|
37
37
|
end
|
38
38
|
|
39
39
|
def content
|
40
40
|
return nil if !self.exists?
|
41
|
-
@content ||= @
|
41
|
+
@content ||= @source_proxy.content
|
42
42
|
end
|
43
43
|
|
44
44
|
def mtime
|
45
45
|
return nil if !self.exists?
|
46
|
-
@mtime ||= @
|
46
|
+
@mtime ||= @source_proxy.mtime.httpdate
|
47
47
|
end
|
48
48
|
|
49
49
|
def size
|
@@ -57,7 +57,7 @@ class Dassets::AssetFile
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def exists?
|
60
|
-
@
|
60
|
+
@source_proxy.exists?
|
61
61
|
end
|
62
62
|
|
63
63
|
def ==(other_asset_file)
|
data/lib/dassets/digest_cmd.rb
CHANGED
@@ -5,6 +5,11 @@ require 'dassets/source_file'
|
|
5
5
|
module Dassets; end
|
6
6
|
class Dassets::DigestCmd
|
7
7
|
|
8
|
+
# TODO: need digest cmd to be aware of and digest combinations as well.
|
9
|
+
# going to wait on this for now b/c there are changes coming to how sources
|
10
|
+
# are obtained and the future of the digest cmd and I want to see how thost
|
11
|
+
# end up first.
|
12
|
+
|
8
13
|
attr_reader :paths
|
9
14
|
|
10
15
|
def initialize(abs_paths)
|
@@ -15,7 +20,7 @@ class Dassets::DigestCmd
|
|
15
20
|
files = @paths
|
16
21
|
if @paths.empty?
|
17
22
|
# always get the latest source list
|
18
|
-
files = Dassets
|
23
|
+
files = Dassets.source_list
|
19
24
|
end
|
20
25
|
|
21
26
|
log io, "digesting #{files.count} source file(s) ..."
|
data/lib/dassets/file_store.rb
CHANGED
@@ -17,7 +17,7 @@ class Dassets::Server
|
|
17
17
|
# - then check if for a digested asset resource (kinda fast)
|
18
18
|
# - then check if source exists for the digested asset (slower)
|
19
19
|
def for_asset_file?
|
20
|
-
!!((get? || head?) && for_digested_asset? && asset_file.
|
20
|
+
!!((get? || head?) && for_digested_asset? && asset_file.exists?)
|
21
21
|
end
|
22
22
|
|
23
23
|
def asset_path
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'dassets/engine'
|
2
|
+
|
3
|
+
module Dassets; end
|
4
|
+
class Dassets::Source
|
5
|
+
|
6
|
+
attr_reader :path, :engines
|
7
|
+
|
8
|
+
def initialize(path)
|
9
|
+
@path = path.to_s
|
10
|
+
@filter = proc{ |paths| paths }
|
11
|
+
@engines = Hash.new{ |h,k| Dassets::NullEngine.new }
|
12
|
+
end
|
13
|
+
|
14
|
+
def filter(&block)
|
15
|
+
block.nil? ? @filter : @filter = block
|
16
|
+
end
|
17
|
+
|
18
|
+
def engine(input_ext, engine_class, registered_opts=nil)
|
19
|
+
default_opts = { 'source_path' => @path }
|
20
|
+
engine_opts = default_opts.merge(registered_opts || {})
|
21
|
+
@engines[input_ext.to_s] = engine_class.new(engine_opts)
|
22
|
+
end
|
23
|
+
|
24
|
+
def files
|
25
|
+
apply_filter(glob_files).sort
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def glob_files
|
31
|
+
Dir.glob(File.join(@path, "**/*" )).reject!{ |p| !File.file?(p) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def apply_filter(files)
|
35
|
+
@filter.call(files)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/lib/dassets/source_file.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'digest/md5'
|
2
1
|
require 'fileutils'
|
3
2
|
require 'dassets'
|
4
3
|
require 'dassets/asset_file'
|
@@ -8,22 +7,30 @@ module Dassets
|
|
8
7
|
class SourceFile
|
9
8
|
|
10
9
|
def self.find_by_digest_path(path)
|
11
|
-
#
|
12
|
-
|
13
|
-
sources = Dassets::SourceList.new(Dassets.config).map{ |p| self.new(p) }
|
10
|
+
# look in the configured source list
|
11
|
+
source_files = Dassets.source_list.map{ |p| self.new(p) }
|
14
12
|
|
15
|
-
# get the last matching one in case two
|
16
|
-
# the last one *should* be correct since it was last to be
|
17
|
-
|
13
|
+
# get the last matching one (in case two source files have the same digest
|
14
|
+
# path the last one *should* be correct since it was last to be configured)
|
15
|
+
source_files.select{ |s| s.digest_path == path }.last || NullSourceFile.new(path)
|
18
16
|
end
|
19
17
|
|
20
18
|
attr_reader :file_path
|
21
19
|
|
22
20
|
def initialize(file_path)
|
23
|
-
@file_path = file_path
|
21
|
+
@file_path = file_path.to_s
|
24
22
|
@ext_list = File.basename(@file_path).split('.').reverse
|
25
23
|
end
|
26
24
|
|
25
|
+
# get the last matching one (in the case two sources with the same path are
|
26
|
+
# configured) since we select the last matching source file (from the last
|
27
|
+
# configured source) in `find_by_digest_path` above.
|
28
|
+
def source
|
29
|
+
@source ||= Dassets.config.sources.select do |source|
|
30
|
+
@file_path =~ /^#{slash_path(source.path)}/
|
31
|
+
end.last
|
32
|
+
end
|
33
|
+
|
27
34
|
def asset_file
|
28
35
|
@asset_file ||= Dassets::AssetFile.new(self.digest_path)
|
29
36
|
end
|
@@ -31,32 +38,25 @@ module Dassets
|
|
31
38
|
def digest_path
|
32
39
|
@digest_path ||= begin
|
33
40
|
digest_basename = @ext_list.inject([]) do |digest_ext_list, ext|
|
34
|
-
digest_ext_list <<
|
35
|
-
end.reject
|
41
|
+
digest_ext_list << self.source.engines[ext].ext(ext)
|
42
|
+
end.reject(&:empty?).reverse.join('.')
|
36
43
|
|
37
|
-
File.join([
|
38
|
-
digest_dirname(@file_path, Dassets.config.source_path),
|
39
|
-
digest_basename
|
40
|
-
].reject{ |p| p.empty? })
|
44
|
+
File.join([digest_dirname(@file_path), digest_basename].reject(&:empty?))
|
41
45
|
end
|
42
46
|
end
|
43
47
|
|
44
48
|
def compiled
|
45
49
|
@compiled ||= @ext_list.inject(read_file(@file_path)) do |content, ext|
|
46
|
-
|
50
|
+
self.source.engines[ext].compile(content)
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
50
|
-
def fingerprint
|
51
|
-
@fingerprint ||= Digest::MD5.new.hexdigest(self.compiled)
|
52
|
-
end
|
53
|
-
|
54
54
|
def exists?
|
55
55
|
File.file?(@file_path)
|
56
56
|
end
|
57
57
|
|
58
58
|
def mtime
|
59
|
-
File.mtime(@file_path)
|
59
|
+
File.mtime(@file_path)
|
60
60
|
end
|
61
61
|
|
62
62
|
def ==(other_source_file)
|
@@ -65,8 +65,9 @@ module Dassets
|
|
65
65
|
|
66
66
|
private
|
67
67
|
|
68
|
-
|
69
|
-
|
68
|
+
# remove the source path from the dirname (if it exists)
|
69
|
+
def digest_dirname(file_path)
|
70
|
+
slash_path(File.dirname(file_path)).sub(slash_path(self.source.path), '')
|
70
71
|
end
|
71
72
|
|
72
73
|
def slash_path(path)
|
@@ -86,7 +87,6 @@ module Dassets
|
|
86
87
|
@ext_list = []
|
87
88
|
@digest_path = digest_path
|
88
89
|
end
|
89
|
-
def digest; end
|
90
90
|
def ==(other_source_file)
|
91
91
|
self.file_path == other_source_file.file_path
|
92
92
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'dassets/source_file'
|
3
|
+
|
4
|
+
module Dassets; end
|
5
|
+
class Dassets::SourceProxy
|
6
|
+
|
7
|
+
attr_reader :digest_path, :source_files, :cache
|
8
|
+
|
9
|
+
def initialize(digest_path, cache=nil)
|
10
|
+
@digest_path = digest_path
|
11
|
+
@source_files = get_source_files(@digest_path)
|
12
|
+
@cache = cache || NoCache.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def key
|
16
|
+
"#{self.digest_path} -- #{self.mtime}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def content
|
20
|
+
@cache["#{self.key} -- content"] ||= source_content
|
21
|
+
end
|
22
|
+
|
23
|
+
def fingerprint
|
24
|
+
@cache["#{self.key} -- fingerprint"] ||= source_fingerprint
|
25
|
+
end
|
26
|
+
|
27
|
+
def mtime
|
28
|
+
@source_files.map{ |f| f.mtime }.max
|
29
|
+
end
|
30
|
+
|
31
|
+
def exists?
|
32
|
+
@source_files.inject(true){ |res, f| res && f.exists? }
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def source_content
|
38
|
+
@source_content ||= @source_files.map{ |f| f.compiled }.join("\n")
|
39
|
+
end
|
40
|
+
|
41
|
+
def source_fingerprint
|
42
|
+
@source_fingerprint ||= Digest::MD5.new.hexdigest(source_content)
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_source_files(digest_path)
|
46
|
+
Dassets.config.combinations[digest_path.to_s].map do |source_digest_path|
|
47
|
+
Dassets::SourceFile.find_by_digest_path(source_digest_path)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class NoCache
|
52
|
+
def [](key); end
|
53
|
+
def []=(key, value); end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
data/lib/dassets/version.rb
CHANGED
data/lib/dassets.rb
CHANGED
@@ -3,10 +3,9 @@ require 'set'
|
|
3
3
|
require 'ns-options'
|
4
4
|
|
5
5
|
require 'dassets/version'
|
6
|
-
require 'dassets/root_path'
|
7
6
|
require 'dassets/file_store'
|
8
7
|
require 'dassets/default_cache'
|
9
|
-
require 'dassets/
|
8
|
+
require 'dassets/source'
|
10
9
|
require 'dassets/asset_file'
|
11
10
|
|
12
11
|
ENV['DASSETS_ASSETS_FILE'] ||= 'config/assets'
|
@@ -23,13 +22,16 @@ module Dassets
|
|
23
22
|
require self.config.assets_file
|
24
23
|
rescue LoadError
|
25
24
|
end
|
26
|
-
raise 'no Dassets `root_path` specified' if !self.config.required_set?
|
27
25
|
end
|
28
26
|
|
29
27
|
def self.[](digest_path)
|
30
28
|
AssetFile.new(digest_path)
|
31
29
|
end
|
32
30
|
|
31
|
+
def self.source_list
|
32
|
+
SourceList.new(self.config.sources)
|
33
|
+
end
|
34
|
+
|
33
35
|
# Cmds
|
34
36
|
|
35
37
|
def self.digest_source_files(paths=nil)
|
@@ -40,38 +42,31 @@ module Dassets
|
|
40
42
|
class Config
|
41
43
|
include NsOptions::Proxy
|
42
44
|
|
43
|
-
option :root_path, Pathname, :required => true
|
44
45
|
option :assets_file, Pathname, :default => ENV['DASSETS_ASSETS_FILE']
|
45
|
-
option :source_path, RootPath, :default => proc{ "app/assets" }
|
46
|
-
option :source_filter, Proc, :default => proc{ |paths| paths }
|
47
46
|
option :file_store, FileStore, :default => proc{ NullFileStore.new }
|
48
47
|
|
49
|
-
attr_reader :
|
48
|
+
attr_reader :sources, :combinations
|
50
49
|
attr_accessor :cache
|
51
50
|
|
52
51
|
def initialize
|
53
52
|
super
|
54
|
-
@
|
53
|
+
@sources = []
|
54
|
+
@combinations = Hash.new{ |h,k| [k] } # digest pass-thru if none defined
|
55
55
|
@cache = DefaultCache.new
|
56
56
|
end
|
57
57
|
|
58
|
-
def source(path
|
59
|
-
|
60
|
-
self.source_filter = filter if filter
|
58
|
+
def source(path, &block)
|
59
|
+
@sources << Source.new(path).tap{ |s| block.call(s) if block }
|
61
60
|
end
|
62
61
|
|
63
|
-
def
|
64
|
-
@
|
62
|
+
def combination(key_digest_path, value_digest_paths)
|
63
|
+
@combinations[key_digest_path.to_s] = [*value_digest_paths]
|
65
64
|
end
|
66
65
|
end
|
67
66
|
|
68
67
|
module SourceList
|
69
|
-
def self.new(
|
70
|
-
|
71
|
-
paths += Dir.glob(File.join(config.source_path, "**/*"))
|
72
|
-
paths.reject!{ |path| !File.file?(path) }
|
73
|
-
|
74
|
-
config.source_filter.call(paths).sort
|
68
|
+
def self.new(sources)
|
69
|
+
sources.inject([]){ |list, source| list += source.files }
|
75
70
|
end
|
76
71
|
end
|
77
72
|
|
data/test/helper.rb
CHANGED
@@ -7,6 +7,9 @@ $LOAD_PATH.unshift(File.expand_path("../..", __FILE__))
|
|
7
7
|
# require pry for debugging (`binding.pry`)
|
8
8
|
require 'pry'
|
9
9
|
|
10
|
+
require 'pathname'
|
11
|
+
TEST_SUPPORT_PATH = Pathname.new(File.expand_path('../support', __FILE__))
|
12
|
+
|
10
13
|
ENV['DASSETS_TEST_MODE'] = 'yes'
|
11
14
|
ENV['DASSETS_ASSETS_FILE'] = 'test/support/config/assets'
|
12
15
|
require 'dassets'
|
@@ -10,10 +10,11 @@ end
|
|
10
10
|
end
|
11
11
|
|
12
12
|
Dassets.configure do |c|
|
13
|
-
c.
|
13
|
+
c.source TEST_SUPPORT_PATH.join("app/assets") do |s|
|
14
|
+
s.engine 'dumb', @dumb_engine
|
15
|
+
s.engine 'useless', @useless_engine
|
16
|
+
end
|
14
17
|
|
15
|
-
c.engine 'dumb', @dumb_engine
|
16
|
-
c.engine 'useless', @useless_engine
|
17
18
|
c.cache = nil # use no cache
|
18
19
|
|
19
20
|
end
|
@@ -7,7 +7,7 @@ module Dassets
|
|
7
7
|
class DigestCmdRunTests < Assert::Context
|
8
8
|
desc "the DigestCmd"
|
9
9
|
setup do
|
10
|
-
Dassets.config.file_store = 'public'
|
10
|
+
Dassets.config.file_store = TEST_SUPPORT_PATH.join('public').to_s
|
11
11
|
clear_store_path(Dassets.config.file_store.root)
|
12
12
|
Dassets.digest_source_files
|
13
13
|
|
@@ -52,7 +52,7 @@ module Dassets
|
|
52
52
|
private
|
53
53
|
|
54
54
|
def source_path(file)
|
55
|
-
File.join(
|
55
|
+
File.join(Dassets.config.sources.first.path, file)
|
56
56
|
end
|
57
57
|
|
58
58
|
def store_path(file)
|
data/test/system/rack_tests.rb
CHANGED
@@ -40,7 +40,7 @@ module Dassets
|
|
40
40
|
|
41
41
|
class DigestTests < SuccessTests
|
42
42
|
setup do
|
43
|
-
Dassets.config.file_store = 'public'
|
43
|
+
Dassets.config.file_store = TEST_SUPPORT_PATH.join('public').to_s
|
44
44
|
@url = 'file1-daa05c683a4913b268653f7a7e36a5b4.txt'
|
45
45
|
@url_file = Dassets.config.file_store.store_path(@url)
|
46
46
|
FileUtils.rm(@url_file)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'assert'
|
2
2
|
require 'fileutils'
|
3
3
|
require 'dassets/file_store'
|
4
|
-
require 'dassets/
|
4
|
+
require 'dassets/source_proxy'
|
5
5
|
require 'dassets/asset_file'
|
6
6
|
|
7
7
|
class Dassets::AssetFile
|
@@ -13,7 +13,7 @@ class Dassets::AssetFile
|
|
13
13
|
end
|
14
14
|
subject{ @asset_file }
|
15
15
|
|
16
|
-
should have_readers :digest_path, :dirname, :extname, :basename, :
|
16
|
+
should have_readers :digest_path, :dirname, :extname, :basename, :source_proxy
|
17
17
|
should have_imeths :digest!, :url, :fingerprint, :content
|
18
18
|
should have_imeths :href, :mtime, :size, :mime_type, :exists?, :==
|
19
19
|
|
@@ -25,7 +25,7 @@ class Dassets::AssetFile
|
|
25
25
|
end
|
26
26
|
|
27
27
|
should "use its source file attrs as its own" do
|
28
|
-
assert_equal subject.
|
28
|
+
assert_equal subject.source_proxy.mtime.httpdate, subject.mtime
|
29
29
|
assert_equal Rack::Utils.bytesize(subject.content), subject.size
|
30
30
|
assert_equal "text/plain", subject.mime_type
|
31
31
|
assert subject.exists?
|
@@ -37,19 +37,19 @@ class Dassets::AssetFile
|
|
37
37
|
assert_not null_file.exists?
|
38
38
|
end
|
39
39
|
|
40
|
-
should "know its source
|
41
|
-
assert_not_nil subject.
|
42
|
-
assert_kind_of Dassets::
|
43
|
-
assert_equal subject.digest_path, subject.
|
40
|
+
should "know its source proxy" do
|
41
|
+
assert_not_nil subject.source_proxy
|
42
|
+
assert_kind_of Dassets::SourceProxy, subject.source_proxy
|
43
|
+
assert_equal subject.digest_path, subject.source_proxy.digest_path
|
44
44
|
end
|
45
45
|
|
46
46
|
should "have a fingerprint" do
|
47
47
|
assert_not_nil subject.fingerprint
|
48
48
|
end
|
49
49
|
|
50
|
-
should "get its fingerprint from its source
|
50
|
+
should "get its fingerprint from its source proxy if none is given" do
|
51
51
|
af = Dassets::AssetFile.new('file1.txt')
|
52
|
-
assert_equal af.
|
52
|
+
assert_equal af.source_proxy.fingerprint, af.fingerprint
|
53
53
|
end
|
54
54
|
|
55
55
|
should "know it's content" do
|
@@ -59,7 +59,7 @@ class Dassets::AssetFile
|
|
59
59
|
assert_nil null_file.content
|
60
60
|
end
|
61
61
|
|
62
|
-
should "get its content from its source
|
62
|
+
should "get its content from its source proxy if no output file" do
|
63
63
|
digest_path = 'nested/a-thing.txt.no-use'
|
64
64
|
exp_content = "thing\n\nDUMB\nUSELESS"
|
65
65
|
|
@@ -86,7 +86,7 @@ class Dassets::AssetFile
|
|
86
86
|
class DigestTests < BaseTests
|
87
87
|
desc "being digested with an output path configured"
|
88
88
|
setup do
|
89
|
-
Dassets.config.file_store = 'public'
|
89
|
+
Dassets.config.file_store = TEST_SUPPORT_PATH.join('public').to_s
|
90
90
|
@save_path = @asset_file.digest!
|
91
91
|
@outfile = Dassets.config.file_store.store_path(@asset_file.url)
|
92
92
|
end
|
data/test/unit/config_tests.rb
CHANGED
@@ -12,46 +12,37 @@ class Dassets::Config
|
|
12
12
|
end
|
13
13
|
subject{ @config }
|
14
14
|
|
15
|
-
should have_option :
|
16
|
-
should
|
17
|
-
should have_options :source_path, :source_filter, :file_store
|
15
|
+
should have_option :assets_file, Pathname, :default => ENV['DASSETS_ASSETS_FILE']
|
16
|
+
should have_options :file_store
|
18
17
|
|
19
|
-
should have_reader :
|
20
|
-
should have_imeth :source, :
|
18
|
+
should have_reader :combinations
|
19
|
+
should have_imeth :source, :combination
|
21
20
|
|
22
|
-
should "
|
23
|
-
|
24
|
-
assert_equal exp_path, subject.source_path
|
25
|
-
end
|
26
|
-
|
27
|
-
should "set the source path and filter proc with the `sources` method" do
|
28
|
-
path = Dassets::RootPath.new 'app/asset_files'
|
21
|
+
should "register new sources with the `source` method" do
|
22
|
+
path = '/path/to/app/assets'
|
29
23
|
filter = proc{ |paths| [] }
|
24
|
+
subject.source(path){ |s| s.filter(&filter) }
|
30
25
|
|
31
|
-
subject.
|
32
|
-
|
33
|
-
assert_equal
|
26
|
+
assert_equal 1, subject.sources.size
|
27
|
+
assert_kind_of Dassets::Source, subject.sources.first
|
28
|
+
assert_equal path, subject.sources.first.path
|
29
|
+
assert_equal filter, subject.sources.first.filter
|
34
30
|
end
|
35
31
|
|
36
|
-
should "know its
|
37
|
-
assert_kind_of ::Hash, subject.
|
38
|
-
|
39
|
-
assert_kind_of Dassets::NullEngine, subject.engines['thing']
|
32
|
+
should "know its combinations and return the keyed digest path by default" do
|
33
|
+
assert_kind_of ::Hash, subject.combinations
|
34
|
+
assert_equal ['some/digest.path'], subject.combinations['some/digest.path']
|
40
35
|
end
|
41
36
|
|
42
|
-
should "allow registering new
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
assert_kind_of Dassets::NullEngine, subject.engines['empty']
|
49
|
-
subject.engine 'empty', empty_engine, 'an' => 'opt'
|
50
|
-
assert_kind_of empty_engine, subject.engines['empty']
|
37
|
+
should "allow registering new combinations" do
|
38
|
+
assert_equal ['some/digest.path'], subject.combinations['some/digest.path']
|
39
|
+
exp_combination = ['some/other.path', 'and/another.path']
|
40
|
+
subject.combination 'some/digest.path', exp_combination
|
41
|
+
assert_equal exp_combination, subject.combinations['some/digest.path']
|
51
42
|
|
52
|
-
assert_equal
|
53
|
-
|
54
|
-
assert_equal '', subject.
|
43
|
+
assert_equal ['test/digest.path'], subject.combinations['test/digest.path']
|
44
|
+
subject.combination 'test/digest.path', ['some/other.path']
|
45
|
+
assert_equal ['some/other.path'], subject.combinations['test/digest.path']
|
55
46
|
end
|
56
47
|
|
57
48
|
end
|
data/test/unit/dassets_tests.rb
CHANGED
@@ -9,7 +9,7 @@ module Dassets
|
|
9
9
|
subject{ Dassets }
|
10
10
|
|
11
11
|
should have_imeths :config, :configure, :init, :[]
|
12
|
-
should have_imeths :digest_source_files
|
12
|
+
should have_imeths :source_list, :digest_source_files
|
13
13
|
|
14
14
|
should "return a `Config` instance with the `config` method" do
|
15
15
|
assert_kind_of Config, subject.config
|
@@ -23,54 +23,14 @@ module Dassets
|
|
23
23
|
assert_equal 'd41d8cd98f00b204e9800998ecf8427e', file.fingerprint
|
24
24
|
end
|
25
25
|
|
26
|
-
should "return an asset file
|
26
|
+
should "return an asset file that doesn't exist if digest path not found" do
|
27
27
|
file = subject['path/not/found.txt']
|
28
|
-
|
29
|
-
assert_kind_of Dassets::SourceCache, file.source_cache
|
30
|
-
assert_kind_of Dassets::NullSourceFile, file.source_cache.source_file
|
31
|
-
assert_not file.source_cache.exists?
|
28
|
+
assert_not file.exists?
|
32
29
|
end
|
33
30
|
|
34
|
-
should "
|
35
|
-
|
36
|
-
|
37
|
-
Dassets.config.root_path = nil
|
38
|
-
assert_raises(RuntimeError){ Dassets.init }
|
39
|
-
|
40
|
-
Dassets.config.root_path = orig_root
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
class SourceListTests < BaseTests
|
46
|
-
desc "source list"
|
47
|
-
|
48
|
-
should "build from the configured source path and filter proc" do
|
49
|
-
config = Dassets::Config.new
|
50
|
-
config.source_path = "source_files" # test/support/source_files
|
51
|
-
exp_list = [
|
52
|
-
'test1.txt', '_ignored.txt', 'nested/test2.txt', 'nested/_nested_ignored.txt'
|
53
|
-
].map{ |p| File.expand_path(p, config.source_path) }.sort
|
54
|
-
|
55
|
-
assert_equal exp_list, Dassets::SourceList.new(config)
|
56
|
-
end
|
57
|
-
|
58
|
-
should "run the supplied source filter on the paths" do
|
59
|
-
config = Dassets::Config.new
|
60
|
-
config.source_path = "source_files" # test/support/source_files
|
61
|
-
config.source_filter = proc do |paths|
|
62
|
-
paths.reject{ |path| File.basename(path) =~ /^_/ }
|
63
|
-
end
|
64
|
-
exp_list = [
|
65
|
-
'test1.txt', 'nested/test2.txt'
|
66
|
-
].map{ |p| File.expand_path(p, config.source_path) }.sort
|
67
|
-
|
68
|
-
assert_equal exp_list, Dassets::SourceList.new(config)
|
69
|
-
|
70
|
-
config.source "source_files" do |paths|
|
71
|
-
paths.reject{ |path| File.basename(path) =~ /^_/ }
|
72
|
-
end
|
73
|
-
assert_equal exp_list, Dassets::SourceList.new(config)
|
31
|
+
should "know its list of configured source files" do
|
32
|
+
exp_configured_list = Dassets::SourceList.new(Dassets.config.sources)
|
33
|
+
assert_equal exp_configured_list, subject.source_list
|
74
34
|
end
|
75
35
|
|
76
36
|
end
|
@@ -1,10 +1,9 @@
|
|
1
1
|
require 'assert'
|
2
|
-
require 'dassets/root_path'
|
3
2
|
require 'dassets/file_store'
|
4
3
|
|
5
4
|
class Dassets::FileStore
|
6
5
|
|
7
|
-
class
|
6
|
+
class NullTests < Assert::Context
|
8
7
|
desc "Dassets::NullFileStore"
|
9
8
|
subject{ Dassets::NullFileStore.new }
|
10
9
|
|
@@ -15,14 +14,16 @@ class Dassets::FileStore
|
|
15
14
|
assert_kind_of Dassets::FileStore, subject
|
16
15
|
end
|
17
16
|
|
18
|
-
should "
|
19
|
-
assert_equal
|
17
|
+
should "know its root path" do
|
18
|
+
assert_equal '', subject.root
|
20
19
|
end
|
21
20
|
|
22
21
|
should "build the store path based on a given url" do
|
22
|
+
assert_equal '/some/url', subject.store_path('some/url')
|
23
23
|
end
|
24
24
|
|
25
25
|
should "return the store path on save" do
|
26
|
+
assert_equal '/some/url', subject.save('some/url')
|
26
27
|
end
|
27
28
|
|
28
29
|
end
|
@@ -7,18 +7,18 @@ class Dassets::SourceFile
|
|
7
7
|
class BaseTests < Assert::Context
|
8
8
|
desc "Dassets::SourceFile"
|
9
9
|
setup do
|
10
|
-
@file_path =
|
10
|
+
@file_path = TEST_SUPPORT_PATH.join('app/assets/file1.txt').to_s
|
11
11
|
@source_file = Dassets::SourceFile.new(@file_path)
|
12
12
|
end
|
13
13
|
subject{ @source_file }
|
14
14
|
|
15
15
|
should have_readers :file_path
|
16
|
-
should have_imeths :asset_file, :digest_path
|
17
|
-
should have_imeths :compiled, :
|
16
|
+
should have_imeths :source, :asset_file, :digest_path
|
17
|
+
should have_imeths :compiled, :exists?, :mtime
|
18
18
|
should have_cmeth :find_by_digest_path
|
19
19
|
|
20
20
|
should "know its file path" do
|
21
|
-
assert_equal @file_path, subject.file_path
|
21
|
+
assert_equal @file_path.to_s, subject.file_path
|
22
22
|
end
|
23
23
|
|
24
24
|
should "know if it exists" do
|
@@ -26,7 +26,7 @@ class Dassets::SourceFile
|
|
26
26
|
end
|
27
27
|
|
28
28
|
should "use the mtime of its file as its mtime" do
|
29
|
-
assert_equal File.mtime(subject.file_path)
|
29
|
+
assert_equal File.mtime(subject.file_path), subject.mtime
|
30
30
|
end
|
31
31
|
|
32
32
|
should "know its digest path" do
|
@@ -38,8 +38,9 @@ class Dassets::SourceFile
|
|
38
38
|
assert_equal Dassets::AssetFile.new(subject.digest_path), subject.asset_file
|
39
39
|
end
|
40
40
|
|
41
|
-
should "know its
|
42
|
-
|
41
|
+
should "know its configured source" do
|
42
|
+
exp_source = Dassets.config.sources.select{ |s| @file_path.include?(s.path) }.last
|
43
|
+
assert_equal exp_source, subject.source
|
43
44
|
end
|
44
45
|
|
45
46
|
should "be findable by its digest path" do
|
@@ -62,7 +63,7 @@ class Dassets::SourceFile
|
|
62
63
|
class EngineTests < BaseTests
|
63
64
|
desc "compiled against engines"
|
64
65
|
setup do
|
65
|
-
@file_path =
|
66
|
+
@file_path = TEST_SUPPORT_PATH.join('app/assets/nested/a-thing.txt.useless.dumb')
|
66
67
|
@source_file = Dassets::SourceFile.new(@file_path)
|
67
68
|
end
|
68
69
|
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'digest/md5'
|
3
|
+
require 'dassets/source_file'
|
4
|
+
require 'dassets/source_proxy'
|
5
|
+
|
6
|
+
class Dassets::SourceProxy
|
7
|
+
|
8
|
+
class BaseTests < Assert::Context
|
9
|
+
desc "Dassets::SourceProxy"
|
10
|
+
setup do
|
11
|
+
@source_proxy = Dassets::SourceProxy.new('file1.txt')
|
12
|
+
end
|
13
|
+
subject{ @source_proxy }
|
14
|
+
|
15
|
+
should have_readers :digest_path, :source_files
|
16
|
+
should have_imeths :content, :fingerprint, :key, :mtime, :exists?
|
17
|
+
|
18
|
+
should "know its digest path" do
|
19
|
+
assert_equal 'file1.txt', subject.digest_path
|
20
|
+
end
|
21
|
+
|
22
|
+
should "know its source file" do
|
23
|
+
exp_source_file = Dassets::SourceFile.find_by_digest_path('file1.txt')
|
24
|
+
assert_equal 1, subject.source_files.size
|
25
|
+
assert_equal exp_source_file, subject.source_files.first
|
26
|
+
end
|
27
|
+
|
28
|
+
should "exist if its source file exists" do
|
29
|
+
assert_equal subject.source_files.first.exists?, subject.exists?
|
30
|
+
end
|
31
|
+
|
32
|
+
should "use its source file's mtime as its mtime" do
|
33
|
+
assert_equal subject.source_files.first.mtime, subject.mtime
|
34
|
+
end
|
35
|
+
|
36
|
+
should "use its digest path and mtime as its key" do
|
37
|
+
exp_key = "#{subject.digest_path} -- #{subject.mtime}"
|
38
|
+
assert_equal exp_key, subject.key
|
39
|
+
end
|
40
|
+
|
41
|
+
should "get its fingerprint by MD5 hashing the compiled source" do
|
42
|
+
exp_fp = Digest::MD5.new.hexdigest(subject.content)
|
43
|
+
assert_equal exp_fp, subject.fingerprint
|
44
|
+
end
|
45
|
+
|
46
|
+
should "get its content from the compiled source" do
|
47
|
+
assert_equal subject.source_files.first.compiled, subject.content
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
class CombinationTests < BaseTests
|
53
|
+
desc "when the digest path is a combination to multiple source files"
|
54
|
+
setup do
|
55
|
+
Dassets.config.combination 'file3.txt', ['file1.txt', 'file2.txt']
|
56
|
+
@source_proxy = Dassets::SourceProxy.new('file3.txt')
|
57
|
+
@exp_source_files = [
|
58
|
+
Dassets::SourceFile.find_by_digest_path('file1.txt'),
|
59
|
+
Dassets::SourceFile.find_by_digest_path('file2.txt')
|
60
|
+
]
|
61
|
+
end
|
62
|
+
teardown do
|
63
|
+
Dassets.config.combinations.delete('file3.txt')
|
64
|
+
end
|
65
|
+
|
66
|
+
should "know its digest path" do
|
67
|
+
assert_equal 'file3.txt', subject.digest_path
|
68
|
+
end
|
69
|
+
|
70
|
+
should "know its source file" do
|
71
|
+
assert_equal 2, subject.source_files.size
|
72
|
+
assert_equal @exp_source_files, subject.source_files
|
73
|
+
end
|
74
|
+
|
75
|
+
should "exist if its source file exists" do
|
76
|
+
exp_exists = @exp_source_files.inject(true){ |res, f| res && f.exists? }
|
77
|
+
assert_equal exp_exists, subject.exists?
|
78
|
+
end
|
79
|
+
|
80
|
+
should "use its source file's mtime as its mtime" do
|
81
|
+
exp_mtime = @exp_source_files.map{ |f| f.mtime }.max
|
82
|
+
assert_equal exp_mtime, subject.mtime
|
83
|
+
end
|
84
|
+
|
85
|
+
should "get its content from the compiled source" do
|
86
|
+
exp_content = @exp_source_files.map{ |f| f.compiled }.join("\n")
|
87
|
+
assert_equal exp_content, subject.content
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'dassets/source'
|
3
|
+
|
4
|
+
class Dassets::Source
|
5
|
+
|
6
|
+
class BaseTests < Assert::Context
|
7
|
+
desc "Dassets::Source"
|
8
|
+
setup do
|
9
|
+
@source_path = TEST_SUPPORT_PATH.join("source_files")
|
10
|
+
@source = Dassets::Source.new(@source_path)
|
11
|
+
end
|
12
|
+
subject{ @source }
|
13
|
+
|
14
|
+
should have_reader :path, :engines
|
15
|
+
should have_imeth :files, :filter, :engine
|
16
|
+
|
17
|
+
should "know its path and default filter" do
|
18
|
+
assert_equal @source_path.to_s, subject.path
|
19
|
+
assert_kind_of Proc, subject.filter
|
20
|
+
assert_equal ['file1', 'file2'], subject.filter.call(['file1', 'file2'])
|
21
|
+
end
|
22
|
+
|
23
|
+
should "know its files" do
|
24
|
+
exp_files = [
|
25
|
+
@source_path.join('test1.txt').to_s,
|
26
|
+
@source_path.join('_ignored.txt').to_s,
|
27
|
+
@source_path.join('nested/test2.txt').to_s,
|
28
|
+
@source_path.join('nested/_nested_ignored.txt').to_s
|
29
|
+
].sort
|
30
|
+
assert_equal exp_files, subject.files
|
31
|
+
end
|
32
|
+
|
33
|
+
should "run the supplied source filter on the paths" do
|
34
|
+
subject.filter do |paths|
|
35
|
+
paths.reject{ |path| File.basename(path) =~ /^_/ }
|
36
|
+
end
|
37
|
+
exp_files = [
|
38
|
+
@source_path.join('test1.txt').to_s,
|
39
|
+
@source_path.join('nested/test2.txt').to_s,
|
40
|
+
].sort
|
41
|
+
|
42
|
+
assert_equal exp_files, subject.files
|
43
|
+
end
|
44
|
+
|
45
|
+
should "know its engines and return a NullEngine by default" do
|
46
|
+
assert_kind_of ::Hash, subject.engines
|
47
|
+
assert_kind_of Dassets::NullEngine, subject.engines['something']
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
class EngineRegistrationTests < BaseTests
|
53
|
+
desc "when registering an engine"
|
54
|
+
setup do
|
55
|
+
@empty_engine = Class.new(Dassets::Engine) do
|
56
|
+
def ext(input_ext); ''; end
|
57
|
+
def compile(input); ''; end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
should "allow registering new engines" do
|
62
|
+
assert_kind_of Dassets::NullEngine, subject.engines['empty']
|
63
|
+
subject.engine 'empty', @empty_engine, 'an' => 'opt'
|
64
|
+
assert_kind_of @empty_engine, subject.engines['empty']
|
65
|
+
assert_equal 'opt', subject.engines['empty'].opts['an']
|
66
|
+
assert_equal '', subject.engines['empty'].ext('empty')
|
67
|
+
assert_equal '', subject.engines['empty'].compile('some content')
|
68
|
+
end
|
69
|
+
|
70
|
+
should "register with the source path as a default option" do
|
71
|
+
subject.engine 'empty', @empty_engine
|
72
|
+
exp_opts = { 'source_path' => subject.path }
|
73
|
+
assert_equal exp_opts, subject.engines['empty'].opts
|
74
|
+
|
75
|
+
subject.engine 'empty', @empty_engine, 'an' => 'opt'
|
76
|
+
exp_opts = {
|
77
|
+
'source_path' => subject.path,
|
78
|
+
'an' => 'opt'
|
79
|
+
}
|
80
|
+
assert_equal exp_opts, subject.engines['empty'].opts
|
81
|
+
|
82
|
+
subject.engine 'empty', @empty_engine, 'source_path' => 'something'
|
83
|
+
exp_opts = { 'source_path' => 'something' }
|
84
|
+
assert_equal exp_opts, subject.engines['empty'].opts
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dassets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 6
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.6.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kelly Redding
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2013-05-
|
19
|
+
date: 2013-05-09 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: assert
|
@@ -118,13 +118,13 @@ files:
|
|
118
118
|
- lib/dassets/digest_cmd.rb
|
119
119
|
- lib/dassets/engine.rb
|
120
120
|
- lib/dassets/file_store.rb
|
121
|
-
- lib/dassets/root_path.rb
|
122
121
|
- lib/dassets/runner.rb
|
123
122
|
- lib/dassets/server.rb
|
124
123
|
- lib/dassets/server/request.rb
|
125
124
|
- lib/dassets/server/response.rb
|
126
|
-
- lib/dassets/
|
125
|
+
- lib/dassets/source.rb
|
127
126
|
- lib/dassets/source_file.rb
|
127
|
+
- lib/dassets/source_proxy.rb
|
128
128
|
- lib/dassets/version.rb
|
129
129
|
- log/.gitkeep
|
130
130
|
- test/helper.rb
|
@@ -157,8 +157,9 @@ files:
|
|
157
157
|
- test/unit/server/request_tests.rb
|
158
158
|
- test/unit/server/response_tests.rb
|
159
159
|
- test/unit/server_tests.rb
|
160
|
-
- test/unit/source_cache_tests.rb
|
161
160
|
- test/unit/source_file_tests.rb
|
161
|
+
- test/unit/source_proxy_tests.rb
|
162
|
+
- test/unit/source_tests.rb
|
162
163
|
- tmp/.gitkeep
|
163
164
|
homepage: http://github.com/redding/dassets
|
164
165
|
licenses: []
|
@@ -224,5 +225,6 @@ test_files:
|
|
224
225
|
- test/unit/server/request_tests.rb
|
225
226
|
- test/unit/server/response_tests.rb
|
226
227
|
- test/unit/server_tests.rb
|
227
|
-
- test/unit/source_cache_tests.rb
|
228
228
|
- test/unit/source_file_tests.rb
|
229
|
+
- test/unit/source_proxy_tests.rb
|
230
|
+
- test/unit/source_tests.rb
|
data/lib/dassets/root_path.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
# This takes a path string relative to the configured root path and tranforms
|
2
|
-
# to the full qualifed root path. The goal here is to specify path options
|
3
|
-
# with root-relative path strings.
|
4
|
-
|
5
|
-
module Dassets; end
|
6
|
-
class Dassets::RootPath < String
|
7
|
-
|
8
|
-
def initialize(path_string)
|
9
|
-
super(Dassets.config.root_path.join(path_string).to_s)
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
data/lib/dassets/source_cache.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'dassets/source_file'
|
2
|
-
|
3
|
-
module Dassets; end
|
4
|
-
class Dassets::SourceCache
|
5
|
-
|
6
|
-
attr_reader :digest_path, :source_file, :cache
|
7
|
-
|
8
|
-
def initialize(digest_path, cache=nil)
|
9
|
-
@digest_path = digest_path
|
10
|
-
@source_file = Dassets::SourceFile.find_by_digest_path(digest_path)
|
11
|
-
@cache = cache || NoCache.new
|
12
|
-
end
|
13
|
-
|
14
|
-
def content
|
15
|
-
@cache["#{self.key} -- content"] ||= @source_file.compiled
|
16
|
-
end
|
17
|
-
|
18
|
-
def fingerprint
|
19
|
-
@cache["#{self.key} -- fingerprint"] ||= @source_file.fingerprint
|
20
|
-
end
|
21
|
-
|
22
|
-
def key
|
23
|
-
"#{self.digest_path} -- #{self.mtime}"
|
24
|
-
end
|
25
|
-
|
26
|
-
def mtime
|
27
|
-
@source_file.mtime
|
28
|
-
end
|
29
|
-
|
30
|
-
def exists?
|
31
|
-
@source_file.exists?
|
32
|
-
end
|
33
|
-
|
34
|
-
class NoCache
|
35
|
-
def [](key); end
|
36
|
-
def []=(key, value); end
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'assert'
|
2
|
-
require 'dassets/source_file'
|
3
|
-
require 'dassets/source_cache'
|
4
|
-
|
5
|
-
class Dassets::SourceCache
|
6
|
-
|
7
|
-
class BaseTests < Assert::Context
|
8
|
-
desc "Dassets::SourceCache"
|
9
|
-
setup do
|
10
|
-
@source_cache = Dassets::SourceCache.new('file1.txt')
|
11
|
-
end
|
12
|
-
subject{ @source_cache }
|
13
|
-
|
14
|
-
should have_readers :digest_path, :source_file
|
15
|
-
should have_imeths :content, :fingerprint, :key, :mtime, :exists?
|
16
|
-
|
17
|
-
should "know its digest path" do
|
18
|
-
assert_equal 'file1.txt', subject.digest_path
|
19
|
-
end
|
20
|
-
|
21
|
-
should "know its source file" do
|
22
|
-
exp_source_file = Dassets::SourceFile.find_by_digest_path('file1.txt')
|
23
|
-
assert_equal exp_source_file, subject.source_file
|
24
|
-
end
|
25
|
-
|
26
|
-
should "exist if its source file exists" do
|
27
|
-
assert_equal subject.source_file.exists?, subject.exists?
|
28
|
-
end
|
29
|
-
|
30
|
-
should "use its source file's mtime as its mtime" do
|
31
|
-
assert_equal subject.source_file.mtime, subject.mtime
|
32
|
-
end
|
33
|
-
|
34
|
-
should "use its digest path and mtime as its key" do
|
35
|
-
exp_key = "#{subject.digest_path} -- #{subject.mtime}"
|
36
|
-
assert_equal exp_key, subject.key
|
37
|
-
end
|
38
|
-
|
39
|
-
should "get its fingerprint from the source file" do
|
40
|
-
assert_equal subject.source_file.fingerprint, subject.fingerprint
|
41
|
-
end
|
42
|
-
|
43
|
-
should "get its content from the source file" do
|
44
|
-
assert_equal subject.source_file.compiled, subject.content
|
45
|
-
end
|
46
|
-
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|