ember-cli-rails 0.5.8 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,9 +1,12 @@
1
1
  module EmberCli
2
2
  class EmberController < ::ApplicationController
3
3
  def index
4
- @app = params[:ember_app]
5
-
6
4
  render layout: false
7
5
  end
6
+
7
+ def ember_app
8
+ params[:ember_app]
9
+ end
10
+ helper_method :ember_app
8
11
  end
9
12
  end
@@ -1,59 +1,34 @@
1
1
  require "ember_cli/capture"
2
+ require "ember_cli/assets"
2
3
 
3
4
  module EmberRailsHelper
4
- def include_ember_index_html(name, &block)
5
- Warnings.warn_include_index_html
6
-
7
- render_ember_app(name, &block)
8
- end
9
-
10
5
  def render_ember_app(name, &block)
6
+ EmberCli[name].build
7
+
11
8
  markup_capturer = EmberCli::Capture.new(sprockets: self, &block)
12
9
 
13
10
  head, body = markup_capturer.capture
14
11
 
15
- render inline: EmberCli[name].sprockets.index_html(head: head, body: body)
12
+ render inline: EmberCli[name].index_html(head: head, body: body)
16
13
  end
17
14
 
18
15
  def include_ember_script_tags(name, **options)
19
- Warnings.warn_asset_helper
20
-
21
- javascript_include_tag(*EmberCli[name].sprockets.javascript_assets, options)
22
- end
16
+ EmberCli[name].build
23
17
 
24
- def include_ember_stylesheet_tags(name, **options)
25
- Warnings.warn_asset_helper
18
+ assets = EmberCli::Assets.new(EmberCli[name])
26
19
 
27
- stylesheet_link_tag(*EmberCli[name].sprockets.stylesheet_assets, options)
20
+ assets.javascript_assets.
21
+ map { |src| %{<script src="#{src}"></script>}.html_safe }.
22
+ reduce(&:+)
28
23
  end
29
24
 
30
- module Warnings
31
- def self.warn_include_index_html
32
- warn <<-MSG.strip_heredoc
33
- The `include_ember_index_html` helper has been deprecated.
34
-
35
- Rename all invocations to `render_ember_app`
36
- MSG
37
- end
38
-
39
- def self.warn_asset_helper
40
- if Rails::VERSION::MAJOR < 4
41
- warn <<-MSG.strip_heredoc
42
- `ember-cli-rails` no longer supports Sprockets-based helpers for Rails
43
- versions below 4.0.
44
-
45
- Replace usage of
46
- * `include_ember_script_tags`
47
- * `include_ember_stylesheet_tags`
48
-
49
- with `render_ember_app` invocations.
25
+ def include_ember_stylesheet_tags(name, **options)
26
+ EmberCli[name].build
50
27
 
51
- To learn more, please read:
28
+ assets = EmberCli::Assets.new(EmberCli[name])
52
29
 
53
- * https://github.com/thoughtbot/ember-cli-rails#configuring-the-ember-controller
54
- * https://github.com/thoughtbot/ember-cli-rails/pull/316
55
- MSG
56
- end
57
- end
30
+ assets.stylesheet_assets.
31
+ map { |src| %{<link rel="stylesheet" href="#{src}">}.html_safe }.
32
+ reduce(&:+)
58
33
  end
59
34
  end
@@ -1,4 +1,4 @@
1
- <%= render_ember_app @app do |head| %>
1
+ <%= render_ember_app ember_app do |head| %>
2
2
  <% head.append do %>
3
3
  <%= csrf_meta_tags %>
4
4
  <% end %>
@@ -24,37 +24,31 @@ module EmberCli
24
24
  end
25
25
  end
26
26
 
27
+ def build(name)
28
+ app(name).build
29
+ end
30
+
27
31
  alias_method :[], :app
28
32
 
29
33
  def skip?
30
34
  ENV["SKIP_EMBER"].present?
31
35
  end
32
36
 
33
- def enable!
34
- @enabled ||= begin
35
- Rails.configuration.assets.paths << root.join("assets").to_s
36
- cleanup
37
- true
38
- end
39
- end
40
-
41
37
  def install_dependencies!
42
- enable!
43
38
  each_app(&:install_dependencies)
44
39
  end
45
40
 
46
41
  def test!
47
- enable!
48
42
  each_app(&:test)
49
43
  end
50
44
 
51
45
  def compile!
52
- enable!
46
+ cleanup!
53
47
  each_app(&:compile)
54
48
  end
55
49
 
56
50
  def root
57
- @root ||= tmp.join("ember-cli-#{uid}")
51
+ @root ||= Rails.root.join("tmp", "ember-cli").tap(&:mkpath)
58
52
  end
59
53
 
60
54
  def env
@@ -65,22 +59,8 @@ module EmberCli
65
59
 
66
60
  private
67
61
 
68
- def cleanup
69
- previous_builds.each do |path|
70
- FileUtils.rm_rf(path)
71
- end
72
- end
73
-
74
- def previous_builds
75
- Pathname.glob(tmp.join("ember-cli-*"))
76
- end
77
-
78
- def tmp
79
- Rails.root.join("tmp")
80
- end
81
-
82
- def uid
83
- @uid ||= SecureRandom.uuid
62
+ def cleanup!
63
+ root.children.each { |tmp_file| FileUtils.rm_rf(tmp_file) }
84
64
  end
85
65
 
86
66
  def each_app
data/lib/ember_cli/app.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require "ember_cli/shell"
2
- require "ember_cli/sprockets"
2
+ require "ember_cli/html_page"
3
3
  require "ember_cli/build_monitor"
4
4
 
5
5
  module EmberCli
@@ -33,7 +33,6 @@ module EmberCli
33
33
  prepare
34
34
  @shell.compile
35
35
  @build.check!
36
- copy_index_html_file
37
36
  true
38
37
  end
39
38
  end
@@ -48,6 +47,24 @@ module EmberCli
48
47
  @build.wait!
49
48
  end
50
49
 
50
+ def index_html(head:, body:)
51
+ if index_file.exist?
52
+ html = HtmlPage.new(
53
+ head: head,
54
+ body: body,
55
+ content: index_file.read,
56
+ )
57
+
58
+ html.render
59
+ else
60
+ @build.check!
61
+
62
+ raise BuildError.new <<-MSG
63
+ EmberCLI failed to generate an `index.html` file.
64
+ MSG
65
+ end
66
+ end
67
+
51
68
  def install_dependencies
52
69
  @shell.install
53
70
  end
@@ -58,22 +75,14 @@ module EmberCli
58
75
  @shell.test
59
76
  end
60
77
 
61
- def sprockets
62
- EmberCli::Sprockets.new(self)
63
- end
78
+ private
79
+
80
+ delegate :development?, :test?, to: :env
64
81
 
65
82
  def index_file
66
- if production?
67
- paths.applications.join("#{name}.html")
68
- else
69
- paths.dist.join("index.html")
70
- end
83
+ paths.index_file
71
84
  end
72
85
 
73
- private
74
-
75
- delegate :development?, :production?, :test?, to: :env
76
-
77
86
  def env
78
87
  EmberCli.env
79
88
  end
@@ -81,30 +90,15 @@ module EmberCli
81
90
  def build_and_watch
82
91
  prepare
83
92
  @shell.build_and_watch
84
- copy_index_html_file
85
93
  end
86
94
 
87
95
  def prepare
88
96
  @prepared ||= begin
89
97
  @build.reset
90
- symlink_to_assets_root
91
98
  true
92
99
  end
93
100
  end
94
101
 
95
- def copy_index_html_file
96
- if production?
97
- FileUtils.cp(paths.app_assets.join("index.html"), index_file)
98
- end
99
- end
100
-
101
- def symlink_to_assets_root
102
- paths.app_assets.make_symlink paths.dist
103
- rescue Errno::EEXIST
104
- # Sometimes happens when starting multiple Unicorn workers.
105
- # Ignoring...
106
- end
107
-
108
102
  def excluded_ember_deps
109
103
  Array.wrap(options[:exclude_ember_deps]).join(?,)
110
104
  end
@@ -0,0 +1,64 @@
1
+ require "ember_cli/errors"
2
+
3
+ module EmberCli
4
+ class AssetMap
5
+ def initialize(ember_app_name:, asset_map:)
6
+ @ember_app_name = ember_app_name
7
+ @asset_map = asset_map
8
+ end
9
+
10
+ def javascripts
11
+ assert_asset_map!
12
+
13
+ [
14
+ asset_matching(%r{vendor(.*)\.js\z}),
15
+ asset_matching(%r{#{ember_app_name}(.*)\.js\z}),
16
+ ]
17
+ end
18
+
19
+ def stylesheets
20
+ assert_asset_map!
21
+
22
+ [
23
+ asset_matching(%r{vendor(.*)\.css\z}),
24
+ asset_matching(%r{#{ember_app_name}(.*)\.css\z}),
25
+ ]
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :app_name, :ember_app_name, :asset_map
31
+
32
+ def asset_matching(regex)
33
+ matching_asset = files.detect { |asset| asset =~ regex }
34
+
35
+ if matching_asset.blank?
36
+ raise_missing_asset(regex)
37
+ end
38
+
39
+ prepend + matching_asset
40
+ end
41
+
42
+ def prepend
43
+ asset_map["prepend"].to_s
44
+ end
45
+
46
+ def files
47
+ Array(assets.values)
48
+ end
49
+
50
+ def assets
51
+ asset_map["assets"] || {}
52
+ end
53
+
54
+ def raise_missing_asset(regex)
55
+ raise BuildError.new("Failed to find assets matching `#{regex}`")
56
+ end
57
+
58
+ def assert_asset_map!
59
+ if assets.empty?
60
+ raise BuildError.new("Missing `#{ember_app_name}/assets/assetMap.json`")
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,66 +1,51 @@
1
+ require "ember_cli/errors"
2
+ require "ember_cli/asset_map"
3
+ require "ember_cli/directory_asset_map"
4
+
1
5
  module EmberCli
2
6
  class Assets
3
- def initialize(app_name:, ember_app_name:, manifest:)
4
- @app_name = app_name
5
- @ember_app_name = ember_app_name
6
- @manifest = manifest
7
+ def initialize(app)
8
+ @app = app
7
9
  end
8
10
 
9
- def javascripts
10
- if empty_manifest?
11
- fallback_assets
12
- else
13
- [
14
- latest_matching(%r{#{app_name}/assets/vendor(.*)\.js\z}),
15
- latest_matching(%r{#{app_name}/assets/#{ember_app_name}(.*)\.js\z}),
16
- ]
17
- end
11
+ def javascript_assets
12
+ asset_map.javascripts
18
13
  end
19
14
 
20
- def stylesheets
21
- if empty_manifest?
22
- fallback_assets
23
- else
24
- [
25
- latest_matching(%r{#{app_name}/assets/vendor(.*)\.css\z}),
26
- latest_matching(%r{#{app_name}/assets/#{ember_app_name}(.*)\.css\z}),
27
- ]
28
- end
15
+ def stylesheet_assets
16
+ asset_map.stylesheets
29
17
  end
30
18
 
31
19
  private
32
20
 
33
- attr_reader :app_name, :ember_app_name, :manifest
21
+ attr_reader :app
34
22
 
35
- def fallback_assets
36
- ["#{app_name}/assets/vendor", "#{app_name}/assets/#{ember_app_name}"]
23
+ def asset_map
24
+ AssetMap.new(
25
+ ember_app_name: ember_app_name,
26
+ asset_map: asset_map_hash.to_h,
27
+ )
37
28
  end
38
29
 
39
- def empty_manifest?
40
- files.empty?
30
+ def asset_map_file
31
+ app.paths.asset_map
41
32
  end
42
33
 
43
- def latest_matching(regex)
44
- asset, = assets.detect { |(_, digest)| digest == latest_file_for(regex) }
45
-
46
- asset
47
- end
48
-
49
- def latest_file_for(regex)
50
- file, = files.
51
- select { |key, _| key =~ regex }.
52
- sort_by { |_, data| data["mtime"] }.
53
- last
54
-
55
- file
34
+ def asset_map_hash
35
+ if asset_map_file.present? && asset_map_file.exist?
36
+ JSON.parse(asset_map_file.read)
37
+ else
38
+ DirectoryAssetMap.new(app.paths.assets)
39
+ end
56
40
  end
57
41
 
58
- def assets
59
- manifest.assets
42
+ def ember_app_name
43
+ @ember_app_name ||= app.options.fetch(:name) { package_json.fetch(:name) }
60
44
  end
61
45
 
62
- def files
63
- manifest.files
46
+ def package_json
47
+ @package_json ||=
48
+ JSON.parse(app.paths.package_json_file.read).with_indifferent_access
64
49
  end
65
50
  end
66
51
  end
@@ -14,31 +14,39 @@ module EmberCli
14
14
  end
15
15
 
16
16
  def build(watch: false)
17
+ "#{ember_build(watch: watch)} | #{tee}"
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :options, :paths
23
+
24
+ def process_watcher
25
+ options.fetch(:watcher) { EmberCli.configuration.watcher }
26
+ end
27
+
28
+ def tee
29
+ Cocaine::CommandLine.
30
+ new(paths.tee, "-a :log").
31
+ command(log: paths.log)
32
+ end
33
+
34
+ def ember_build(watch: false)
17
35
  line = Cocaine::CommandLine.new(paths.ember, [
18
36
  "build",
19
37
  ("--watch" if watch),
20
38
  ("--watcher :watcher" if process_watcher),
21
39
  "--environment :environment",
22
40
  "--output-path :output_path",
23
- "2> :error_file",
24
41
  ].compact.join(" "))
25
42
 
26
43
  line.command(
27
44
  environment: build_environment,
28
45
  output_path: paths.dist,
29
46
  watcher: process_watcher,
30
- error_file: paths.build_error_file,
31
47
  )
32
48
  end
33
49
 
34
- private
35
-
36
- attr_reader :options, :paths
37
-
38
- def process_watcher
39
- options.fetch(:watcher) { EmberCli.configuration.watcher }
40
- end
41
-
42
50
  def build_environment
43
51
  if EmberCli.env == "production"
44
52
  "production"