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/lib/jsus/middleware.rb
CHANGED
@@ -1,75 +1,114 @@
|
|
1
1
|
require 'rack/utils'
|
2
2
|
module Jsus
|
3
3
|
#
|
4
|
-
#
|
4
|
+
# Jsus rack middleware.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
6
|
+
# Usage
|
7
|
+
# -----
|
8
8
|
#
|
9
|
-
#
|
9
|
+
# `use Jsus::Middleware` in your rack application and all the requests
|
10
|
+
# to /javascripts/jsus/* will be redirected to the middleware.
|
10
11
|
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# :cache - enable simple file caching
|
14
|
-
# :cache_path - directory for file caching
|
15
|
-
# :prefix - change /jsus/ to something else or remove it altogether (set to nil)
|
16
|
-
# :cache_pool - cache js pool between requests. Can save you some time
|
17
|
-
# between requests but annoys a lot during development.
|
12
|
+
# Example requests
|
13
|
+
# ----------------
|
18
14
|
#
|
15
|
+
# <dt>`GET /javascripts/jsus/require/Mootools.Core+Mootools.More`</dt>
|
16
|
+
# <dd>merges packages named Mootools.Core and Mootools.More with all the
|
17
|
+
# dependencies and outputs the result.</dd>
|
19
18
|
#
|
20
|
-
#
|
19
|
+
# <dt>`GET /javascripts/jsus/require/Mootools.More~Mootools.Core`</dt>
|
20
|
+
# <dd>returns package Mootools.More with all the dependencies MINUS any of
|
21
|
+
# Mootools.Core dependencies.</dd>
|
21
22
|
#
|
22
|
-
# GET /javascripts/jsus/require/Mootools.Core+Mootools.More
|
23
|
-
#
|
24
|
-
#
|
23
|
+
# <dt>`GET /javascripts/jsus/require/Mootools.Core:Class+Mootools.More:Fx`</dt>
|
24
|
+
# <dd>same thing but for source files providing Mootools.Core/Class and
|
25
|
+
# Mootools.More/Fx</dd>
|
25
26
|
#
|
26
|
-
# GET /javascripts/jsus/
|
27
|
-
#
|
28
|
-
# Mootools.Core dependencies.
|
27
|
+
# <dt>`GET /javascripts/jsus/include/Mootools.Core`</dt>
|
28
|
+
# <dd>generates js file with remote javascript fetching via ajax</dd>
|
29
29
|
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
35
|
-
# Also see sinatra example https://github.com/jsus/jsus-sinatra-app
|
30
|
+
# @see .settings=
|
31
|
+
# @see https://github.com/jsus/jsus-sinatra-app Sinatra example (Github)
|
32
|
+
# @see https://github.com/jsus/jsus-rails-app Rails example (Github)
|
36
33
|
#
|
37
34
|
class Middleware
|
38
35
|
include Rack
|
39
36
|
class <<self
|
37
|
+
# Default settings for Middleware
|
40
38
|
DEFAULT_SETTINGS = {
|
41
39
|
:packages_dir => ".",
|
42
40
|
:cache => false,
|
43
41
|
:cache_path => nil,
|
44
42
|
:prefix => "jsus",
|
45
|
-
:cache_pool => true
|
43
|
+
:cache_pool => true,
|
44
|
+
:includes_root => "."
|
46
45
|
}.freeze
|
47
46
|
|
47
|
+
# @return [Hash] Middleware current settings
|
48
|
+
# @api public
|
48
49
|
def settings
|
49
|
-
|
50
|
+
@@settings ||= DEFAULT_SETTINGS.dup
|
50
51
|
end # settings
|
51
52
|
|
53
|
+
# *Merges* given new settings into current settings.
|
54
|
+
#
|
55
|
+
# @param [Hash] new_settings
|
56
|
+
# @option new_settings [String, Array] :packages_dir directory (or array
|
57
|
+
# of directories) containing source files.
|
58
|
+
# @option new_settings [Boolean] :cache enable file caching (every request
|
59
|
+
# is written into corresponding file). Note, that it's write-only cache,
|
60
|
+
# you will have to configure your webserver to serve these files.
|
61
|
+
# @option new_settings [String] :cache_path path to cache directory
|
62
|
+
# @option new_settings [String, nil] :prefix path prefix to use for
|
63
|
+
# request. You can change default "jsus" to anything else or disable it
|
64
|
+
# altogether.
|
65
|
+
# @option new_settings [Boolean] :cache_pool whether to cache pool between
|
66
|
+
# requests. Cached pool means that updates to your source files will not
|
67
|
+
# be visible until you restart webserver.
|
68
|
+
# @option new_settings [String] :includes_root when generating "includes"
|
69
|
+
# lists, this is the point in filesystem used as relative root.
|
70
|
+
# @api public
|
52
71
|
def settings=(new_settings)
|
53
72
|
settings.merge!(new_settings)
|
54
73
|
end # settings=
|
55
74
|
|
75
|
+
# Generates and caches a pool of source files and packages.
|
76
|
+
#
|
77
|
+
# @return [Jsus::Pool]
|
78
|
+
# @api public
|
56
79
|
def pool
|
57
|
-
|
80
|
+
@@pool ||= Jsus::Pool.new(settings[:packages_dir])
|
58
81
|
end # pool
|
59
82
|
|
83
|
+
# @return [Boolean] whether caching is enabled
|
84
|
+
# @api public
|
60
85
|
def cache?
|
61
86
|
settings[:cache]
|
62
87
|
end # cache?
|
63
88
|
|
89
|
+
# @return [Jsus::Util::FileCache] file cache to store results of requests.
|
90
|
+
# @api public
|
64
91
|
def cache
|
65
|
-
|
92
|
+
@@cache ||= cache? ? Util::FileCache.new(settings[:cache_path]) : nil
|
66
93
|
end # cache
|
67
94
|
end # class <<self
|
68
95
|
|
96
|
+
# Default rack initialization routine
|
97
|
+
# @param [#call] rack chain caller
|
98
|
+
# @api public
|
69
99
|
def initialize(app)
|
70
100
|
@app = app
|
71
101
|
end # initialize
|
72
102
|
|
103
|
+
# Since rack apps are used as singletons and we store some state during
|
104
|
+
# request handling, we need to separate state between different calls.
|
105
|
+
#
|
106
|
+
# Jsus::Middleware#call method dups current rack app and executes
|
107
|
+
# Jsus::Middleware#_call on it.
|
108
|
+
#
|
109
|
+
# @param [Hash] rack env
|
110
|
+
# @return [#each] rack response
|
111
|
+
# @api semipublic
|
73
112
|
def _call(env)
|
74
113
|
path = Utils.unescape(env["PATH_INFO"])
|
75
114
|
return @app.call(env) unless handled_by_jsus?(path)
|
@@ -77,37 +116,77 @@ module Jsus
|
|
77
116
|
components = path.split("/")
|
78
117
|
return @app.call(env) unless components.size >= 2
|
79
118
|
if components[0] == "require"
|
80
|
-
|
119
|
+
generate_requires(components[1])
|
120
|
+
elsif components[0] == "include"
|
121
|
+
generate_includes(components[1])
|
81
122
|
else
|
82
123
|
not_found!
|
83
124
|
end
|
84
125
|
end # _call
|
85
126
|
|
127
|
+
# Rack calling point
|
128
|
+
#
|
129
|
+
# @param [Hash] rack env
|
130
|
+
# @return [#each] rack response
|
131
|
+
# @api public
|
86
132
|
def call(env)
|
87
133
|
dup._call(env)
|
88
134
|
end # call
|
89
135
|
|
90
136
|
protected
|
91
137
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
138
|
+
# Generates response for /require/ requests.
|
139
|
+
#
|
140
|
+
# @param [String] path component to required sources
|
141
|
+
# @return [#each] rack response
|
142
|
+
# @api semipublic
|
143
|
+
def generate_requires(path_string)
|
144
|
+
files = path_string_to_files(path_string)
|
97
145
|
if !files.empty?
|
98
146
|
response = Container.new(*files).map {|f| f.content }.join("\n")
|
99
|
-
cache.write(path_string, response) if cache?
|
147
|
+
cache.write(escape_path_for_cache_key(path_string), response) if cache?
|
100
148
|
respond_with(response)
|
101
149
|
else
|
102
150
|
not_found!
|
103
151
|
end
|
104
|
-
end #
|
152
|
+
end # generate_requires
|
153
|
+
|
154
|
+
# Generates response for /include/ requests.
|
155
|
+
#
|
156
|
+
# @param [String] path component to included sources
|
157
|
+
# @return [#each] rack response
|
158
|
+
# @api semipublic
|
159
|
+
def generate_includes(path_string)
|
160
|
+
files = path_string_to_files(path_string)
|
161
|
+
if !files.empty?
|
162
|
+
paths = Container.new(*files).required_files(self.class.settings[:includes_root])
|
163
|
+
respond_with(Jsus::Util::CodeGenerator.generate_includes(paths))
|
164
|
+
else
|
165
|
+
not_found!
|
166
|
+
end
|
167
|
+
end # generate_includes
|
105
168
|
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
#
|
110
|
-
#
|
169
|
+
# Returns list of exlcuded and included source files for given path strings.
|
170
|
+
#
|
171
|
+
# @param [String] string with + and ~
|
172
|
+
# @return [Hash] hash with source files to include and to exclude
|
173
|
+
# @api semipublic
|
174
|
+
def path_string_to_files(path_string)
|
175
|
+
path_args = parse_path_string(path_string.sub(/.js$/, ""))
|
176
|
+
files = []
|
177
|
+
path_args[:include].each {|tag| files += get_associated_files(tag).to_a }
|
178
|
+
path_args[:exclude].each {|tag| files -= get_associated_files(tag).to_a }
|
179
|
+
files
|
180
|
+
end # path_string_to_files
|
181
|
+
|
182
|
+
# Parses human-readable string with + and ~ operations into a more usable hash.
|
183
|
+
# @note + is a space after url decoding
|
184
|
+
#
|
185
|
+
# @example
|
186
|
+
# parse_path_string("Package:A~Package:C Package:B~Other:D")
|
187
|
+
# => {:include => ["Package/A", "Package/B"],
|
188
|
+
# :exclude => ["Package/C", "Other/D"]}
|
189
|
+
# @api semipublic
|
111
190
|
def parse_path_string(path_string)
|
112
191
|
path_string = " " + path_string unless path_string[0,1] =~ /\+\-/
|
113
192
|
included = []
|
@@ -123,6 +202,11 @@ module Jsus
|
|
123
202
|
{:include => included, :exclude => excluded}
|
124
203
|
end # parse_path_string
|
125
204
|
|
205
|
+
# Returns a list of associated files for given source file or source package.
|
206
|
+
# @param [String] canonical source file or source package name or wildcard
|
207
|
+
# e.g. "Mootools.Core", "Mootools.Core/*", "Mootools.Core/Class", "**/*"
|
208
|
+
# @return [Array] list of source files for given input
|
209
|
+
# @api semipublic
|
126
210
|
def get_associated_files(source_file_or_package)
|
127
211
|
if package = pool.packages.detect {|pkg| pkg.name == source_file_or_package}
|
128
212
|
package.include_dependencies!
|
@@ -132,7 +216,7 @@ module Jsus
|
|
132
216
|
else
|
133
217
|
# Try using arg as mask
|
134
218
|
mask = source_file_or_package.to_s
|
135
|
-
if !(mask =~ /^\s*$/) && !(source_files = pool.provides_tree.glob(mask)).empty?
|
219
|
+
if !(mask =~ /^\s*$/) && !(source_files = pool.provides_tree.glob(mask).compact).empty?
|
136
220
|
source_files.map {|source| get_associated_files(source) }.flatten
|
137
221
|
else
|
138
222
|
# No dice
|
@@ -141,27 +225,44 @@ module Jsus
|
|
141
225
|
end
|
142
226
|
end # get_associated_files
|
143
227
|
|
228
|
+
# Rack response of not found
|
229
|
+
# @return [#each] 404 response
|
230
|
+
# @api semipublic
|
144
231
|
def not_found!
|
145
232
|
[404, {"Content-Type" => "text/plain"}, ["Jsus doesn't know anything about this entity"]]
|
146
233
|
end # not_found!
|
147
234
|
|
235
|
+
# Respond with given text
|
236
|
+
# @param [String] text to respond with
|
237
|
+
# @return [#each] 200 response
|
238
|
+
# @api semipublic
|
148
239
|
def respond_with(text)
|
149
240
|
[200, {"Content-Type" => "text/javascript"}, [text]]
|
150
241
|
end # respond_with
|
151
242
|
|
152
|
-
|
243
|
+
# Check whether given path is handled by jsus middleware.
|
244
|
+
#
|
245
|
+
# @param [String] path
|
246
|
+
# @return [Boolean]
|
247
|
+
# @api semipublic
|
153
248
|
def handled_by_jsus?(path)
|
154
249
|
path =~ path_prefix_regex
|
155
250
|
end # handled_by_jsus?
|
156
251
|
|
252
|
+
# @return [String] Jsus request path prefix
|
253
|
+
# @api semipublic
|
157
254
|
def path_prefix
|
158
255
|
@path_prefix ||= self.class.settings[:prefix] ? "/javascripts/#{self.class.settings[:prefix]}/" : "/javascripts/"
|
159
256
|
end # path_prefix
|
160
257
|
|
258
|
+
# @return [Regexp] Jsus request path regexp
|
259
|
+
# @api semipublic
|
161
260
|
def path_prefix_regex
|
162
261
|
@path_prefix_regex ||= %r{^#{path_prefix}}
|
163
262
|
end # path_prefix_regex
|
164
263
|
|
264
|
+
# @return [Jsus::Pool] Jsus session pool
|
265
|
+
# @api semipublic
|
165
266
|
def pool
|
166
267
|
if cache_pool?
|
167
268
|
self.class.pool
|
@@ -170,16 +271,32 @@ module Jsus
|
|
170
271
|
end
|
171
272
|
end # pool
|
172
273
|
|
274
|
+
# @return [Boolean] whether request is going to be cached
|
275
|
+
# @api semipublic
|
173
276
|
def cache?
|
174
277
|
self.class.cache?
|
175
278
|
end # cache?
|
176
279
|
|
280
|
+
# @return [Jsus::Util::FileCache] file cache to store response
|
281
|
+
# @api semipublic
|
177
282
|
def cache
|
178
283
|
self.class.cache
|
179
284
|
end # cache
|
180
285
|
|
286
|
+
# @return [Boolean] whether pool is shared between requests
|
287
|
+
# @api semipublic
|
181
288
|
def cache_pool?
|
182
289
|
self.class.settings[:cache_pool]
|
183
290
|
end # cache_pool?
|
291
|
+
|
292
|
+
# You might or might not need to do some last minute conversions for your cache
|
293
|
+
# key. Default behaviour is merely a nginx hack, you may have to use your own
|
294
|
+
# function for your web-server.
|
295
|
+
# @param [String] request path minus the prefix
|
296
|
+
# @return [String] normalized cache key for given request path
|
297
|
+
# @api semipublic
|
298
|
+
def escape_path_for_cache_key(path)
|
299
|
+
path.gsub(" ", "+")
|
300
|
+
end # escape_path_for_cache_key
|
184
301
|
end # class Middleware
|
185
302
|
end # module Jsus
|
data/lib/jsus/package.rb
CHANGED
@@ -4,25 +4,28 @@ module Jsus
|
|
4
4
|
# a javascript package.
|
5
5
|
#
|
6
6
|
class Package
|
7
|
-
|
8
|
-
attr_accessor :
|
7
|
+
# directory which this package resides in (full path)
|
8
|
+
attr_accessor :directory
|
9
|
+
# an instance of Jsus::Pool
|
10
|
+
attr_accessor :pool
|
11
|
+
|
9
12
|
# Constructors
|
10
13
|
|
11
14
|
#
|
12
15
|
# Creates a package from given directory.
|
13
16
|
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
17
|
+
# @param [String] path to directory containing a package
|
18
|
+
# @param [Hash] options
|
19
|
+
# @option options [Jsus::Pool] :pool which pool the package should belong to.
|
20
|
+
# @raise an error when the given directory doesn't contain a package.yml or package.json
|
18
21
|
# file with meta info.
|
19
|
-
#
|
22
|
+
# @api public
|
20
23
|
def initialize(directory, options = {})
|
21
24
|
self.directory = File.expand_path(directory)
|
22
25
|
if File.exists?(File.join(directory, 'package.yml'))
|
23
26
|
self.header = YAML.load_file(File.join(directory, 'package.yml'))
|
24
27
|
elsif File.exists?(File.join(directory, 'package.json'))
|
25
|
-
self.header = JSON.load(
|
28
|
+
self.header = JSON.load(File.open(File.join(directory, 'package.json'), 'r:utf-8') {|f| f.read })
|
26
29
|
else
|
27
30
|
raise "Directory #{directory} does not contain a valid package.yml / package.json file!"
|
28
31
|
end
|
@@ -49,44 +52,52 @@ module Jsus
|
|
49
52
|
|
50
53
|
# Public API
|
51
54
|
|
52
|
-
#
|
55
|
+
# @return [Hash] parsed package header.
|
56
|
+
# @api public
|
53
57
|
def header
|
54
58
|
@header ||= {}
|
55
59
|
end
|
56
60
|
|
57
|
-
#
|
61
|
+
# @return [String] a package name.
|
62
|
+
# @api public
|
58
63
|
def name
|
59
64
|
header["name"] ||= ""
|
60
65
|
end
|
61
66
|
|
62
|
-
#
|
67
|
+
# @return [String] a package description.
|
68
|
+
# @api public
|
63
69
|
def description
|
64
70
|
header["description"] ||= ""
|
65
71
|
end
|
66
72
|
|
67
|
-
#
|
73
|
+
# @return [String] a filename for compiled package.
|
74
|
+
# @api public
|
68
75
|
def filename
|
69
76
|
header["filename"] ||= Jsus::Util::Inflection.snake_case(name) + ".js"
|
70
77
|
end
|
71
78
|
|
72
|
-
#
|
79
|
+
# @return [Array] a list of sources filenames.
|
80
|
+
# @api public
|
73
81
|
def files
|
74
82
|
header["files"] = header["files"] || header["sources"] || []
|
75
83
|
end
|
76
84
|
alias_method :sources, :files
|
77
85
|
|
78
|
-
#
|
86
|
+
# @return [Array] an array of provided tags including those provided by linked external dependencies.
|
87
|
+
# @api public
|
79
88
|
def provides
|
80
89
|
source_files.map {|s| s.provides }.flatten | linked_external_dependencies.map {|d| d.provides }.flatten
|
81
90
|
end
|
82
91
|
|
83
|
-
#
|
92
|
+
# @return [Array] an array of provided tags names including those provided by linked external dependencies.
|
93
|
+
# @api public
|
84
94
|
def provides_names
|
85
95
|
source_files.map {|s| s.provides_names(:short => true) }.flatten |
|
86
96
|
linked_external_dependencies.map {|d| d.provides_names }.flatten
|
87
97
|
end
|
88
98
|
|
89
|
-
#
|
99
|
+
# @return [Array] an array of unresolved dependencies' tags for the package.
|
100
|
+
# @api public
|
90
101
|
def dependencies
|
91
102
|
result = source_files.map {|source| source.dependencies }.flatten
|
92
103
|
result |= linked_external_dependencies.map {|d| d.dependencies}.flatten
|
@@ -94,33 +105,44 @@ module Jsus
|
|
94
105
|
result
|
95
106
|
end
|
96
107
|
|
97
|
-
#
|
108
|
+
# @return [Array] an array of unresolved dependencies' names.
|
109
|
+
# @api public
|
98
110
|
def dependencies_names
|
99
111
|
dependencies.map {|d| d.name(:short => true) }
|
100
112
|
end
|
101
113
|
|
102
|
-
#
|
114
|
+
# @return [Array] an array of external dependencies' tags (including resolved ones).
|
115
|
+
# @api public
|
103
116
|
def external_dependencies
|
104
117
|
source_files.map {|s| s.external_dependencies }.flatten
|
105
118
|
end
|
106
119
|
|
107
|
-
#
|
120
|
+
# @return [Array] an array of external dependencies' names (including resolved ones).
|
121
|
+
# @api public
|
108
122
|
def external_dependencies_names
|
109
123
|
external_dependencies.map {|d| d.name }
|
110
124
|
end
|
111
125
|
|
112
|
-
#
|
126
|
+
# @return [Jsus::Container] source files with external dependencies in correct order.
|
127
|
+
# @api public
|
113
128
|
def linked_external_dependencies
|
114
129
|
@linked_external_dependencies ||= Container.new
|
115
130
|
end
|
116
131
|
|
117
132
|
# Compiles source files and linked external source files into a given category.
|
133
|
+
# @param [String, nil] directory to output the result into
|
134
|
+
# @return [String] content of merged source files
|
135
|
+
# @api public
|
118
136
|
def compile(directory = ".")
|
119
137
|
fn = directory ? File.join(directory, filename) : nil
|
120
138
|
Packager.new(*(source_files.to_a + linked_external_dependencies.to_a)).pack(fn)
|
121
139
|
end
|
122
140
|
|
123
141
|
# Generates tree structure for files in package into a json file.
|
142
|
+
# @param [String] directory to output the result
|
143
|
+
# @param [String] resulting filename
|
144
|
+
# @return [Hash] hash with tree structure
|
145
|
+
# @api public
|
124
146
|
def generate_tree(directory = ".", filename = "tree.json")
|
125
147
|
FileUtils.mkdir_p(directory)
|
126
148
|
result = ActiveSupport::OrderedHash.new
|
@@ -140,6 +162,10 @@ module Jsus
|
|
140
162
|
end
|
141
163
|
|
142
164
|
# Generates info about resulting compiled package into a json file.
|
165
|
+
# @param [String] directory to output the result
|
166
|
+
# @param [String] resulting filename
|
167
|
+
# @return [Hash] hash with scripts info
|
168
|
+
# @api public
|
143
169
|
def generate_scripts_info(directory = ".", filename = "scripts.json")
|
144
170
|
FileUtils.mkdir_p directory
|
145
171
|
File.open(File.join(directory, filename), "w") { |resulting_file| resulting_file << JSON.pretty_generate(self.to_hash) }
|
@@ -147,6 +173,7 @@ module Jsus
|
|
147
173
|
end
|
148
174
|
|
149
175
|
# Looks up all the external dependencies in the pool.
|
176
|
+
# @api semipublic
|
150
177
|
def include_dependencies!
|
151
178
|
source_files.each do |source|
|
152
179
|
if pool
|
@@ -157,6 +184,7 @@ module Jsus
|
|
157
184
|
end
|
158
185
|
|
159
186
|
# Executes #include_extensions for all the source files.
|
187
|
+
# @api semipublic
|
160
188
|
def include_extensions!
|
161
189
|
source_files.each do |source|
|
162
190
|
source.include_extensions!
|
@@ -164,11 +192,15 @@ module Jsus
|
|
164
192
|
end
|
165
193
|
|
166
194
|
# Lists the required files for the package.
|
195
|
+
# @return [Array] ordered list of full paths to required files.
|
196
|
+
# @api public
|
167
197
|
def required_files
|
168
198
|
source_files.map {|s| s.required_files }.flatten
|
169
199
|
end
|
170
200
|
|
171
|
-
|
201
|
+
# Hash representation of the package.
|
202
|
+
# @api public
|
203
|
+
def to_hash
|
172
204
|
{
|
173
205
|
name => {
|
174
206
|
:desc => description,
|
@@ -178,26 +210,34 @@ module Jsus
|
|
178
210
|
}
|
179
211
|
end
|
180
212
|
|
213
|
+
|
181
214
|
# Container with source files
|
215
|
+
# @return [Jsus::Container]
|
216
|
+
# @api semipublic
|
182
217
|
def source_files
|
183
218
|
@source_files ||= Container.new
|
184
219
|
end
|
185
220
|
|
186
221
|
# Container with extensions (they aren't compiled or included into #reqired_files list)
|
222
|
+
# @return [Jsus::Container]
|
223
|
+
# @api semipublic
|
187
224
|
def extensions
|
188
225
|
@extensions ||= Container.new
|
189
226
|
end
|
190
227
|
|
191
228
|
# Private API
|
192
229
|
|
193
|
-
|
230
|
+
|
231
|
+
# @param [Hash] parsed header
|
232
|
+
# @api private
|
233
|
+
def header=(new_header)
|
194
234
|
@header = new_header
|
195
235
|
end
|
196
236
|
|
197
|
-
|
237
|
+
# @param [Enumerable] external dependencies
|
238
|
+
# @api private
|
239
|
+
def linked_external_dependencies=(new_value)
|
198
240
|
@linked_external_dependencies = new_value
|
199
241
|
end
|
200
|
-
|
201
|
-
protected
|
202
242
|
end
|
203
243
|
end
|