diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3dc9771e..6765151c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,14 @@
master
------
+* Extract `include_ember_*_tags` and the associated code to the
+ `ember-cli-rails-assets` gem. Add `ember-cli-rails-assets` as a dependency.
+ [#363]
* Introduce `mount_ember_assets` to serve Ember assets in asset-helper style
projects.
+[#363]: https://github.com/thoughtbot/ember-cli-rails/pull/363
+
0.6.0
-----
diff --git a/app/helpers/ember_rails_helper.rb b/app/helpers/ember_rails_helper.rb
index f63733d5..ec103480 100644
--- a/app/helpers/ember_rails_helper.rb
+++ b/app/helpers/ember_rails_helper.rb
@@ -1,5 +1,4 @@
require "html_page/capture"
-require "ember_cli/assets"
module EmberRailsHelper
def render_ember_app(name, &block)
@@ -11,24 +10,4 @@ def render_ember_app(name, &block)
render inline: EmberCli[name].index_html(head: head, body: body)
end
-
- def include_ember_script_tags(name, **options)
- EmberCli[name].build
-
- assets = EmberCli::Assets.new(EmberCli[name])
-
- assets.javascript_assets.
- map { |src| %{}.html_safe }.
- reduce(&:+)
- end
-
- def include_ember_stylesheet_tags(name, **options)
- EmberCli[name].build
-
- assets = EmberCli::Assets.new(EmberCli[name])
-
- assets.stylesheet_assets.
- map { |src| %{}.html_safe }.
- reduce(&:+)
- end
end
diff --git a/ember-cli-rails.gemspec b/ember-cli-rails.gemspec
index 17164abd..68c95f7c 100644
--- a/ember-cli-rails.gemspec
+++ b/ember-cli-rails.gemspec
@@ -15,6 +15,7 @@ Gem::Specification.new do |spec|
spec.required_ruby_version = ">= 2.1.0"
+ spec.add_dependency "ember-cli-rails-assets", ">= 0.6.1"
spec.add_dependency "railties", ">= 3.2", "< 5"
spec.add_dependency "cocaine", "~> 0.5.8"
spec.add_dependency "html_page", "~> 0.1.0"
diff --git a/lib/ember-cli-rails.rb b/lib/ember-cli-rails.rb
index f9d1e02f..53c8e55c 100644
--- a/lib/ember-cli-rails.rb
+++ b/lib/ember-cli-rails.rb
@@ -1,5 +1,6 @@
require "fileutils"
-require "ember_cli/engine" if defined?(Rails)
+require "ember_cli/engine"
+require "ember-cli-rails-assets"
require "ember_cli/errors"
module EmberCli
diff --git a/lib/ember_cli/app.rb b/lib/ember_cli/app.rb
index 065c5258..965d3de7 100644
--- a/lib/ember_cli/app.rb
+++ b/lib/ember_cli/app.rb
@@ -24,10 +24,14 @@ def initialize(name, **options)
@build = BuildMonitor.new(name, @paths)
end
- def root
+ def root_path
paths.root
end
+ def dist_path
+ paths.dist
+ end
+
def compile
@compiled ||= begin
prepare
diff --git a/lib/ember_cli/asset_map.rb b/lib/ember_cli/asset_map.rb
deleted file mode 100644
index d9209bb1..00000000
--- a/lib/ember_cli/asset_map.rb
+++ /dev/null
@@ -1,64 +0,0 @@
-require "ember_cli/errors"
-
-module EmberCli
- class AssetMap
- def initialize(ember_app_name:, asset_map:)
- @ember_app_name = ember_app_name
- @asset_map = asset_map
- end
-
- def javascripts
- assert_asset_map!
-
- [
- asset_matching(%r{vendor(.*)\.js\z}),
- asset_matching(%r{#{ember_app_name}(.*)\.js\z}),
- ]
- end
-
- def stylesheets
- assert_asset_map!
-
- [
- asset_matching(%r{vendor(.*)\.css\z}),
- asset_matching(%r{#{ember_app_name}(.*)\.css\z}),
- ]
- end
-
- private
-
- attr_reader :app_name, :ember_app_name, :asset_map
-
- def asset_matching(regex)
- matching_asset = files.detect { |asset| asset =~ regex }
-
- if matching_asset.blank?
- raise_missing_asset(regex)
- end
-
- prepend + matching_asset
- end
-
- def prepend
- asset_map["prepend"].to_s
- end
-
- def files
- Array(assets.values)
- end
-
- def assets
- asset_map["assets"] || {}
- end
-
- def raise_missing_asset(regex)
- raise BuildError.new("Failed to find assets matching `#{regex}`")
- end
-
- def assert_asset_map!
- if assets.empty?
- raise BuildError.new("Missing `#{ember_app_name}/assets/assetMap.json`")
- end
- end
- end
-end
diff --git a/lib/ember_cli/assets.rb b/lib/ember_cli/assets.rb
deleted file mode 100644
index d571715b..00000000
--- a/lib/ember_cli/assets.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-require "ember_cli/errors"
-require "ember_cli/asset_map"
-require "ember_cli/directory_asset_map"
-
-module EmberCli
- class Assets
- def initialize(app)
- @app = app
- end
-
- def javascript_assets
- asset_map.javascripts
- end
-
- def stylesheet_assets
- asset_map.stylesheets
- end
-
- private
-
- attr_reader :app
-
- def asset_map
- AssetMap.new(
- ember_app_name: ember_app_name,
- asset_map: asset_map_hash.to_h,
- )
- end
-
- def asset_map_file
- app.paths.asset_map
- end
-
- def asset_map_hash
- if asset_map_file.present? && asset_map_file.exist?
- JSON.parse(asset_map_file.read)
- else
- DirectoryAssetMap.new(app.paths.assets)
- end
- end
-
- def ember_app_name
- @ember_app_name ||= app.options.fetch(:name) { package_json.fetch(:name) }
- end
-
- def package_json
- @package_json ||=
- JSON.parse(app.paths.package_json_file.read).with_indifferent_access
- end
- end
-end
diff --git a/lib/ember_cli/directory_asset_map.rb b/lib/ember_cli/directory_asset_map.rb
deleted file mode 100644
index 8a9c5d93..00000000
--- a/lib/ember_cli/directory_asset_map.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-module EmberCli
- class DirectoryAssetMap
- def initialize(directory)
- @directory = Pathname(directory)
- end
-
- def to_h
- {
- "assets" => files_with_data,
- "prepend" => "assets/",
- }
- end
-
- def files_with_data
- files.reduce({}) do |manifest, file|
- name = File.basename(file.path)
-
- manifest[name] = name
-
- manifest
- end
- end
-
- private
-
- def files
- @directory.children.map { |path| File.new(path) }
- end
- end
-end
diff --git a/lib/ember_cli/path_set.rb b/lib/ember_cli/path_set.rb
index b77f6c9f..f85c60fa 100644
--- a/lib/ember_cli/path_set.rb
+++ b/lib/ember_cli/path_set.rb
@@ -34,22 +34,10 @@ def dist
@dist ||= ember_cli_root.join("apps", app_name).tap(&:mkpath)
end
- def asset_map
- @asset_map ||= Pathname.glob(assets.join("assetMap*.json")).first
- end
-
- def assets
- @assets ||= dist.join("assets").tap(&:mkpath)
- end
-
def gemfile
@gemfile ||= root.join("Gemfile")
end
- def package_json_file
- @package_json_file ||= root.join("package.json")
- end
-
def ember
@ember ||= begin
root.join("node_modules", ".bin", "ember").tap do |path|
diff --git a/lib/ember_cli/route_helpers.rb b/lib/ember_cli/route_helpers.rb
index 18e4db77..f20f8639 100644
--- a/lib/ember_cli/route_helpers.rb
+++ b/lib/ember_cli/route_helpers.rb
@@ -3,12 +3,6 @@
module ActionDispatch
module Routing
class Mapper
- def mount_ember_assets(app_name, to: "/")
- dist_directory = EmberCli[app_name].paths.dist
-
- mount Rack::File.new(dist_directory.to_s) => to
- end
-
def mount_ember_app(app_name, to:, **options)
routing_options = options.deep_merge(
defaults: { ember_app: app_name },
@@ -25,7 +19,9 @@ def mount_ember_app(app_name, to:, **options)
get("#{to}(*rest)", routing_options)
end
- mount_ember_assets app_name, to: to
+ dist_directory = EmberCli[app_name].paths.dist
+
+ mount Rack::File.new(dist_directory.to_s) => to
end
end
end
diff --git a/lib/generators/ember/heroku/heroku_generator.rb b/lib/generators/ember/heroku/heroku_generator.rb
index 66fc59fd..8148dc39 100644
--- a/lib/generators/ember/heroku/heroku_generator.rb
+++ b/lib/generators/ember/heroku/heroku_generator.rb
@@ -19,7 +19,7 @@ def inject_12factor_gem
def app_paths
EmberCli.apps.values.map do |app|
- app.root.relative_path_from(Rails.root)
+ app.root_path.relative_path_from(Rails.root)
end
end
end
diff --git a/spec/lib/ember_cli/app_spec.rb b/spec/lib/ember_cli/app_spec.rb
index a3094af6..de094834 100644
--- a/spec/lib/ember_cli/app_spec.rb
+++ b/spec/lib/ember_cli/app_spec.rb
@@ -17,17 +17,33 @@
end
end
- describe "#root" do
+ describe "#root_path" do
it "delegates to PathSet" do
root_path = Pathname(".")
- allow_any_instance_of(EmberCli::PathSet).
- to receive(:root).
- and_return(root_path)
+ stub_paths(root: root_path)
app = EmberCli::App.new("foo")
- root = app.root
+ root_path = app.root_path
- expect(root).to eq root_path
+ expect(root_path).to eq root_path
end
end
+
+ describe "#dist_path" do
+ it "delegates to PathSet" do
+ dist_path = Pathname(".")
+ stub_paths(dist: dist_path)
+ app = EmberCli::App.new("foo")
+
+ dist_path = app.dist_path
+
+ expect(dist_path).to eq dist_path
+ end
+ end
+
+ def stub_paths(method_to_value)
+ allow_any_instance_of(EmberCli::PathSet).
+ to receive(method_to_value.keys.first).
+ and_return(method_to_value.values.first)
+ end
end
diff --git a/spec/lib/ember_cli/asset_map_spec.rb b/spec/lib/ember_cli/asset_map_spec.rb
deleted file mode 100644
index 3aa073c4..00000000
--- a/spec/lib/ember_cli/asset_map_spec.rb
+++ /dev/null
@@ -1,77 +0,0 @@
-require "ember_cli/asset_map"
-
-describe EmberCli::AssetMap do
- describe "#javascripts" do
- it "includes the most recent javascript build artifacts" do
- asset_map = {
- "assets" => {
- "not-a-match" => {},
- "bar.js" => "bar-abc123.js",
- "vendor.js" => "vendor-abc123.js",
- },
- "prepend" => "foo/",
- }
- assets = build_assets(
- ember_app_name: "bar",
- asset_map: asset_map,
- )
-
- javascripts = assets.javascripts
-
- expect(javascripts).to match_array([
- "foo/bar-abc123.js",
- "foo/vendor-abc123.js",
- ])
- end
-
- context "when the asset_map is empty" do
- it "raises a BuildError" do
- assets = build_assets(
- asset_map: {},
- ember_app_name: "bar",
- )
-
- expect { assets.javascripts }.to raise_error(EmberCli::BuildError)
- end
- end
- end
-
- describe "#stylesheets" do
- it "includes the most recent stylesheet build artifacts" do
- asset_map = {
- "assets" => {
- "not-a-match" => {},
- "bar.css" => "bar-abc123.css",
- "vendor.css" => "vendor-abc123.css",
- },
- "prepend" => "foo/",
- }
- assets = build_assets(
- ember_app_name: "bar",
- asset_map: asset_map,
- )
-
- stylesheets = assets.stylesheets
-
- expect(stylesheets).to match_array([
- "foo/bar-abc123.css",
- "foo/vendor-abc123.css",
- ])
- end
-
- context "when the asset_map is empty" do
- it "raises a BuildError" do
- assets = build_assets(
- asset_map: {},
- ember_app_name: "bar",
- )
-
- expect { assets.stylesheets }.to raise_error(EmberCli::BuildError)
- end
- end
- end
-end
-
-def build_assets(asset_map: {}, **options)
- EmberCli::AssetMap.new(options.merge(asset_map: asset_map))
-end
diff --git a/spec/lib/ember_cli/directory_asset_map_spec.rb b/spec/lib/ember_cli/directory_asset_map_spec.rb
deleted file mode 100644
index 290b178d..00000000
--- a/spec/lib/ember_cli/directory_asset_map_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-require "tmpdir"
-require "fileutils"
-require "ember_cli/directory_asset_map"
-
-describe EmberCli::DirectoryAssetMap do
- describe "#to_h" do
- it "represents the directory" do
- create_file("first")
- create_file("second")
- create_file("third")
-
- directory_manifest = EmberCli::DirectoryAssetMap.new(directory).to_h
-
- expect(directory_manifest["prepend"]).to eq("assets/")
- expect(directory_manifest["assets"]).to match a_hash_including(
- "first" => "first",
- "second" => "second",
- "third" => "third",
- )
- end
- end
-
- def create_file(name)
- path = directory.join(name)
-
- FileUtils.touch(path)
-
- File.new(path)
- end
-
- def directory
- @directory ||= Pathname(Dir.mktmpdir)
- end
-end
diff --git a/spec/lib/ember_cli/path_set_spec.rb b/spec/lib/ember_cli/path_set_spec.rb
index d0265426..292a962f 100644
--- a/spec/lib/ember_cli/path_set_spec.rb
+++ b/spec/lib/ember_cli/path_set_spec.rb
@@ -63,29 +63,6 @@
end
end
- describe "#asset_map" do
- it "globs the dist directory for a asset_map.json" do
- app = build_app(name: "foo")
- path_set = build_path_set(app: app)
- asset_map_file = path_set.dist.join("assets", "assetMap-abc123.json")
-
- create_file(asset_map_file)
-
- expect(path_set.asset_map).to exist
- expect(path_set.asset_map).to eq(asset_map_file)
- end
- end
-
- describe "#assets" do
- it "is a child of #dist" do
- app = build_app(name: "foo")
- path_set = build_path_set(app: app)
-
- expect(path_set.assets).to exist
- expect(path_set.assets).to eq ember_cli_root.join("apps", "foo", "assets")
- end
- end
-
describe "#gemfile" do
it "is a child of #root" do
app = build_app(name: "foo")
@@ -96,15 +73,6 @@
end
end
- describe "#package_json_file" do
- it "is a child of #root" do
- path_set = build_path_set
-
- expect(path_set.package_json_file)
- .to eq path_set.root.join("package.json")
- end
- end
-
describe "#lockfile" do
it "is a child of #tmp" do
path_set = build_path_set