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