ember-cli-rails 0.5.8 → 0.6.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.
@@ -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"