From ce3336ebd0eaca61c3d63d3f7692e3acaeacb200 Mon Sep 17 00:00:00 2001 From: Sean Doyle Date: Sat, 7 Nov 2015 15:13:21 -0500 Subject: [PATCH] Defer to EmberCLI build pipeline Closes [#30]. Depends on [rondale-sc/ember-cli-rails-addon#17][#17]. * Symlink `dist/` directly to Asset Pipeline * Deletes `EmberCli::AssetResolver` * Improve `bin/setup`, resolve errors. [#30]: https://github.com/thoughtbot/ember-cli-rails/issues/30 [#17]: https://github.com/rondale-sc/ember-cli-rails-addon/pull/17 --- CHANGELOG.md | 7 +++ bin/bundle | 3 - bin/setup | 10 +--- bin/setup_ember | 11 ++++ ember-cli-rails.gemspec | 1 + lib/ember-cli/app.rb | 19 +++--- lib/ember-cli/asset_resolver.rb | 54 ----------------- lib/ember-cli/html_page.rb | 23 +++----- spec/ember-cli/asset_resolver_spec.rb | 65 --------------------- spec/ember-cli/html_page_spec.rb | 13 ----- spec/features/user_views_ember_app_spec.rb | 6 ++ spec/fixtures/logo.png | Bin 0 -> 23905 bytes 12 files changed, 44 insertions(+), 168 deletions(-) delete mode 100755 bin/bundle create mode 100755 bin/setup_ember delete mode 100644 lib/ember-cli/asset_resolver.rb delete mode 100644 spec/ember-cli/asset_resolver_spec.rb create mode 100644 spec/fixtures/logo.png diff --git a/CHANGELOG.md b/CHANGELOG.md index a611f5fc..e11eb0c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ master ------ +* Symlink `dist/` directly to Asset Pipeline [#250] +* Merge EmberCLI-generated `manifest.json` into Sprocket's [#250] +* `manifest.json`. Since we now defer to EmberCLI, we no longer need to + manually resolve asset URLs. [#250] + +[#250]: https://github.com/thoughtbot/ember-cli-rails/pull/250 + 0.4.3 ----- diff --git a/bin/bundle b/bin/bundle deleted file mode 100755 index 66e9889e..00000000 --- a/bin/bundle +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) -load Gem.bin_path('bundler', 'bundle') diff --git a/bin/setup b/bin/setup index c289953f..faa24eb8 100755 --- a/bin/setup +++ b/bin/setup @@ -1,11 +1,7 @@ -#!/usr/bin/env bash +#!/bin/sh set -e -function makeEmberAppAcceptAllRoutes() { - sed -i -e 's/auto/hash/' spec/dummy/my-app/config/environment.js -} - # Set up Ruby dependencies via Bundler gem install bundler --conservative bundle check || bundle install @@ -20,13 +16,13 @@ fi if ! [ -d spec/dummy/my-app ]; then git clone https://github.com/kellyselden/ember-cli-output.git spec/dummy/my-app - makeEmberAppAcceptAllRoutes + bin/setup_ember fi root="$(pwd)" cd ${root}/spec/dummy/my-app && - npm install --save-dev ember-cli-rails-addon && + npm install --save-dev ember-cli-rails-addon@rondale-sc/ember-cli-rails-addon bower install cd ${root}/spec/dummy && bundle exec rake ember:install diff --git a/bin/setup_ember b/bin/setup_ember new file mode 100755 index 00000000..02692aed --- /dev/null +++ b/bin/setup_ember @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +# make router catchall routes +sed -i -e 's/auto/hash/' spec/dummy/my-app/config/environment.js + +# add an image to a template +echo '' >> spec/dummy/my-app/app/templates/application.hbs +mkdir -p spec/dummy/my-app/public/assets +cp spec/fixtures/logo.png spec/dummy/my-app/public/assets diff --git a/ember-cli-rails.gemspec b/ember-cli-rails.gemspec index 569bafaf..11d7f991 100644 --- a/ember-cli-rails.gemspec +++ b/ember-cli-rails.gemspec @@ -13,5 +13,6 @@ Gem::Specification.new do |spec| spec.required_ruby_version = ">= 2.1.0" spec.add_dependency "railties", ">= 3.2", "< 5" + spec.add_dependency "non-stupid-digest-assets", "~> 1.0.0" spec.add_dependency "sprockets", ">= 2.0" end diff --git a/lib/ember-cli/app.rb b/lib/ember-cli/app.rb index 00197a8b..d505058a 100644 --- a/lib/ember-cli/app.rb +++ b/lib/ember-cli/app.rb @@ -1,6 +1,6 @@ require "timeout" +require "non-stupid-digest-assets" require "ember-cli/html_page" -require "ember-cli/asset_resolver" module EmberCli class App @@ -76,12 +76,7 @@ def stop end def index_html(sprockets:, head:, body:) - asset_resolver = AssetResolver.new( - app: self, - sprockets: sprockets, - ) html_page = HtmlPage.new( - asset_resolver: asset_resolver, content: index_file.read, head: head, body: body, @@ -96,11 +91,11 @@ def exposed_js_assets alias exposed_css_assets exposed_js_assets def vendor_assets - "#{name}/vendor" + "#{name}/assets/vendor" end def application_assets - "#{name}/#{ember_app_name}" + "#{name}/assets/#{ember_app_name}" end def wait @@ -268,14 +263,17 @@ def index_file end def symlink_to_assets_root - assets_path.make_symlink dist_path.join("assets") + assets_path.make_symlink dist_path rescue Errno::EEXIST # Sometimes happens when starting multiple Unicorn workers. # Ignoring... end def add_assets_to_precompile_list - Rails.configuration.assets.precompile << /\A#{name}\// + assets = %r{\A#{name}/} + + Rails.configuration.assets.precompile << assets + NonStupidDigestAssets.whitelist << assets end def command(watch: false) @@ -342,7 +340,6 @@ def excluded_ember_deps def env_hash ENV.to_h.tap do |vars| vars["RAILS_ENV"] = Rails.env - vars["DISABLE_FINGERPRINTING"] = "true" vars["EXCLUDE_EMBER_ASSETS"] = excluded_ember_deps vars["BUNDLE_GEMFILE"] = gemfile_path.to_s if gemfile_path.exist? end diff --git a/lib/ember-cli/asset_resolver.rb b/lib/ember-cli/asset_resolver.rb deleted file mode 100644 index e913861a..00000000 --- a/lib/ember-cli/asset_resolver.rb +++ /dev/null @@ -1,54 +0,0 @@ -module EmberCli - class AssetResolver - def initialize(app:, sprockets:) - @app = app - @sprockets = sprockets - end - - def resolve_urls(html_content) - mappings.reduce(html_content) do |resolved_content, (asset, new_path)| - resolved_content.gsub(%{"assets/#{asset}"}, %{"#{new_path}"}) - end - end - - private - - def mappings - { - "#{name}.js" => application.js, - "#{name}.css" => application.css, - "vendor.js" => vendor.js, - "vendor.css" => vendor.css, - } - end - - def name - @app.name - end - - def application - AssetPath.new(@sprockets, @app.application_assets) - end - - def vendor - AssetPath.new(@sprockets, @app.vendor_assets) - end - - class AssetPath - def initialize(sprockets, assets) - @sprockets = sprockets - @assets = assets - end - - def js - @sprockets.asset_path(@assets, type: :javascript) - end - - def css - @sprockets.asset_path(@assets, type: :stylesheet) - end - end - - private_constant :AssetPath - end -end diff --git a/lib/ember-cli/html_page.rb b/lib/ember-cli/html_page.rb index 597d2266..9f57a7a1 100644 --- a/lib/ember-cli/html_page.rb +++ b/lib/ember-cli/html_page.rb @@ -1,8 +1,7 @@ module EmberCli class HtmlPage - def initialize(content:, asset_resolver:, head: "", body: "") + def initialize(content:, head: "", body: "") @content = content - @asset_resolver = asset_resolver @head = head @body = body end @@ -16,11 +15,13 @@ def render insert_body_content end - html + content end private + attr_reader :content + def has_head_tag? head_tag_index >= 0 end @@ -30,27 +31,19 @@ def has_body_tag? end def insert_head_content - html.insert(head_tag_index, @head.to_s) + content.insert(head_tag_index, @head.to_s) end def insert_body_content - html.insert(body_tag_index, @body.to_s) - end - - def html - @html ||= resolved_html + content.insert(body_tag_index, @body.to_s) end def head_tag_index - html.index("}, - %{}, - %{}, - %{}, - %{}, - %{}, - %{}, - %{}, - ] - end - end - end - - def html_content - <<-HTML - - - - - - - - - HTML - end - - class SprocketsMock - def asset_path(routes, type: :javascript) - [routes.join("/"), extension_for(type)].join(".") - end - alias :vendor_path :asset_path - - private - - def extension_for(type) - if type == :javascript - "js" - else - "css" - end - end - end -end diff --git a/spec/ember-cli/html_page_spec.rb b/spec/ember-cli/html_page_spec.rb index de5b16d7..263d6575 100644 --- a/spec/ember-cli/html_page_spec.rb +++ b/spec/ember-cli/html_page_spec.rb @@ -4,7 +4,6 @@ it "injects into the " do content = valid_content html_page = EmberCli::HtmlPage.new( - asset_resolver: build_asset_resolver(content), content: content, head: "injected!", ) @@ -21,7 +20,6 @@ it "injects into the " do content = valid_content html_page = EmberCli::HtmlPage.new( - asset_resolver: build_asset_resolver(content), content: content, body: "injected!", ) @@ -38,7 +36,6 @@ it "does nothing" do content = "" html_page = EmberCli::HtmlPage.new( - asset_resolver: build_asset_resolver(content), content: content, head: "injected!", body: "injected!", @@ -50,16 +47,6 @@ end end - def build_asset_resolver(content) - resolver = double("EmberCli::AssetResolver") - allow(resolver). - to receive(:resolve_urls). - with(content). - and_return(content) - - resolver - end - def valid_content "

" end diff --git a/spec/features/user_views_ember_app_spec.rb b/spec/features/user_views_ember_app_spec.rb index 5bfdec10..cafeb8a2 100644 --- a/spec/features/user_views_ember_app_spec.rb +++ b/spec/features/user_views_ember_app_spec.rb @@ -2,12 +2,14 @@ scenario "with asset helpers" do visit page_path("embedded") + expect(page).to have_client_side_asset expect(page).to have_javascript_rendered_text end scenario "with index helper" do visit page_path("include_index") + expect(page).to have_client_side_asset expect(page).to have_javascript_rendered_text expect(page).to have_no_csrf_tags @@ -23,6 +25,10 @@ expect(page).to have_rails_injected_text end + def have_client_side_asset + have_css %{img[src*="logo.png"]} + end + def have_rails_injected_text have_text "Hello from Rails" end diff --git a/spec/fixtures/logo.png b/spec/fixtures/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf2621afe4f7ac494fce332f2f8eae4b0179647 GIT binary patch literal 23905 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 A_y7O^ literal 0 HcmV?d00001