ember-cli-rails 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -0
- data/README.md +183 -115
- data/app/controller/ember-cli/ember_controller.rb +9 -0
- data/app/helpers/ember_rails_helper.rb +13 -9
- data/app/views/ember_cli/ember/index.html.erb +5 -0
- data/lib/ember-cli-rails.rb +11 -25
- data/lib/ember-cli/app.rb +47 -295
- data/lib/ember-cli/build_monitor.rb +56 -0
- data/lib/ember-cli/capture.rb +15 -15
- data/lib/ember-cli/command.rb +63 -0
- data/lib/ember-cli/configuration.rb +34 -3
- data/lib/ember-cli/constraint.rb +9 -0
- data/lib/ember-cli/controller_extension.rb +13 -0
- data/lib/ember-cli/engine.rb +14 -3
- data/lib/ember-cli/errors.rb +4 -0
- data/lib/ember-cli/helpers.rb +5 -11
- data/lib/ember-cli/html_page.rb +8 -15
- data/lib/ember-cli/path_set.rb +44 -29
- data/lib/ember-cli/route_helpers.rb +25 -0
- data/lib/ember-cli/shell.rb +84 -0
- data/lib/ember-cli/sprockets.rb +44 -0
- data/lib/ember-cli/version.rb +1 -1
- data/lib/generators/ember-cli/heroku/heroku_generator.rb +10 -0
- data/lib/tasks/ember-cli.rake +1 -1
- metadata +26 -7
- data/app/controllers/ember_tests_controller.rb +0 -31
- data/config/routes.rb +0 -3
- data/lib/ember-cli/asset_resolver.rb +0 -54
- data/lib/ember-cli/middleware.rb +0 -18
- data/lib/ember-cli/runner.rb +0 -53
@@ -2,24 +2,28 @@ require "ember-cli/capture"
|
|
2
2
|
|
3
3
|
module EmberRailsHelper
|
4
4
|
def include_ember_index_html(name, &block)
|
5
|
+
warn <<-MSG.strip_heredoc
|
6
|
+
The `include_ember_index_html` helper has been deprecated.
|
7
|
+
|
8
|
+
Rename all invocations to `render_ember_app`
|
9
|
+
MSG
|
10
|
+
|
11
|
+
render_ember_app(name, &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def render_ember_app(name, &block)
|
5
15
|
markup_capturer = EmberCli::Capture.new(sprockets: self, &block)
|
6
16
|
|
7
17
|
head, body = markup_capturer.capture
|
8
18
|
|
9
|
-
|
10
|
-
sprockets: self,
|
11
|
-
head: head,
|
12
|
-
body: body,
|
13
|
-
)
|
14
|
-
|
15
|
-
render inline: html
|
19
|
+
render inline: EmberCli[name].sprockets.index_html(head: head, body: body)
|
16
20
|
end
|
17
21
|
|
18
22
|
def include_ember_script_tags(name, **options)
|
19
|
-
javascript_include_tag(*EmberCli[name].
|
23
|
+
javascript_include_tag(*EmberCli[name].sprockets.assets, options)
|
20
24
|
end
|
21
25
|
|
22
26
|
def include_ember_stylesheet_tags(name, **options)
|
23
|
-
stylesheet_link_tag(*EmberCli[name].
|
27
|
+
stylesheet_link_tag(*EmberCli[name].sprockets.assets, options)
|
24
28
|
end
|
25
29
|
end
|
data/lib/ember-cli-rails.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "ember-cli/engine" if defined?(Rails)
|
2
|
+
require "ember-cli/errors"
|
2
3
|
|
3
4
|
module EmberCli
|
4
5
|
extend self
|
@@ -6,9 +7,7 @@ module EmberCli
|
|
6
7
|
autoload :App, "ember-cli/app"
|
7
8
|
autoload :Configuration, "ember-cli/configuration"
|
8
9
|
autoload :Helpers, "ember-cli/helpers"
|
9
|
-
autoload :Middleware, "ember-cli/middleware"
|
10
10
|
autoload :PathSet, "ember-cli/path_set"
|
11
|
-
autoload :Runner, "ember-cli/runner"
|
12
11
|
|
13
12
|
def configure
|
14
13
|
yield configuration
|
@@ -30,36 +29,27 @@ module EmberCli
|
|
30
29
|
ENV["SKIP_EMBER"].present?
|
31
30
|
end
|
32
31
|
|
33
|
-
def
|
34
|
-
@
|
32
|
+
def enable!
|
33
|
+
@enabled ||= begin
|
35
34
|
Rails.configuration.assets.paths << root.join("assets").to_s
|
36
35
|
at_exit{ cleanup }
|
37
36
|
true
|
38
37
|
end
|
39
38
|
end
|
40
39
|
|
41
|
-
def enable!
|
42
|
-
prepare!
|
43
|
-
append_middleware unless env.production?
|
44
|
-
end
|
45
|
-
|
46
40
|
def install_dependencies!
|
47
|
-
|
48
|
-
each_app
|
41
|
+
enable!
|
42
|
+
each_app(&:install_dependencies)
|
49
43
|
end
|
50
44
|
|
51
|
-
def
|
52
|
-
|
53
|
-
each_app
|
45
|
+
def test!
|
46
|
+
enable!
|
47
|
+
each_app(&:test)
|
54
48
|
end
|
55
49
|
|
56
50
|
def compile!
|
57
|
-
|
58
|
-
each_app
|
59
|
-
end
|
60
|
-
|
61
|
-
def process_path(path)
|
62
|
-
each_app{ |app| Runner.new(app, path).process }
|
51
|
+
enable!
|
52
|
+
each_app(&:compile)
|
63
53
|
end
|
64
54
|
|
65
55
|
def root
|
@@ -83,11 +73,7 @@ module EmberCli
|
|
83
73
|
end
|
84
74
|
|
85
75
|
def each_app
|
86
|
-
apps.each{ |
|
87
|
-
end
|
88
|
-
|
89
|
-
def append_middleware
|
90
|
-
Rails.configuration.middleware.use Middleware
|
76
|
+
apps.each { |_, app| yield app }
|
91
77
|
end
|
92
78
|
end
|
93
79
|
|
data/lib/ember-cli/app.rb
CHANGED
@@ -1,334 +1,101 @@
|
|
1
|
-
require "
|
2
|
-
require "ember-cli/
|
3
|
-
require "ember-cli/
|
1
|
+
require "ember-cli/shell"
|
2
|
+
require "ember-cli/sprockets"
|
3
|
+
require "ember-cli/build_monitor"
|
4
4
|
|
5
5
|
module EmberCli
|
6
6
|
class App
|
7
|
-
|
8
|
-
EMBER_CLI_VERSIONS = [ "~> 0.1.5", "~> 0.2.0", "~> 1.13" ]
|
9
|
-
|
10
|
-
class BuildError < StandardError; end
|
11
|
-
|
12
|
-
attr_reader :name, :options, :paths, :pid
|
13
|
-
|
14
|
-
delegate :root, to: :paths
|
7
|
+
attr_reader :name, :options, :paths
|
15
8
|
|
16
9
|
def initialize(name, **options)
|
17
|
-
@name
|
18
|
-
@
|
10
|
+
@name = name.to_s
|
11
|
+
@options = options
|
12
|
+
@paths = PathSet.new(
|
13
|
+
app: self,
|
14
|
+
configuration: EmberCli.configuration,
|
15
|
+
environment: Rails.env,
|
16
|
+
rails_root: Rails.root,
|
17
|
+
ember_cli_root: EmberCli.root,
|
18
|
+
)
|
19
|
+
@shell = Shell.new(
|
20
|
+
paths: @paths,
|
21
|
+
env: env_hash,
|
22
|
+
options: options,
|
23
|
+
)
|
24
|
+
@build = BuildMonitor.new(name, @paths)
|
19
25
|
end
|
20
26
|
|
21
27
|
def compile
|
22
28
|
@compiled ||= begin
|
23
29
|
prepare
|
24
|
-
|
25
|
-
|
30
|
+
@shell.compile
|
31
|
+
@build.check!
|
26
32
|
copy_index_html_file
|
27
33
|
true
|
28
34
|
end
|
29
35
|
end
|
30
36
|
|
31
|
-
def
|
32
|
-
if
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
exec "#{npm_path} prune && #{npm_path} install"
|
37
|
-
|
38
|
-
if bower_path.nil?
|
39
|
-
fail <<-FAIL
|
40
|
-
Bower is required by EmberCLI
|
41
|
-
|
42
|
-
Install it with:
|
43
|
-
|
44
|
-
$ npm install -g bower
|
45
|
-
FAIL
|
37
|
+
def build
|
38
|
+
if EmberCli.env.development?
|
39
|
+
build_and_watch
|
46
40
|
else
|
47
|
-
|
41
|
+
compile
|
48
42
|
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def run
|
52
|
-
prepare
|
53
|
-
FileUtils.touch lockfile_path
|
54
|
-
cmd = command(watch: true)
|
55
|
-
@pid = exec(cmd, method: :spawn)
|
56
|
-
Process.detach pid
|
57
|
-
copy_index_html_file
|
58
|
-
set_on_exit_callback
|
59
|
-
end
|
60
|
-
|
61
|
-
def run_tests
|
62
|
-
prepare
|
63
|
-
|
64
|
-
exec("#{ember_path} test")
|
65
|
-
end
|
66
|
-
|
67
|
-
def stop
|
68
|
-
Process.kill :INT, pid if pid
|
69
|
-
@pid = nil
|
70
|
-
end
|
71
|
-
|
72
|
-
def index_html(sprockets:, head:, body:)
|
73
|
-
asset_resolver = AssetResolver.new(
|
74
|
-
app: self,
|
75
|
-
sprockets: sprockets,
|
76
|
-
)
|
77
|
-
html_page = HtmlPage.new(
|
78
|
-
asset_resolver: asset_resolver,
|
79
|
-
content: index_file.read,
|
80
|
-
head: head,
|
81
|
-
body: body,
|
82
|
-
)
|
83
|
-
|
84
|
-
html_page.render
|
85
|
-
end
|
86
|
-
|
87
|
-
def exposed_js_assets
|
88
|
-
[vendor_assets, application_assets]
|
89
|
-
end
|
90
|
-
alias exposed_css_assets exposed_js_assets
|
91
43
|
|
92
|
-
|
93
|
-
"#{name}/vendor"
|
44
|
+
@build.wait!
|
94
45
|
end
|
95
46
|
|
96
|
-
def
|
97
|
-
|
47
|
+
def install_dependencies
|
48
|
+
@shell.install
|
98
49
|
end
|
99
50
|
|
100
|
-
def
|
101
|
-
|
102
|
-
wait_for_build_complete_or_error
|
103
|
-
end
|
104
|
-
rescue Timeout::Error
|
105
|
-
suggested_timeout = build_timeout + 5
|
106
|
-
|
107
|
-
warn <<-MSG.strip_heredoc
|
108
|
-
============================= WARNING! =============================
|
109
|
-
|
110
|
-
Seems like Ember #{name} application takes more than #{build_timeout}
|
111
|
-
seconds to compile.
|
112
|
-
|
113
|
-
To prevent race conditions consider adjusting build timeout
|
114
|
-
configuration in your ember initializer:
|
115
|
-
|
116
|
-
EmberCLI.configure do |config|
|
117
|
-
config.build_timeout = #{suggested_timeout} # in seconds
|
118
|
-
end
|
119
|
-
|
120
|
-
Alternatively, you can set build timeout per application like this:
|
121
|
-
|
122
|
-
EmberCLI.configure do |config|
|
123
|
-
config.app :#{name}, build_timeout: #{suggested_timeout}
|
124
|
-
end
|
51
|
+
def test
|
52
|
+
prepare
|
125
53
|
|
126
|
-
|
127
|
-
MSG
|
54
|
+
@shell.test
|
128
55
|
end
|
129
56
|
|
130
|
-
def
|
131
|
-
|
132
|
-
paths.public_send(path_method)
|
133
|
-
else
|
134
|
-
super
|
135
|
-
end
|
57
|
+
def sprockets
|
58
|
+
EmberCli::Sprockets.new(self)
|
136
59
|
end
|
137
60
|
|
138
|
-
def
|
139
|
-
if
|
140
|
-
|
61
|
+
def index_file
|
62
|
+
if EmberCli.env.production?
|
63
|
+
paths.applications.join("#{name}.html")
|
141
64
|
else
|
142
|
-
|
65
|
+
paths.dist.join("index.html")
|
143
66
|
end
|
144
67
|
end
|
145
68
|
|
146
69
|
private
|
147
70
|
|
148
|
-
def
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
def supported_path_method(original)
|
153
|
-
path_method = original.to_s[/\A(.+)_path\z/, 1]
|
154
|
-
path_method if path_method && paths.respond_to?(path_method)
|
155
|
-
end
|
156
|
-
|
157
|
-
def silence_build(&block)
|
158
|
-
if ENV.fetch("EMBER_CLI_RAILS_VERBOSE") { EmberCli.env.production? }
|
159
|
-
yield
|
160
|
-
else
|
161
|
-
silence_stream STDOUT, &block
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
def build_timeout
|
166
|
-
options.fetch(:build_timeout) { EmberCli.configuration.build_timeout }
|
167
|
-
end
|
168
|
-
|
169
|
-
def watcher
|
170
|
-
options.fetch(:watcher) { EmberCli.configuration.watcher }
|
171
|
-
end
|
172
|
-
|
173
|
-
def check_for_build_error!
|
174
|
-
raise_build_error! if build_error?
|
175
|
-
end
|
176
|
-
|
177
|
-
def reset_build_error!
|
178
|
-
build_error_file_path.delete if build_error?
|
179
|
-
end
|
180
|
-
|
181
|
-
def build_error?
|
182
|
-
build_error_file_path.exist? && build_error_file_path.size?
|
183
|
-
end
|
184
|
-
|
185
|
-
def raise_build_error!
|
186
|
-
error = BuildError.new("EmberCLI app #{name.inspect} has failed to build")
|
187
|
-
error.set_backtrace build_error_file_path.readlines
|
188
|
-
fail error
|
71
|
+
def build_and_watch
|
72
|
+
prepare
|
73
|
+
@shell.build_and_watch
|
74
|
+
copy_index_html_file
|
189
75
|
end
|
190
76
|
|
191
77
|
def prepare
|
192
78
|
@prepared ||= begin
|
193
|
-
|
194
|
-
check_addon!
|
195
|
-
check_ember_cli_version!
|
196
|
-
reset_build_error!
|
79
|
+
@build.reset
|
197
80
|
symlink_to_assets_root
|
198
|
-
|
81
|
+
sprockets.register!
|
199
82
|
true
|
200
83
|
end
|
201
84
|
end
|
202
85
|
|
203
|
-
def check_ember_cli_version!
|
204
|
-
version = dev_dependencies.fetch("ember-cli").split(?-).first
|
205
|
-
|
206
|
-
unless Helpers.match_version?(version, EMBER_CLI_VERSIONS)
|
207
|
-
fail <<-MSG.strip_heredoc
|
208
|
-
EmberCLI Rails require ember-cli NPM package version to be
|
209
|
-
#{EMBER_CLI_VERSIONS.last} to work properly (you have #{version}).
|
210
|
-
From within your EmberCLI directory please update your package.json
|
211
|
-
accordingly and run:
|
212
|
-
|
213
|
-
$ npm install
|
214
|
-
|
215
|
-
MSG
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
def check_addon!
|
220
|
-
unless addon_present?
|
221
|
-
fail <<-MSG.strip_heredoc
|
222
|
-
EmberCLI Rails requires your Ember app to have an addon.
|
223
|
-
|
224
|
-
From within your EmberCLI directory please run:
|
225
|
-
|
226
|
-
$ npm install --save-dev ember-cli-rails-addon@#{ADDON_VERSION}
|
227
|
-
|
228
|
-
in your Ember application root: #{root}
|
229
|
-
MSG
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
def check_dependencies!
|
234
|
-
unless node_modules_present?
|
235
|
-
fail <<-MSG.strip_heredoc
|
236
|
-
EmberCLI app dependencies are not installed. From your Rails application root please run:
|
237
|
-
|
238
|
-
$ bundle exec rake ember:install
|
239
|
-
|
240
|
-
If you do not require Ember at this URL, you can restrict this check using the `enable`
|
241
|
-
option in the EmberCLI initializer.
|
242
|
-
MSG
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
|
-
def assets_path
|
247
|
-
paths.assets.join(name)
|
248
|
-
end
|
249
|
-
|
250
86
|
def copy_index_html_file
|
251
|
-
if
|
252
|
-
FileUtils.cp(
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
def index_file
|
257
|
-
if environment == "production"
|
258
|
-
applications_path.join("#{name}.html")
|
259
|
-
else
|
260
|
-
dist_path.join("index.html")
|
87
|
+
if EmberCli.env.production?
|
88
|
+
FileUtils.cp(paths.app_assets.join("index.html"), index_file)
|
261
89
|
end
|
262
90
|
end
|
263
91
|
|
264
92
|
def symlink_to_assets_root
|
265
|
-
|
93
|
+
paths.app_assets.make_symlink paths.dist
|
266
94
|
rescue Errno::EEXIST
|
267
95
|
# Sometimes happens when starting multiple Unicorn workers.
|
268
96
|
# Ignoring...
|
269
97
|
end
|
270
98
|
|
271
|
-
def add_assets_to_precompile_list
|
272
|
-
Rails.configuration.assets.precompile << /\A#{name}\//
|
273
|
-
end
|
274
|
-
|
275
|
-
def command(watch: false)
|
276
|
-
watch_flag = ""
|
277
|
-
|
278
|
-
if watch
|
279
|
-
watch_flag = "--watch"
|
280
|
-
|
281
|
-
if watcher
|
282
|
-
watch_flag += " --watcher #{watcher}"
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
"#{ember_path} build #{watch_flag} --environment #{environment} --output-path #{dist_path} #{redirect_errors} #{log_pipe}"
|
287
|
-
end
|
288
|
-
|
289
|
-
def redirect_errors
|
290
|
-
"2> #{build_error_file_path}"
|
291
|
-
end
|
292
|
-
|
293
|
-
def log_pipe
|
294
|
-
"| #{tee_path} -a #{log_path}" if tee_path
|
295
|
-
end
|
296
|
-
|
297
|
-
def ember_app_name
|
298
|
-
@ember_app_name ||= options.fetch(:name){ package_json.fetch(:name) }
|
299
|
-
end
|
300
|
-
|
301
|
-
def environment
|
302
|
-
EmberCli.env.production? ? "production" : "development"
|
303
|
-
end
|
304
|
-
|
305
|
-
def package_json
|
306
|
-
@package_json ||=
|
307
|
-
JSON.parse(package_json_file_path.read).with_indifferent_access
|
308
|
-
end
|
309
|
-
|
310
|
-
def addon_package_json
|
311
|
-
@addon_package_json ||=
|
312
|
-
JSON.parse(addon_package_json_file_path.read).with_indifferent_access
|
313
|
-
end
|
314
|
-
|
315
|
-
def addon_version
|
316
|
-
addon_package_json.fetch("version")
|
317
|
-
end
|
318
|
-
|
319
|
-
def dev_dependencies
|
320
|
-
package_json.fetch("devDependencies", {})
|
321
|
-
end
|
322
|
-
|
323
|
-
def addon_present?
|
324
|
-
addon_package_json_file_path.exist? &&
|
325
|
-
addon_version == ADDON_VERSION
|
326
|
-
end
|
327
|
-
|
328
|
-
def node_modules_present?
|
329
|
-
node_modules_path.exist?
|
330
|
-
end
|
331
|
-
|
332
99
|
def excluded_ember_deps
|
333
100
|
Array.wrap(options[:exclude_ember_deps]).join(?,)
|
334
101
|
end
|
@@ -336,23 +103,8 @@ module EmberCli
|
|
336
103
|
def env_hash
|
337
104
|
ENV.to_h.tap do |vars|
|
338
105
|
vars["RAILS_ENV"] = Rails.env
|
339
|
-
vars["DISABLE_FINGERPRINTING"] = "true"
|
340
106
|
vars["EXCLUDE_EMBER_ASSETS"] = excluded_ember_deps
|
341
|
-
vars["BUNDLE_GEMFILE"] =
|
342
|
-
end
|
343
|
-
end
|
344
|
-
|
345
|
-
def exec(cmd, method: :system)
|
346
|
-
Dir.chdir root do
|
347
|
-
Kernel.public_send(method, env_hash, cmd, err: :out) || exit(1)
|
348
|
-
end
|
349
|
-
end
|
350
|
-
|
351
|
-
def wait_for_build_complete_or_error
|
352
|
-
loop do
|
353
|
-
check_for_build_error!
|
354
|
-
break unless lockfile_path.exist?
|
355
|
-
sleep 0.1
|
107
|
+
vars["BUNDLE_GEMFILE"] = paths.gemfile.to_s if paths.gemfile.exist?
|
356
108
|
end
|
357
109
|
end
|
358
110
|
end
|