active_assets 0.1.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/.autotest +55 -0
- data/.gitignore +9 -0
- data/Gemfile +4 -0
- data/Rakefile +12 -0
- data/active_assets.gemspec +22 -0
- data/lib/active_assets/active_expansions/asset.rb +63 -0
- data/lib/active_assets/active_expansions/asset_scope.rb +29 -0
- data/lib/active_assets/active_expansions/assets.rb +97 -0
- data/lib/active_assets/active_expansions/configurable.rb +14 -0
- data/lib/active_assets/active_expansions/expansion.rb +65 -0
- data/lib/active_assets/active_expansions/expansions.rb +103 -0
- data/lib/active_assets/active_expansions/javascripts.rb +9 -0
- data/lib/active_assets/active_expansions/railtie.rb +52 -0
- data/lib/active_assets/active_expansions/stylesheets.rb +9 -0
- data/lib/active_assets/active_expansions/type_inferrable.rb +12 -0
- data/lib/active_assets/active_expansions.rb +17 -0
- data/lib/active_assets.rb +7 -0
- data/lib/rails/active_assets.rb +11 -0
- data/lib/tasks/cache.rake +6 -0
- data/test/active_assets/active_expansions/asset_test.rb +40 -0
- data/test/active_assets/active_expansions/expansions_test.rb +148 -0
- data/test/autocolor.rb +3 -0
- data/test/fixtures/rails_root/config/application.rb +10 -0
- data/test/fixtures/rails_root/config/assets/assets.rb +71 -0
- data/test/fixtures/rails_root/public/javascripts/bar/bas.js +1 -0
- data/test/fixtures/rails_root/public/javascripts/bas/bar.js +1 -0
- data/test/fixtures/rails_root/public/stylesheets/bar/bas.css +1 -0
- data/test/fixtures/rails_root/public/stylesheets/bas/bar.css +1 -0
- data/test/helper.rb +15 -0
- data/test/support/rails_helper.rb +32 -0
- metadata +151 -0
data/.autotest
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'autotest/restart'
|
2
|
+
require 'autotest/bundler'
|
3
|
+
|
4
|
+
Autotest.add_hook :initialize do |at|
|
5
|
+
at.testlib = 'test/unit test/autocolor'
|
6
|
+
|
7
|
+
# Remove the old test unit mappings
|
8
|
+
at.clear_mappings
|
9
|
+
|
10
|
+
# Don't track other dirs, this just burns cpu.
|
11
|
+
(File.read('.gitignore').split("\n") + Dir['test/fixtures/**/*']).each do |ignore|
|
12
|
+
next if ignore.nil? or ignore.empty?
|
13
|
+
at.add_exception ignore
|
14
|
+
end
|
15
|
+
|
16
|
+
# Test::Unit is normally test_, so autotest doesn't have this mapping. Tests
|
17
|
+
# want to match themselves, that is, if there's no changes, run them all.
|
18
|
+
at.add_mapping(%r%^test/.*_test\.rb$%) { |f, _| f }
|
19
|
+
|
20
|
+
# Allow for matches of lib files to test files in a flat way
|
21
|
+
at.add_mapping(%r%^lib/(.*)\.rb$%) do |f, md|
|
22
|
+
at.files_matching( %r%^test/#{md[1]}_test\.rb$%)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Make sure that we run all tests if the helper changes:
|
26
|
+
at.add_mapping(%r%^test/helper\.rb$%) do |f, _|
|
27
|
+
at.files_matching %r%.*_test\.rb%
|
28
|
+
end
|
29
|
+
|
30
|
+
# If bundle did something, run all tests again
|
31
|
+
at.add_mapping(%r%^Gemfile\.lock$%) do |f, _|
|
32
|
+
at.files_matching %r%.*_test\.rb%
|
33
|
+
end
|
34
|
+
|
35
|
+
# If update support, run all tests
|
36
|
+
at.add_mapping(%r%^test/support/.*\.rb$%) do |f, _|
|
37
|
+
at.files_matching %r%.*_test\.rb%
|
38
|
+
end
|
39
|
+
|
40
|
+
def at.path_to_classname(path)
|
41
|
+
file = File.basename(path, '.rb')
|
42
|
+
|
43
|
+
file.gsub!('test_', '')
|
44
|
+
file.gsub!('_test', '')
|
45
|
+
file.capitalize + 'Test'
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
# If the Gemfile gets updated, run bundle install
|
51
|
+
Autotest.add_hook :updated do |at, *args|
|
52
|
+
if args.flatten.grep(%r%^Gemfile$|^.*\.gemspec$%).any?
|
53
|
+
system 'bundle'
|
54
|
+
end
|
55
|
+
end
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
Gem::Specification.new do |s|
|
3
|
+
s.name = "active_assets"
|
4
|
+
s.version = '0.1.0'
|
5
|
+
s.platform = Gem::Platform::RUBY
|
6
|
+
s.authors = ["Sam Woodard"]
|
7
|
+
s.email = ["sam@wildfireapp.com"]
|
8
|
+
s.homepage = ""
|
9
|
+
s.summary = %q{A Railtie that provides a full asset management system, including support for development and deployment.}
|
10
|
+
s.description = %q{A Railtie that provides a full asset management system, including support for development and deployment. Currently it is designed to manage javascripts and stylesheets but will handle image sprites in the future.}
|
11
|
+
|
12
|
+
s.rubyforge_project = "rails-assets"
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
s.add_development_dependency "rails", "3.0.3"
|
20
|
+
s.add_development_dependency "test-unit", "> 2.0"
|
21
|
+
s.add_development_dependency "ZenTest"
|
22
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module ActiveAssets
|
2
|
+
module ActiveExpansions
|
3
|
+
class Asset < Struct.new(:path, :type, :expansion_name, :group, :cache)
|
4
|
+
|
5
|
+
REQUIRED_PROPS = [:path, :type, :expansion_name]
|
6
|
+
VALID_TYPES = [:js, :css]
|
7
|
+
|
8
|
+
class InvalidContext < StandardError
|
9
|
+
def initialize(msg = nil)
|
10
|
+
msg ||= "You do not have a valid context to create this asset. Some properties are missing. They are: #{REQUIRED_PROPS.join(', ')}."
|
11
|
+
super(msg)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class AmbiguousContext < InvalidContext
|
16
|
+
def initilaize(missing_field)
|
17
|
+
super("You do not have a valid context to create this asset. Some properties are missing. Our guess is your didn't specify a #{missing_field}")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class ValidationError < InvalidContext
|
22
|
+
attr_reader :asset, :missing_fields
|
23
|
+
def initialize(asset, missing_fields)
|
24
|
+
@asset, @missing_fields = asset, missing_fields
|
25
|
+
super("#{asset} is not valid. The following fields are missing, #{missing_fields.join(', ')}.")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class InvalidAssetType < StandardError
|
30
|
+
attr_reader :invalid_type
|
31
|
+
def initilaize(invalid_type)
|
32
|
+
@invalid_type = invalid_type
|
33
|
+
super("#{invalid_type} is not a recognized asset type.")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def initialize(*)
|
38
|
+
super
|
39
|
+
self.group ||= :all
|
40
|
+
self.cache = self.cache == false ? false : true
|
41
|
+
end
|
42
|
+
|
43
|
+
def validation_error
|
44
|
+
missing_fields = REQUIRED_PROPS.reject { |meth| send(meth) }
|
45
|
+
if missing_fields.any?
|
46
|
+
ValidationError.new(self, missing_fields)
|
47
|
+
elsif !VALID_TYPES.include?(type)
|
48
|
+
InvalidAssetType.new(type)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def valid?
|
53
|
+
!validation_error
|
54
|
+
end
|
55
|
+
|
56
|
+
def valid!
|
57
|
+
e = validation_error
|
58
|
+
raise e if e
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ActiveAssets
|
2
|
+
module ActiveExpansions
|
3
|
+
module AssetScope
|
4
|
+
def group(*groups, &blk)
|
5
|
+
@current_groups = groups
|
6
|
+
instance_eval(&blk)
|
7
|
+
ensure
|
8
|
+
@current_groups = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def js(&blk)
|
12
|
+
current_type :js, &blk
|
13
|
+
end
|
14
|
+
|
15
|
+
def css(&blk)
|
16
|
+
current_type :css, &blk
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def current_type(type, &blk)
|
21
|
+
@current_type = type
|
22
|
+
instance_eval(&blk)
|
23
|
+
ensure
|
24
|
+
@current_type = nil
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module ActiveAssets
|
4
|
+
module ActiveExpansions
|
5
|
+
class Assets
|
6
|
+
attr_reader :expansions
|
7
|
+
|
8
|
+
def initialize(expansions)
|
9
|
+
@expansions = expansions
|
10
|
+
end
|
11
|
+
|
12
|
+
def has_expansion?(name)
|
13
|
+
@expansions.has_key?(name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def expansion_names
|
17
|
+
@expansion.keys
|
18
|
+
end
|
19
|
+
|
20
|
+
def [](expansion_name)
|
21
|
+
@expansions[expansion_name]
|
22
|
+
end
|
23
|
+
|
24
|
+
def all(&blk)
|
25
|
+
@expansions.values.each(&blk) if block_given?
|
26
|
+
@expansions.values
|
27
|
+
end
|
28
|
+
|
29
|
+
def paths(expansion_name)
|
30
|
+
self[expansion_name].assets.map(&:path)
|
31
|
+
end
|
32
|
+
|
33
|
+
def asset_type
|
34
|
+
raise NoMethodError
|
35
|
+
end
|
36
|
+
|
37
|
+
def register!
|
38
|
+
all do |expansion|
|
39
|
+
paths = if ActionController::Base.perform_caching
|
40
|
+
group_assets = expansion.assets.select do |a|
|
41
|
+
Array(a.group).include?(:deploy) ||
|
42
|
+
Array(a.group).any? {|e| e.to_s != 'all' && Rails.env.send(:"#{e}?") }
|
43
|
+
end
|
44
|
+
|
45
|
+
group_assets.map(&:path) + [File.join("cache#{"/#{expansion.namespace}" if expansion.namespace}", expansion.name.to_s)]
|
46
|
+
else
|
47
|
+
expansion.assets.select {|a| a.group == :all || Array(a.group).any? {|e| Rails.env.send(:"#{e}?") } }.map(&:path)
|
48
|
+
end
|
49
|
+
|
50
|
+
cleanse_paths!(paths)
|
51
|
+
|
52
|
+
ActionView::Helpers::AssetTagHelper.send(:"register_#{asset_type}_expansion", expansion.name => paths)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def cache!
|
57
|
+
all do |expansion|
|
58
|
+
file_path = "#{"#{expansion.namespace}/" if expansion.namespace}#{expansion.name}.#{asset_type_short}"
|
59
|
+
file_path = Rails.root.join('public', asset_type.pluralize, 'cache', file_path)
|
60
|
+
|
61
|
+
paths = expansion.assets.select {|a|
|
62
|
+
a.cache &&
|
63
|
+
(Array(a.group).include?(:all) ||
|
64
|
+
Array(a.group).include?(:deploy) ||
|
65
|
+
Array(a.group).any? {|e| Rails.env.send(:"#{e}?") })
|
66
|
+
}.map(&:path)
|
67
|
+
|
68
|
+
cleanse_paths!(paths)
|
69
|
+
|
70
|
+
FileUtils.mkdir_p(File.dirname(file_path))
|
71
|
+
|
72
|
+
File.open(file_path, 'w+') do |f|
|
73
|
+
paths.each do |path|
|
74
|
+
in_file = Rails.root.join('public', asset_type.pluralize, "#{path}.#{asset_type_short}")
|
75
|
+
f.puts File.read(in_file)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
def asset_type_short
|
83
|
+
asset_type == 'javascript' ? 'js' : 'css'
|
84
|
+
end
|
85
|
+
|
86
|
+
def cleanse_paths!(paths)
|
87
|
+
paths.map! do |path|
|
88
|
+
if path =~ %r{^https?}
|
89
|
+
path
|
90
|
+
else
|
91
|
+
File.join(File.dirname(path), File.basename(path, ".#{asset_type_short}"))
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module ActiveAssets
|
4
|
+
module ActiveExpansions
|
5
|
+
module Configurable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
config_accessor :precache_assets
|
10
|
+
self.precache_assets = false if precache_assets.nil?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/hash_with_indifferent_access'
|
3
|
+
|
4
|
+
module ActiveAssets
|
5
|
+
module ActiveExpansions
|
6
|
+
class Expansion
|
7
|
+
include AssetScope
|
8
|
+
include TypeInferrable
|
9
|
+
|
10
|
+
attr_reader :type, :name, :assets, :namespace
|
11
|
+
alias_method :all, :assets
|
12
|
+
delegate :empty?, :to => :assets
|
13
|
+
|
14
|
+
def initialize(name)
|
15
|
+
@name = name
|
16
|
+
@assets = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def configure(options = {}, &blk)
|
20
|
+
@type, @group, @namespace = options.values_at(:type, :group, :namespace)
|
21
|
+
instance_eval(&blk) if block_given?
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def asset(path, options = {})
|
26
|
+
options = HashWithIndifferentAccess.new(options)
|
27
|
+
options.assert_valid_keys(*Asset.members)
|
28
|
+
|
29
|
+
inferred_type, extension = inferred_type(path)
|
30
|
+
|
31
|
+
options.reverse_merge!(
|
32
|
+
:type => inferred_type || @current_type || extension || type,
|
33
|
+
:expansion_name => name,
|
34
|
+
:group => @current_groups
|
35
|
+
)
|
36
|
+
options.update(:path => path)
|
37
|
+
|
38
|
+
members = options.values_at(*Asset.members)
|
39
|
+
a = Asset.new(*members)
|
40
|
+
|
41
|
+
a.valid!
|
42
|
+
@assets << a
|
43
|
+
end
|
44
|
+
alias_method :a, :asset
|
45
|
+
alias_method :`, :asset
|
46
|
+
|
47
|
+
def group(*groups, &blk)
|
48
|
+
@current_groups = groups
|
49
|
+
instance_eval(&blk)
|
50
|
+
ensure
|
51
|
+
@current_groups = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
def namespace(&blk)
|
55
|
+
raise NoMethodError, "Cannot call namespace from within expansion." if block_given?
|
56
|
+
@namespace
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
def cleanse_path(path)
|
61
|
+
File.join(File.dirname(path) + File.basename(path, ".#{type}"))
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'active_support/configurable'
|
2
|
+
|
3
|
+
module ActiveAssets
|
4
|
+
module ActiveExpansions
|
5
|
+
class Expansions
|
6
|
+
include AssetScope
|
7
|
+
include TypeInferrable
|
8
|
+
include ActiveSupport::Configurable
|
9
|
+
include Configurable
|
10
|
+
ActiveSupport.run_load_hooks(:active_expansions, self)
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@expansions = Hash.new(&method(:build_expansions_hash_with_defaults))
|
14
|
+
end
|
15
|
+
|
16
|
+
def register(&blk)
|
17
|
+
instance_eval(&blk) if block_given?
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def namespace(name, &blk)
|
22
|
+
@current_namespace = name
|
23
|
+
instance_eval(&blk)
|
24
|
+
ensure
|
25
|
+
@current_namespace = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def asset(path, options = {})
|
29
|
+
deferred_expansion_name, deferred_expansion_options = @deferred_expansion_config
|
30
|
+
inferred_type, extension = inferred_type(path)
|
31
|
+
|
32
|
+
options = HashWithIndifferentAccess.new(options).reverse_merge(
|
33
|
+
:type => inferred_type || @current_type,
|
34
|
+
:expansion_name => deferred_expansion_name,
|
35
|
+
:group => @current_groups
|
36
|
+
)
|
37
|
+
|
38
|
+
expansion_options = update_expansion_options(deferred_expansion_options || {}, options[:type])
|
39
|
+
|
40
|
+
# asset call below is executed in the scope of the ActiveAssets::Expansion
|
41
|
+
@expansions[options[:type] || extension][options[:expansion_name]].configure(expansion_options) do
|
42
|
+
asset(path, options)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
alias_method :a, :asset
|
46
|
+
alias_method :`, :asset
|
47
|
+
|
48
|
+
def expansion(name, options = {}, &blk)
|
49
|
+
options = update_expansion_options(options)
|
50
|
+
|
51
|
+
if options[:type].present?
|
52
|
+
@expansions[options[:type]][name].configure(options, &blk)
|
53
|
+
else
|
54
|
+
defer_expansion(name, options, &blk)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def javascripts
|
59
|
+
Javascripts.new(@expansions[:js])
|
60
|
+
end
|
61
|
+
|
62
|
+
def stylesheets
|
63
|
+
Stylesheets.new(@expansions[:css])
|
64
|
+
end
|
65
|
+
|
66
|
+
def all
|
67
|
+
@expansions[:js].values + @expansions[:css].values
|
68
|
+
end
|
69
|
+
|
70
|
+
def clear
|
71
|
+
@expansions.clear
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
def defer_expansion(name, options, &blk)
|
76
|
+
@deferred_expansion_config = [name, options]
|
77
|
+
instance_eval(&blk)
|
78
|
+
ensure
|
79
|
+
@deferred_expansion_config = nil
|
80
|
+
end
|
81
|
+
|
82
|
+
def build_expansions_hash_with_defaults(expansions, expansion_type)
|
83
|
+
raise Asset::AmbiguousContext.new(:type) if expansion_type.blank?
|
84
|
+
raise Asset::InvalidAssetType.new(expansion_type) unless Asset::VALID_TYPES.include?(expansion_type.to_sym)
|
85
|
+
|
86
|
+
expansions[expansion_type.to_sym] = build_typed_expansion_hash_with_defaults
|
87
|
+
end
|
88
|
+
|
89
|
+
def build_typed_expansion_hash_with_defaults
|
90
|
+
Hash.new do |typed_expansions, expansion_name|
|
91
|
+
raise Asset::AmbiguousContext.new(:name) if expansion_name.blank?
|
92
|
+
typed_expansions[expansion_name] = Expansion.new(expansion_name)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def update_expansion_options(options, asset_type = nil)
|
97
|
+
o = options.reverse_merge(:type => @current_ytpe, :namespace => @current_namespace)
|
98
|
+
o.update(:type => asset_type) if asset_type
|
99
|
+
o
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "rails"
|
2
|
+
require "rails/active_assets"
|
3
|
+
require 'active_support/ordered_options'
|
4
|
+
|
5
|
+
module ActiveAssets
|
6
|
+
module ActiveExpansions
|
7
|
+
class Railtie < Rails::Railtie
|
8
|
+
rake_tasks do
|
9
|
+
Dir[File.expand_path("../../../tasks/*.rake", __FILE__)].each {|f| load f}
|
10
|
+
end
|
11
|
+
|
12
|
+
config.active_expansions = ActiveSupport::OrderedOptions.new
|
13
|
+
|
14
|
+
initializer :active_assets_extend_application do
|
15
|
+
Rails.application.extend(Rails::ActiveAssets)
|
16
|
+
end
|
17
|
+
|
18
|
+
initializer :load_active_assets do
|
19
|
+
load_active_assets(Rails.root)
|
20
|
+
Rails.application.railties.engines.each {|e| load_active_assets(e.root) }
|
21
|
+
end
|
22
|
+
|
23
|
+
initializer :register_active_assets_expansions do
|
24
|
+
Rails.application.expansions.javascripts.register! and Rails.application.expansions.stylesheets.register!
|
25
|
+
end
|
26
|
+
|
27
|
+
initializer :set_active_expansion_configs do
|
28
|
+
options = config.active_expansions
|
29
|
+
ActiveSupport.on_load(:active_expansions) do
|
30
|
+
options.each { |k,v| send("#{k}=", v) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
initializer :cache_active_assets do
|
35
|
+
if Expansions.precache_assets
|
36
|
+
Rails.application.expansions.javascripts.cache! and Rails.application.expansions.stylesheets.cache!
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
def load_active_assets(root)
|
42
|
+
if File.exists?(File.join(root, 'config/assets.rb'))
|
43
|
+
load File.join(root, 'config/assets.rb')
|
44
|
+
elsif File.directory?(File.join(root, 'config/assets'))
|
45
|
+
Dir[File.join(root, 'config/assets/*.rb')].each do |f|
|
46
|
+
load f
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module ActiveAssets
|
2
|
+
module ActiveExpansions
|
3
|
+
module TypeInferrable
|
4
|
+
def inferred_type(file_path, allowed_extensions = Asset::VALID_TYPES)
|
5
|
+
file_ext = File.extname(file_path)
|
6
|
+
return [nil, nil] unless file_ext.present? && (3..5).include?(file_ext.size)
|
7
|
+
file_ext = file_ext[1..-1].to_sym
|
8
|
+
[allowed_extensions.include?(file_ext) && file_ext, file_ext]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
module ActiveAssets
|
4
|
+
module ActiveExpansions
|
5
|
+
extend ActiveSupport::Autoload
|
6
|
+
|
7
|
+
autoload :Asset
|
8
|
+
autoload :AssetScope
|
9
|
+
autoload :TypeInferrable
|
10
|
+
autoload :Configurable
|
11
|
+
autoload :Expansion
|
12
|
+
autoload :Assets
|
13
|
+
autoload :Javascripts
|
14
|
+
autoload :Stylesheets
|
15
|
+
autoload :Expansions
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class AssetTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
end
|
6
|
+
|
7
|
+
def teardown
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_fields_are_set_to_defaults
|
11
|
+
asset = ActiveAssets::ActiveExpansions::Asset.new
|
12
|
+
assert_equal [nil, nil, nil, :all, true], ActiveAssets::ActiveExpansions::Asset.members.map {|member| asset.send(member)}
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_can_set_fields_through_constructor
|
16
|
+
asset = ActiveAssets::ActiveExpansions::Asset.new('/path/to/asset', :js, :defaults, [:development, :test], false)
|
17
|
+
assert_equal ['/path/to/asset', :js, :defaults, [:development, :test], false], ActiveAssets::ActiveExpansions::Asset.members.map {|member| asset.send(member)}
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_that_cache_will_be_true_unless_set_to_false
|
21
|
+
asset = ActiveAssets::ActiveExpansions::Asset.new('/path/to/asset', :js, :defaults, [:development, :test], "not false")
|
22
|
+
assert asset.cache
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_validation
|
26
|
+
asset = ActiveAssets::ActiveExpansions::Asset.new(nil, :js, :defaults, [:development, :test], "not false")
|
27
|
+
assert !asset.valid?
|
28
|
+
|
29
|
+
asset = ActiveAssets::ActiveExpansions::Asset.new('/path/to/asset', nil, :defaults, [:development, :test], "not false")
|
30
|
+
assert !asset.valid?
|
31
|
+
|
32
|
+
asset = ActiveAssets::ActiveExpansions::Asset.new('/path/to/asset', :js, nil, [:development, :test], "not false")
|
33
|
+
assert !asset.valid?
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_valid_bang
|
37
|
+
asset = ActiveAssets::ActiveExpansions::Asset.new(nil, :js, :defaults, [:development, :test], "not false")
|
38
|
+
assert_raise ActiveAssets::ActiveExpansions::Asset::ValidationError do asset.valid!; end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class ExpansionsTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
initialize_application_or_load_assets!
|
6
|
+
end
|
7
|
+
|
8
|
+
def teardown
|
9
|
+
delete_cached_assets!
|
10
|
+
Rails.application.expansions.clear
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_new
|
14
|
+
assert_nothing_raised do
|
15
|
+
ActiveAssets::ActiveExpansions::Expansions.new
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_namespace
|
20
|
+
Rails.application.expansions.namespace :fubar do
|
21
|
+
expansion :foo, :type => :js do
|
22
|
+
`bas/bar`
|
23
|
+
`bar/bas`
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
assert Rails.application.expansions.all.any? {|e| e.namespace == :fubar}
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_namespace_2
|
31
|
+
Rails.application.expansions do
|
32
|
+
namespace :fubar do
|
33
|
+
expansion :foo, :type => :js do
|
34
|
+
`bas/bar`
|
35
|
+
`bar/bas`
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
assert Rails.application.expansions.all.any? {|e| e.namespace == :fubar}
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_namespace_3
|
44
|
+
Rails.application.expansions do
|
45
|
+
expansion :foo, :type => :js, :namespace => :fubar do
|
46
|
+
`bas/bar`
|
47
|
+
`bar/bas`
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
assert Rails.application.expansions.all.any? {|e| e.namespace == :fubar}
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_asset
|
55
|
+
Rails.application.expansions.asset 'bas/bar', :type => :js, :expansion_name => :foo
|
56
|
+
|
57
|
+
assert Rails.application.expansions.javascripts.has_expansion?(:foo)
|
58
|
+
assert_equal :js, Rails.application.expansions.javascripts[:foo].type
|
59
|
+
assert Rails.application.expansions.javascripts.all.map(&:assets).flatten.any? {|a| "bar/bas" == a.path}
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_asset_2
|
63
|
+
Rails.application.expansions do
|
64
|
+
expansion :foo do
|
65
|
+
`bas/bar.js`
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
assert Rails.application.expansions.javascripts.has_expansion?(:foo)
|
70
|
+
assert_equal :js, Rails.application.expansions.javascripts[:foo].type
|
71
|
+
assert Rails.application.expansions.javascripts.all.map(&:assets).flatten.any? {|a| "bar/bas.js" == a.path}
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_asset_3
|
75
|
+
Rails.application.expansions do
|
76
|
+
asset "bas/bar", :expansion_name => :foo, :type => :js
|
77
|
+
end
|
78
|
+
|
79
|
+
assert Rails.application.expansions.javascripts.has_expansion?(:foo)
|
80
|
+
assert_equal :js, Rails.application.expansions.javascripts[:foo].type
|
81
|
+
assert Rails.application.expansions.javascripts.all.map(&:assets).flatten.any? {|a| "bar/bas" == a.path}
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_asset_4
|
85
|
+
Rails.application.expansions do
|
86
|
+
asset "bas/bar.js", :expansion_name => :foo
|
87
|
+
end
|
88
|
+
|
89
|
+
assert Rails.application.expansions.javascripts.has_expansion?(:foo)
|
90
|
+
assert_equal :js, Rails.application.expansions.javascripts[:foo].type
|
91
|
+
assert Rails.application.expansions.javascripts.all.map(&:assets).flatten.any? {|a| "bar/bas.js" == a.path}
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_asset_5
|
95
|
+
Rails.application.expansions do
|
96
|
+
js do
|
97
|
+
asset "bas/bar", :expansion_name => :foo
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
assert Rails.application.expansions.javascripts.has_expansion?(:foo)
|
102
|
+
assert_equal :js, Rails.application.expansions.javascripts[:foo].type
|
103
|
+
assert Rails.application.expansions.javascripts.all.map(&:assets).flatten.any? {|a| "bar/bas" == a.path}
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_asset_6
|
107
|
+
Rails.application.expansions do
|
108
|
+
css do
|
109
|
+
asset "bas/bar", :expansion_name => :foo
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
assert Rails.application.expansions.stylesheets.has_expansion?(:foo)
|
114
|
+
assert_equal :css, Rails.application.expansions.stylesheets[:foo].type
|
115
|
+
assert Rails.application.expansions.stylesheets.all.map(&:assets).flatten.any? {|a| "bar/bas" == a.path}
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_asset_7
|
119
|
+
assert Rails.application.expansions.javascripts.has_expansion?(:jazz)
|
120
|
+
assert Rails.application.expansions.stylesheets.has_expansion?(:jazz)
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_asset_8
|
124
|
+
assert Rails.application.expansions.javascripts.has_expansion?(:dev)
|
125
|
+
assert Rails.application.expansions.stylesheets.has_expansion?(:dev)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_asset_9
|
129
|
+
assert_raise ActiveAssets::ActiveExpansions::Asset::InvalidAssetType do
|
130
|
+
Rails.application.expansions do
|
131
|
+
expansion :foo do
|
132
|
+
`bas/bar.pdf`
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_asset_10
|
139
|
+
assert_raise ActiveAssets::ActiveExpansions::Asset::AmbiguousContext do
|
140
|
+
Rails.application.expansions do
|
141
|
+
expansion :foo do
|
142
|
+
`vendor/jquery.mousewheel`
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
data/test/autocolor.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'rails/all'
|
2
|
+
require 'active_assets/active_expansions/railtie'
|
3
|
+
|
4
|
+
module ActiveAssetsTest
|
5
|
+
class Application < Rails::Application
|
6
|
+
config.root = File.expand_path('../..', __FILE__)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
Rails.application.config.active_support.deprecation = :stderr
|
@@ -0,0 +1,71 @@
|
|
1
|
+
Rails.application.expansions.register do
|
2
|
+
expansion :defaults, :type => :js do
|
3
|
+
`bas/bar`
|
4
|
+
`bar/bas`
|
5
|
+
end
|
6
|
+
|
7
|
+
js do
|
8
|
+
expansion :bas do
|
9
|
+
`bas/bar`
|
10
|
+
`bar/bas`
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
css do
|
15
|
+
expansion :bas do
|
16
|
+
`bas/bar`
|
17
|
+
`bar/bas`
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# for ExpansionsTest#asset_test_7
|
22
|
+
expansion :jazz do
|
23
|
+
js do
|
24
|
+
`bas/bar`
|
25
|
+
`bar/bas`
|
26
|
+
end
|
27
|
+
|
28
|
+
css do
|
29
|
+
`bas/bar`
|
30
|
+
`bar/bas`
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# for ExpansionsTest#asset_test_8
|
35
|
+
group :development do
|
36
|
+
expansion :dev do
|
37
|
+
asset 'bas/bar', :type => :js
|
38
|
+
asset 'bas/bar', :type => :css
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
group :development do
|
43
|
+
expansion :dev2 do
|
44
|
+
js do
|
45
|
+
`bas/bar`
|
46
|
+
`bar/bas`
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
expansion :envs do
|
52
|
+
group :development do
|
53
|
+
a 'bar/bas', :type => :css
|
54
|
+
js do
|
55
|
+
`bar/bas`
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
expansion :envs2, :type => :js do
|
61
|
+
group :development do
|
62
|
+
`bas/bar`
|
63
|
+
`bar/bas`
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
expansion :basfoo do
|
68
|
+
`bas/bar.js`
|
69
|
+
`bar/bas.js`
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
jsbas
|
@@ -0,0 +1 @@
|
|
1
|
+
jsbar
|
@@ -0,0 +1 @@
|
|
1
|
+
cssbas
|
@@ -0,0 +1 @@
|
|
1
|
+
cssbar
|
data/test/helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
ENV['RAILS_ENV'] ||= 'test'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
require 'rails/all'
|
5
|
+
require 'active_assets'
|
6
|
+
|
7
|
+
TEST_RAILS_ROOT = File.expand_path('../fixtures/rails_root', __FILE__)
|
8
|
+
|
9
|
+
Dir[File.expand_path('../support/**/*.rb', __FILE__)].each {|f| load f }
|
10
|
+
|
11
|
+
load File.join(TEST_RAILS_ROOT, 'config/application.rb')
|
12
|
+
|
13
|
+
class Test::Unit::TestCase
|
14
|
+
include RailsHelper
|
15
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module RailsHelper
|
4
|
+
def rails_root
|
5
|
+
@rails_root = TEST_RAILS_ROOT
|
6
|
+
end
|
7
|
+
|
8
|
+
def delete_cached_assets!
|
9
|
+
Dir[File.join(rails_root, 'public/javascripts/cache'), File.join(rails_root, 'public/stylesheets/cache')].each do |dir|
|
10
|
+
FileUtils.rm_rf(dir)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize_application_or_load_assets!
|
15
|
+
load_assets! if Rails.application && Rails.application.instance_variable_defined?(:@ran)
|
16
|
+
initialize_application! unless Rails.application && Rails.application.instance_variable_defined?(:@ran)
|
17
|
+
end
|
18
|
+
|
19
|
+
def load_assets!
|
20
|
+
if File.exists?(File.join(rails_root, 'config/assets.rb'))
|
21
|
+
load File.join(rails_root, 'config/assets.rb')
|
22
|
+
elsif File.directory?(File.join(rails_root, 'config/assets'))
|
23
|
+
Dir[File.join(rails_root, 'config/assets/*.rb')].each do |f|
|
24
|
+
load f
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize_application!
|
30
|
+
ActiveAssetsTest::Application.initialize!
|
31
|
+
end
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: active_assets
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Sam Woodard
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-23 00:00:00 -08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - "="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 1
|
29
|
+
segments:
|
30
|
+
- 3
|
31
|
+
- 0
|
32
|
+
- 3
|
33
|
+
version: 3.0.3
|
34
|
+
type: :development
|
35
|
+
name: rails
|
36
|
+
requirement: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">"
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 2
|
47
|
+
- 0
|
48
|
+
version: "2.0"
|
49
|
+
type: :development
|
50
|
+
name: test-unit
|
51
|
+
requirement: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
prerelease: false
|
54
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
type: :development
|
64
|
+
name: ZenTest
|
65
|
+
requirement: *id003
|
66
|
+
description: A Railtie that provides a full asset management system, including support for development and deployment. Currently it is designed to manage javascripts and stylesheets but will handle image sprites in the future.
|
67
|
+
email:
|
68
|
+
- sam@wildfireapp.com
|
69
|
+
executables: []
|
70
|
+
|
71
|
+
extensions: []
|
72
|
+
|
73
|
+
extra_rdoc_files: []
|
74
|
+
|
75
|
+
files:
|
76
|
+
- .autotest
|
77
|
+
- .gitignore
|
78
|
+
- Gemfile
|
79
|
+
- Rakefile
|
80
|
+
- active_assets.gemspec
|
81
|
+
- lib/active_assets.rb
|
82
|
+
- lib/active_assets/active_expansions.rb
|
83
|
+
- lib/active_assets/active_expansions/asset.rb
|
84
|
+
- lib/active_assets/active_expansions/asset_scope.rb
|
85
|
+
- lib/active_assets/active_expansions/assets.rb
|
86
|
+
- lib/active_assets/active_expansions/configurable.rb
|
87
|
+
- lib/active_assets/active_expansions/expansion.rb
|
88
|
+
- lib/active_assets/active_expansions/expansions.rb
|
89
|
+
- lib/active_assets/active_expansions/javascripts.rb
|
90
|
+
- lib/active_assets/active_expansions/railtie.rb
|
91
|
+
- lib/active_assets/active_expansions/stylesheets.rb
|
92
|
+
- lib/active_assets/active_expansions/type_inferrable.rb
|
93
|
+
- lib/rails/active_assets.rb
|
94
|
+
- lib/tasks/cache.rake
|
95
|
+
- test/active_assets/active_expansions/asset_test.rb
|
96
|
+
- test/active_assets/active_expansions/expansions_test.rb
|
97
|
+
- test/autocolor.rb
|
98
|
+
- test/fixtures/rails_root/config/application.rb
|
99
|
+
- test/fixtures/rails_root/config/assets/assets.rb
|
100
|
+
- test/fixtures/rails_root/public/javascripts/bar/bas.js
|
101
|
+
- test/fixtures/rails_root/public/javascripts/bas/bar.js
|
102
|
+
- test/fixtures/rails_root/public/stylesheets/bar/bas.css
|
103
|
+
- test/fixtures/rails_root/public/stylesheets/bas/bar.css
|
104
|
+
- test/helper.rb
|
105
|
+
- test/support/rails_helper.rb
|
106
|
+
has_rdoc: true
|
107
|
+
homepage: ""
|
108
|
+
licenses: []
|
109
|
+
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options: []
|
112
|
+
|
113
|
+
require_paths:
|
114
|
+
- lib
|
115
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
hash: 3
|
121
|
+
segments:
|
122
|
+
- 0
|
123
|
+
version: "0"
|
124
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
+
none: false
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
hash: 3
|
130
|
+
segments:
|
131
|
+
- 0
|
132
|
+
version: "0"
|
133
|
+
requirements: []
|
134
|
+
|
135
|
+
rubyforge_project: rails-assets
|
136
|
+
rubygems_version: 1.4.1
|
137
|
+
signing_key:
|
138
|
+
specification_version: 3
|
139
|
+
summary: A Railtie that provides a full asset management system, including support for development and deployment.
|
140
|
+
test_files:
|
141
|
+
- test/active_assets/active_expansions/asset_test.rb
|
142
|
+
- test/active_assets/active_expansions/expansions_test.rb
|
143
|
+
- test/autocolor.rb
|
144
|
+
- test/fixtures/rails_root/config/application.rb
|
145
|
+
- test/fixtures/rails_root/config/assets/assets.rb
|
146
|
+
- test/fixtures/rails_root/public/javascripts/bar/bas.js
|
147
|
+
- test/fixtures/rails_root/public/javascripts/bas/bar.js
|
148
|
+
- test/fixtures/rails_root/public/stylesheets/bar/bas.css
|
149
|
+
- test/fixtures/rails_root/public/stylesheets/bas/bar.css
|
150
|
+
- test/helper.rb
|
151
|
+
- test/support/rails_helper.rb
|