jsus 0.3.1 → 0.3.2
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/.document +1 -1
- data/.travis.yml +1 -1
- data/.yardopts +9 -0
- data/CHANGELOG +21 -0
- data/Gemfile +3 -2
- data/{README → README.md} +10 -4
- data/TODO +1 -3
- data/VERSION +1 -1
- data/bin/jsus +33 -10
- data/jsus.gemspec +12 -7
- data/lib/jsus.rb +31 -9
- data/lib/jsus/container.rb +96 -24
- data/lib/jsus/middleware.rb +160 -43
- data/lib/jsus/package.rb +65 -25
- data/lib/jsus/packager.rb +15 -10
- data/lib/jsus/pool.rb +54 -40
- data/lib/jsus/source_file.rb +105 -80
- data/lib/jsus/tag.rb +65 -39
- data/lib/jsus/util.rb +8 -6
- data/lib/jsus/util/code_generator.rb +21 -0
- data/lib/jsus/util/documenter.rb +34 -6
- data/lib/jsus/util/file_cache.rb +16 -5
- data/lib/jsus/util/inflection.rb +9 -2
- data/lib/jsus/util/tree.rb +54 -18
- data/lib/jsus/util/validator/base.rb +13 -5
- data/lib/jsus/util/validator/mooforge.rb +8 -2
- data/markup/stylesheet.css +84 -16
- data/spec/data/ChainDependencies/app/javascripts/Class/package.yml +2 -2
- data/spec/jsus/middleware_spec.rb +25 -0
- data/spec/jsus/pool_spec.rb +9 -4
- metadata +23 -7
data/.document
CHANGED
data/.travis.yml
CHANGED
data/.yardopts
ADDED
data/CHANGELOG
CHANGED
@@ -1,4 +1,25 @@
|
|
1
1
|
= Jsus Changelog
|
2
|
+
== Version 0.3.2
|
3
|
+
Middleware changes:
|
4
|
+
* Fixed minor problem with middleware when package name and source file tag
|
5
|
+
are the same
|
6
|
+
* Settings are now shared between Jsus::Middleware and subclasses
|
7
|
+
* Middleware now also supports /include/ directive (generates includes file),
|
8
|
+
like -g option of CLI utility
|
9
|
+
* Hack for cache output paths to be recognizable by nginx
|
10
|
+
|
11
|
+
CLI changes:
|
12
|
+
* --very-verbose mode, outputs tree of your packages, very useful when debugging
|
13
|
+
missing dependencies.
|
14
|
+
* If you have circular dependencies in your code, jsus will detect them and issue
|
15
|
+
a huge warning message (WIP)
|
16
|
+
|
17
|
+
Shared changes:
|
18
|
+
* Pool instantiation will now follow symlinks one level deep
|
19
|
+
* Somewhat easier on eyes murdoc template
|
20
|
+
* Pool instantiation now also accepts array of directories as its argument
|
21
|
+
* YARD docs are now the default docs choice
|
22
|
+
|
2
23
|
== Version 0.3.1
|
3
24
|
* Added wildcard support for Jsus::Middleware
|
4
25
|
|
data/Gemfile
CHANGED
@@ -6,7 +6,7 @@ gem "json_pure"
|
|
6
6
|
gem "rgl"
|
7
7
|
|
8
8
|
group :development do
|
9
|
-
gem "
|
9
|
+
gem "rake"
|
10
10
|
gem "rspec"
|
11
11
|
gem "cucumber"
|
12
12
|
gem "jeweler"
|
@@ -17,4 +17,5 @@ group :development do
|
|
17
17
|
gem 'yui-compressor'
|
18
18
|
gem 'sinatra'
|
19
19
|
gem 'rack-test'
|
20
|
-
|
20
|
+
gem 'yard'
|
21
|
+
end
|
data/{README → README.md}
RENAMED
@@ -9,7 +9,7 @@ Why?
|
|
9
9
|
As a javascript programmer, you often need to split your code into
|
10
10
|
multiple files. When you have 50+ different modules / libraries, you
|
11
11
|
need some way to resolve complex dependencies and package all you need
|
12
|
-
and nil you don't. Jsus is an utility that allows you to do just that:
|
12
|
+
and nil you don't. Jsus is an utility that allows you to do just that:
|
13
13
|
package your libraries into one piece with all dependencies included.
|
14
14
|
|
15
15
|
Features
|
@@ -21,17 +21,17 @@ Features
|
|
21
21
|
headers denoting their requirements and what they provide.
|
22
22
|
* Jsus automatically resolves dependencies, so you don't have to worry about
|
23
23
|
order issues or anything else.
|
24
|
-
* Jsus allows you to make "extensions". Extension is a monkey-patch you can
|
24
|
+
* Jsus allows you to make "extensions". Extension is a monkey-patch you can
|
25
25
|
apply to any other library. Because sometimes you want to make project-specific
|
26
26
|
change to a library you don't have control over and you want to be able to
|
27
27
|
update this library without applying manual patches from their source.
|
28
|
-
* Jsus uses [murdoc](https://github.com/markiz/murdoc) for doccu style docs
|
28
|
+
* Jsus uses [murdoc](https://github.com/markiz/murdoc) for doccu style docs
|
29
29
|
generation.
|
30
30
|
* Jsus generates special json files denoting source and resulting project
|
31
31
|
structure which can be useful for later introspection.
|
32
32
|
* Jsus can also generate a special js file with loader for your dependencies,
|
33
33
|
so that you don't need to repackage everything during development cycle.
|
34
|
-
|
34
|
+
|
35
35
|
Examples
|
36
36
|
========
|
37
37
|
|
@@ -42,6 +42,12 @@ Examples
|
|
42
42
|
* `jsus . Output`
|
43
43
|
* Look at what Output directory contains
|
44
44
|
|
45
|
+
Using with Rails / Sinatra / Whatever
|
46
|
+
=====================================
|
47
|
+
|
48
|
+
Jsus comes with a middleware in its backpack. See [rails example](https://github.com/jsus/jsus-rails-app)
|
49
|
+
and [sinatra example](https://github.com/jsus/jsus-sinatra-app).
|
50
|
+
|
45
51
|
Plans
|
46
52
|
=====
|
47
53
|
|
data/TODO
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.2
|
data/bin/jsus
CHANGED
@@ -77,6 +77,11 @@ module Jsus
|
|
77
77
|
Jsus.verbose = true
|
78
78
|
end
|
79
79
|
|
80
|
+
opts.on_tail('--very-verbose', 'very verbose mode, shows pool stats beside usual verbose stuff') do
|
81
|
+
Jsus.verbose = true
|
82
|
+
options[:display_pool_stats] = true
|
83
|
+
end
|
84
|
+
|
80
85
|
opts.on_tail('-b', '--benchmark', 'shows time spent on various stages') do
|
81
86
|
options[:benchmark] = true
|
82
87
|
end
|
@@ -192,6 +197,7 @@ module Jsus
|
|
192
197
|
setup_output_directory
|
193
198
|
preload_pool
|
194
199
|
load_package
|
200
|
+
display_pool_stats if options[:display_pool_stats]
|
195
201
|
compile_package
|
196
202
|
post_process if options[:postproc]
|
197
203
|
compress_package if options[:compress]
|
@@ -224,6 +230,30 @@ module Jsus
|
|
224
230
|
checkpoint(:dependencies)
|
225
231
|
end
|
226
232
|
|
233
|
+
def display_pool_stats
|
234
|
+
checkpoint(:pool_stats)
|
235
|
+
puts ""
|
236
|
+
puts "Pool stats:"
|
237
|
+
puts ""
|
238
|
+
puts "Main package:"
|
239
|
+
display_package @package
|
240
|
+
puts "Supplementary packages:"
|
241
|
+
@pool.packages.each do |package|
|
242
|
+
display_package package
|
243
|
+
end
|
244
|
+
puts ""
|
245
|
+
end
|
246
|
+
|
247
|
+
def display_package(package)
|
248
|
+
puts "Package: #{package.name}"
|
249
|
+
package.source_files.to_a.sort_by {|sf| sf.filename}.each do |sf|
|
250
|
+
puts " [#{sf.relative_filename}]"
|
251
|
+
puts " Provides: [#{sf.provides_names.join(", ")}]"
|
252
|
+
puts " Requires: [#{sf.requires_names.join(", ")}]"
|
253
|
+
end
|
254
|
+
puts ""
|
255
|
+
end
|
256
|
+
|
227
257
|
def compile_package
|
228
258
|
@package_content = @package.compile(nil)
|
229
259
|
checkpoint(:compilation)
|
@@ -273,15 +303,8 @@ module Jsus
|
|
273
303
|
includes_root = options[:includes_root] || @output_dir
|
274
304
|
File.open(File.join(@output_dir, "includes.js"), "w") do |f|
|
275
305
|
c = Jsus::Container.new(*(@package.source_files.to_a + @package.linked_external_dependencies.to_a))
|
276
|
-
|
277
|
-
(
|
278
|
-
var sources = %sources%;
|
279
|
-
if (!loader) loader = function(path) {
|
280
|
-
document.write('<scr' + 'ipt src="' + (prefix || '') + path + '"></script>');
|
281
|
-
}
|
282
|
-
for (var i = 0, j = sources.length; i < j; i++) loader(sources[i]);
|
283
|
-
})(window.prefix, window.loader);}.sub("%sources%", JSON.pretty_generate(c.required_files(includes_root)))
|
284
|
-
f.puts script
|
306
|
+
paths = c.required_files(includes_root)
|
307
|
+
f.puts Jsus::Util::CodeGenerator.generate_includes(paths)
|
285
308
|
end
|
286
309
|
checkpoint(:includes)
|
287
310
|
end
|
@@ -354,4 +377,4 @@ module Jsus
|
|
354
377
|
end
|
355
378
|
end
|
356
379
|
|
357
|
-
Jsus::CLI.run!
|
380
|
+
Jsus::CLI.run!
|
data/jsus.gemspec
CHANGED
@@ -5,27 +5,28 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{jsus}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Mark Abramov"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-06-19}
|
13
13
|
s.default_executable = %q{jsus}
|
14
14
|
s.description = %q{Javascript packager and dependency resolver}
|
15
15
|
s.email = %q{markizko@gmail.com}
|
16
16
|
s.executables = ["jsus"]
|
17
17
|
s.extra_rdoc_files = [
|
18
|
-
"README",
|
18
|
+
"README.md",
|
19
19
|
"TODO"
|
20
20
|
]
|
21
21
|
s.files = [
|
22
22
|
".document",
|
23
23
|
".rspec",
|
24
24
|
".travis.yml",
|
25
|
+
".yardopts",
|
25
26
|
"CHANGELOG",
|
26
27
|
"Gemfile",
|
27
28
|
"Manifest",
|
28
|
-
"README",
|
29
|
+
"README.md",
|
29
30
|
"Rakefile",
|
30
31
|
"TODO",
|
31
32
|
"UNLICENSE",
|
@@ -102,6 +103,7 @@ Gem::Specification.new do |s|
|
|
102
103
|
"lib/jsus/source_file.rb",
|
103
104
|
"lib/jsus/tag.rb",
|
104
105
|
"lib/jsus/util.rb",
|
106
|
+
"lib/jsus/util/code_generator.rb",
|
105
107
|
"lib/jsus/util/documenter.rb",
|
106
108
|
"lib/jsus/util/file_cache.rb",
|
107
109
|
"lib/jsus/util/inflection.rb",
|
@@ -217,7 +219,7 @@ Gem::Specification.new do |s|
|
|
217
219
|
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
218
220
|
s.add_runtime_dependency(%q<json_pure>, [">= 0"])
|
219
221
|
s.add_runtime_dependency(%q<rgl>, [">= 0"])
|
220
|
-
s.add_development_dependency(%q<
|
222
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
221
223
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
222
224
|
s.add_development_dependency(%q<cucumber>, [">= 0"])
|
223
225
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
@@ -228,11 +230,12 @@ Gem::Specification.new do |s|
|
|
228
230
|
s.add_development_dependency(%q<yui-compressor>, [">= 0"])
|
229
231
|
s.add_development_dependency(%q<sinatra>, [">= 0"])
|
230
232
|
s.add_development_dependency(%q<rack-test>, [">= 0"])
|
233
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
231
234
|
else
|
232
235
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
233
236
|
s.add_dependency(%q<json_pure>, [">= 0"])
|
234
237
|
s.add_dependency(%q<rgl>, [">= 0"])
|
235
|
-
s.add_dependency(%q<
|
238
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
236
239
|
s.add_dependency(%q<rspec>, [">= 0"])
|
237
240
|
s.add_dependency(%q<cucumber>, [">= 0"])
|
238
241
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
@@ -243,12 +246,13 @@ Gem::Specification.new do |s|
|
|
243
246
|
s.add_dependency(%q<yui-compressor>, [">= 0"])
|
244
247
|
s.add_dependency(%q<sinatra>, [">= 0"])
|
245
248
|
s.add_dependency(%q<rack-test>, [">= 0"])
|
249
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
246
250
|
end
|
247
251
|
else
|
248
252
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
249
253
|
s.add_dependency(%q<json_pure>, [">= 0"])
|
250
254
|
s.add_dependency(%q<rgl>, [">= 0"])
|
251
|
-
s.add_dependency(%q<
|
255
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
252
256
|
s.add_dependency(%q<rspec>, [">= 0"])
|
253
257
|
s.add_dependency(%q<cucumber>, [">= 0"])
|
254
258
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
@@ -259,6 +263,7 @@ Gem::Specification.new do |s|
|
|
259
263
|
s.add_dependency(%q<yui-compressor>, [">= 0"])
|
260
264
|
s.add_dependency(%q<sinatra>, [">= 0"])
|
261
265
|
s.add_dependency(%q<rack-test>, [">= 0"])
|
266
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
262
267
|
end
|
263
268
|
end
|
264
269
|
|
data/lib/jsus.rb
CHANGED
@@ -11,10 +11,7 @@ require 'fileutils'
|
|
11
11
|
require 'pathname'
|
12
12
|
|
13
13
|
#
|
14
|
-
# Jsus --
|
15
|
-
#
|
16
|
-
# For better understanding of jsus ideas start with http://github.com/Markiz/jsus-examples
|
17
|
-
#
|
14
|
+
# Jsus -- your better javascript packager.
|
18
15
|
#
|
19
16
|
module Jsus
|
20
17
|
autoload :SourceFile, 'jsus/source_file'
|
@@ -26,19 +23,44 @@ module Jsus
|
|
26
23
|
autoload :Util, 'jsus/util'
|
27
24
|
autoload :Middleware, 'jsus/middleware'
|
28
25
|
|
29
|
-
#
|
26
|
+
# In verbose mode jsus shows a lot of warnings like missing dependencies.
|
27
|
+
# Default: false
|
28
|
+
#
|
29
|
+
# @return [Boolean] jsus verbosity mode
|
30
|
+
# @api public
|
30
31
|
def self.verbose?
|
31
32
|
!!@verbose
|
32
33
|
end
|
33
34
|
|
34
|
-
#
|
35
|
-
#
|
35
|
+
# @see .verbose?
|
36
|
+
# @param [Boolean] verbose verbose verbosity mode
|
37
|
+
# @api public
|
36
38
|
def self.verbose=(verbose)
|
37
39
|
@verbose = verbose
|
38
40
|
end
|
39
41
|
|
40
|
-
#
|
42
|
+
# @return [String] Jsus version
|
43
|
+
# @api public
|
41
44
|
def self.version
|
42
45
|
@version ||= File.read(File.dirname(__FILE__) + "/../VERSION")
|
43
46
|
end
|
44
|
-
|
47
|
+
|
48
|
+
|
49
|
+
# Circular dependencies cannot be resolved and lead to "impossible"
|
50
|
+
# situations and problems, like missing source files or incorrect ordering.
|
51
|
+
#
|
52
|
+
# However, checking for cycles is quite computationally expensive, which
|
53
|
+
# is why you may want to disable it in production mode.
|
54
|
+
#
|
55
|
+
# @return [Boolean]
|
56
|
+
# @api public
|
57
|
+
def self.look_for_cycles?
|
58
|
+
@look_for_cycles == nil ? true : @look_for_cycles
|
59
|
+
end
|
60
|
+
|
61
|
+
# @see .look_for_cycles?
|
62
|
+
# @param [Boolean]
|
63
|
+
def self.look_for_cycles=(value)
|
64
|
+
@look_for_cycles = value
|
65
|
+
end
|
66
|
+
end
|
data/lib/jsus/container.rb
CHANGED
@@ -4,10 +4,12 @@ module Jsus
|
|
4
4
|
# from an array is the fact that container maintains topological
|
5
5
|
# sort for the source files.
|
6
6
|
#
|
7
|
+
# This class is mostly used internally.
|
8
|
+
#
|
7
9
|
class Container
|
10
|
+
# Instantiates a container from given sources.
|
8
11
|
#
|
9
|
-
#
|
10
|
-
#
|
12
|
+
# @param [SourceFile]
|
11
13
|
def initialize(*sources)
|
12
14
|
sources.each do |source|
|
13
15
|
push(source)
|
@@ -16,7 +18,9 @@ module Jsus
|
|
16
18
|
|
17
19
|
# Public API
|
18
20
|
|
19
|
-
# Pushes an item to container
|
21
|
+
# Pushes an item to the container
|
22
|
+
#
|
23
|
+
# @param [SourceFile] source pushed file
|
20
24
|
def push(source)
|
21
25
|
if source
|
22
26
|
if source.kind_of?(Array) || source.kind_of?(Container)
|
@@ -30,7 +34,9 @@ module Jsus
|
|
30
34
|
end
|
31
35
|
alias_method :<<, :push
|
32
36
|
|
33
|
-
# Flattens the container items
|
37
|
+
# Flattens the container items
|
38
|
+
#
|
39
|
+
# @return [Array]
|
34
40
|
def flatten
|
35
41
|
map {|item| item.respond_to?(:flatten) ? item.flatten : item }.flatten
|
36
42
|
end
|
@@ -38,16 +44,25 @@ module Jsus
|
|
38
44
|
# Contains the source files. Please, don't use sources directly, if you
|
39
45
|
# depend on them to be topologically sorted. Use collection methods like
|
40
46
|
# inject/reject/map directly on the container instead.
|
47
|
+
#
|
48
|
+
# @return [Array]
|
49
|
+
# @api semipublic
|
41
50
|
def sources
|
42
51
|
@sources ||= []
|
43
52
|
end
|
44
53
|
alias_method :to_a, :sources
|
45
54
|
|
55
|
+
# Sets sources to new value.
|
56
|
+
#
|
57
|
+
# @api semipublic
|
46
58
|
def sources=(new_value) # :nodoc:
|
47
59
|
@sources = new_value
|
48
60
|
end
|
49
61
|
|
50
|
-
#
|
62
|
+
# Topologically sorts items in container if required.
|
63
|
+
#
|
64
|
+
# @return [self]
|
65
|
+
# @api semipublic
|
51
66
|
def sort!
|
52
67
|
unless sorted?
|
53
68
|
remove_replaced_files!
|
@@ -57,13 +72,24 @@ module Jsus
|
|
57
72
|
self
|
58
73
|
end
|
59
74
|
|
60
|
-
# Returns whether
|
75
|
+
# Returns whether container requires sorting.
|
76
|
+
#
|
77
|
+
# @return [Boolean]
|
78
|
+
# @api semipublic
|
61
79
|
def sorted?
|
62
80
|
!!@sorted
|
63
81
|
end
|
64
82
|
|
65
83
|
# Lists all the required files (dependencies and extensions) for
|
66
|
-
# the sources in the container.
|
84
|
+
# the sources in the container. Consider it a projection from source files
|
85
|
+
# space onto filesystem space.
|
86
|
+
#
|
87
|
+
# Optionally accepts a filesystem point to calculate relative paths from.
|
88
|
+
#
|
89
|
+
# @param [String] root point from which the relative paths are calculated.
|
90
|
+
# When omitted, full paths are returned.
|
91
|
+
# @return [Array] ordered list of required files
|
92
|
+
# @api public
|
67
93
|
def required_files(root = nil)
|
68
94
|
sort!
|
69
95
|
files = sources.map {|s| s.required_files }.flatten
|
@@ -74,13 +100,18 @@ module Jsus
|
|
74
100
|
files
|
75
101
|
end
|
76
102
|
|
77
|
-
|
103
|
+
# Shows inspection of the container.
|
104
|
+
# @api public
|
105
|
+
def inspect
|
78
106
|
"#<#{self.class.name}:#{self.object_id} #{self.sources.inspect}>"
|
79
107
|
end
|
80
108
|
|
81
109
|
# Private API
|
82
110
|
|
83
|
-
|
111
|
+
# Performs topological sort inside current container.
|
112
|
+
#
|
113
|
+
# @api private
|
114
|
+
def topsort
|
84
115
|
graph = RGL::DirectedAdjacencyGraph.new
|
85
116
|
# init vertices
|
86
117
|
items = sources
|
@@ -98,20 +129,46 @@ module Jsus
|
|
98
129
|
end
|
99
130
|
end
|
100
131
|
result = []
|
132
|
+
if Jsus.look_for_cycles?
|
133
|
+
cycles = graph.cycles
|
134
|
+
unless cycles.empty?
|
135
|
+
puts "*" * 30
|
136
|
+
puts "ACHTUNG! WARNING! ATTENTION!"
|
137
|
+
puts "*" * 30
|
138
|
+
puts "Jsus has discovered you have circular dependencies in your code."
|
139
|
+
puts "Please resolve them immediately!"
|
140
|
+
puts "List of circular dependencies:"
|
141
|
+
cycles.each do |cycle|
|
142
|
+
puts "-" * 30
|
143
|
+
puts (cycle + [cycle.first]).map {|sf| sf.filename}.join(" => ")
|
144
|
+
end
|
145
|
+
puts "*" * 30
|
146
|
+
end
|
147
|
+
end
|
101
148
|
graph.topsort_iterator.each { |item| result << item }
|
102
149
|
result
|
103
150
|
end
|
104
151
|
|
105
|
-
|
152
|
+
# Cached map of dependencies pointing to source files.
|
153
|
+
# @return [Hash]
|
154
|
+
# @api private
|
155
|
+
def dependency_cache
|
106
156
|
@dependency_cache ||= {}
|
107
157
|
end
|
108
158
|
|
109
|
-
|
159
|
+
# Cached tree of what source files provide.
|
160
|
+
#
|
161
|
+
# @api private
|
162
|
+
# @return [Jsus::Util::Tree]
|
163
|
+
def provides_tree
|
110
164
|
@provides_tree ||= provides_tree!
|
111
165
|
end
|
112
166
|
|
113
|
-
#
|
114
|
-
|
167
|
+
# Returns tree of what source files provide.
|
168
|
+
#
|
169
|
+
# @api private
|
170
|
+
# @return [Jsus::Util::Tree]
|
171
|
+
def provides_tree!
|
115
172
|
tree = Util::Tree.new
|
116
173
|
# Provisions
|
117
174
|
sources.each do |file|
|
@@ -128,17 +185,28 @@ module Jsus
|
|
128
185
|
tree
|
129
186
|
end
|
130
187
|
|
131
|
-
|
188
|
+
# Removes files which are marked as replaced by other sources.
|
189
|
+
#
|
190
|
+
# @api private
|
191
|
+
def remove_replaced_files!
|
132
192
|
sources.reject! do |sf|
|
133
193
|
!sf.provides.empty? && sf.provides.any? { |tag| replacements_tree[tag] && replacements_tree[tag] != sf }
|
134
194
|
end
|
135
195
|
end
|
136
196
|
|
137
|
-
|
197
|
+
# Cached tree of what source files replace.
|
198
|
+
#
|
199
|
+
# @api private
|
200
|
+
# @return [Jsus::Util::Tree]
|
201
|
+
def replacements_tree
|
138
202
|
@replacements_tree ||= replacements_tree!
|
139
203
|
end
|
140
204
|
|
141
|
-
|
205
|
+
# Returns tree of what source files replace.
|
206
|
+
#
|
207
|
+
# @api private
|
208
|
+
# @return [Jsus::Util::Tree]
|
209
|
+
def replacements_tree!
|
142
210
|
tree = Util::Tree.new
|
143
211
|
sources.each do |file|
|
144
212
|
if file.replaces
|
@@ -148,25 +216,29 @@ module Jsus
|
|
148
216
|
tree
|
149
217
|
end
|
150
218
|
|
151
|
-
|
219
|
+
# Clears all caches for given container.
|
220
|
+
#
|
221
|
+
# @api private
|
222
|
+
def clear_cache!
|
152
223
|
@provides_tree = nil
|
153
224
|
@replacements_tree = nil
|
154
225
|
@dependency_cache = nil
|
155
226
|
@sorted = false
|
156
227
|
end
|
157
228
|
|
158
|
-
|
229
|
+
# List of methods that clear cached state of container when called.
|
159
230
|
CACHE_CLEAR_METHODS = [
|
160
231
|
"map!", "reject!", "inject!", "collect!", "delete", "delete_at"
|
161
|
-
]
|
232
|
+
]
|
162
233
|
|
234
|
+
# List of methods that are delegated to underlying array of sources.
|
163
235
|
DELEGATED_METHODS = [
|
164
236
|
"==", "to_a", "map", "map!", "each", "inject", "inject!",
|
165
|
-
"collect", "collect!", "reject", "reject!", "detect", "size",
|
166
|
-
"length", "[]", "empty?", "index", "include?", "select",
|
237
|
+
"collect", "collect!", "reject", "reject!", "detect", "size",
|
238
|
+
"length", "[]", "empty?", "index", "include?", "select",
|
167
239
|
"delete_if", "delete", "-", "+", "|", "&"
|
168
|
-
]
|
169
|
-
|
240
|
+
]
|
241
|
+
|
170
242
|
(DELEGATED_METHODS).each do |m|
|
171
243
|
class_eval <<-EVAL
|
172
244
|
def #{m}(*args, &block)
|
@@ -177,4 +249,4 @@ module Jsus
|
|
177
249
|
EVAL
|
178
250
|
end
|
179
251
|
end
|
180
|
-
end
|
252
|
+
end
|