Ortuna / padrino-pipeline

Sprockets for padrino apps
MIT License
21 stars 8 forks source link

Support bootstrap-sass and font-awesome-sass gems (ie. *= require bootstrap in directive) #17

Open wakatara opened 10 years ago

wakatara commented 10 years ago

This can probably be more generalized to apply to anything that would end up in the vendor path, but after working with this for an evening, I'm a little stumped how to get padrino-pipeline (which I'm loving btw, very nice work) to use these two gems, both of which would be extremely nice to use along with the pipelining in padrino -- minimally with sprockets at the very least.

Am I just being dense here or is there a way to get p-p to ingest and use these two things?

(furthermore, I'm assuming there is also no way to pipeline font directory assets either? Looking in the code the asset paths supported seem to be only images, javascripts and stylesheets.).

Ortuna commented 10 years ago

Thanks for the kind words!

I will take a look at this in the next few days. I believe the load paths need to be sync'd up here

leemour commented 10 years ago

+1 For bootstrap-sass support. When using \= require 'bootstrap' in my application.js I get:

Sprockets::FileNotFound at /
couldn't find file 'bootstrap' (in .../app/assets/js/application.js:1)

Is there an easy fix for adding bootstrap-sass path to pipeline?

Ortuna commented 10 years ago

Hey guys I did some work on this today. The gem should now support basic external sprocket configurations. But alot of these external gems are doing things differently from each other :frowning:. But I did add an example here on how to use paths from here. It does require some digging into code, but not too much. Let me know if this is acceptable.

leemour commented 10 years ago

That works, thanks a lot!

pdf commented 10 years ago

Here's my ugliness for dealing with this so I can use rails-assets:

    configure_assets do |assets|
      assets.pipeline = Padrino::Pipeline::Sprockets
      assets.js_assets = [assets.js_assets] unless assets.js_assets.is_a?(Array)
      assets.css_assets = [assets.css_assets] unless assets.css_assets.is_a?(Array)
      assets.image_assets = [assets.image_assets] unless assets.image_assets.is_a?(Array)

      # Load assets from gems
      $:.each do |path|
        assets_base = File.join(path, '..', 'vendor', 'assets')
        %w{javascripts stylesheets images}.each do |type|
          dir = File.join(assets_base, type)
          if File.directory?(dir)
            case type
            when 'javascripts'
              assets.js_assets << dir
            when 'stylesheets'
              assets.css_assets << dir
            when 'images'
              assets.image_assets << dir
            end
          end
        end
      end
    end

But with bootstrap-sass, now my app is exploding because of #22

Ortuna commented 10 years ago

@pdf, Would it possible to do a PR with your fix? Also, do you have the output of your bootstrap-sass app that explodes? Thanks!

pdf commented 10 years ago

@Ortuna, I don't know that this is an optimal fix generally, but it will work with any gem that puts assets in gem_dir/vendor/assets/{javascript|stylesheets|images}. If you think that's good enough, I can submit a PR for it.

Here's the output from the sass font failure (actually from rails-assets-bootstrap, not bootstrap-sass):

  FATAL -  Sprockets::NotImplementedError - Custom asset_path helper is not implemented

Extend your environment context with a custom method.

    environment.context_class.class_eval do
      def asset_path(path, options = {})
      end
    end

  (in /storage/workspace/lifxfx/app/assets/stylesheets/bootstrap_and_overrides.css.scss):
  sprockets (2.12.0) lib/sprockets/context.rb:241:in `asset_path'
  sprockets (2.12.0) lib/sprockets/context.rb:261:in `font_path'
  sprockets (2.12.0) lib/sprockets/sass_functions.rb:42:in `font_url'
  sass (3.3.4) lib/sass/script/tree/funcall.rb:140:in `_perform'
  sass (3.3.4) lib/sass/script/tree/node.rb:50:in `perform'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:366:in `visit_prop'
  sass (3.3.4) lib/sass/tree/visitors/base.rb:36:in `visit'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:152:in `block in visit'
  sass (3.3.4) lib/sass/stack.rb:79:in `block in with_base'
  sass (3.3.4) lib/sass/stack.rb:121:in `with_frame'
  sass (3.3.4) lib/sass/stack.rb:79:in `with_base'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:152:in `visit'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:470:in `block (2 levels) in visit_directive'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:470:in `block in visit_directive'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:173:in `with_environment'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:469:in `visit_directive'
  sass (3.3.4) lib/sass/tree/visitors/base.rb:36:in `visit'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:152:in `block in visit'
  sass (3.3.4) lib/sass/stack.rb:79:in `block in with_base'
  sass (3.3.4) lib/sass/stack.rb:121:in `with_frame'
  sass (3.3.4) lib/sass/stack.rb:79:in `with_base'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:152:in `visit'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:297:in `block (2 levels) in visit_import'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:297:in `block in visit_import'
  sass (3.3.4) lib/sass/stack.rb:88:in `block in with_import'
  sass (3.3.4) lib/sass/stack.rb:121:in `with_frame'
  sass (3.3.4) lib/sass/stack.rb:88:in `with_import'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:294:in `visit_import'
  sass (3.3.4) lib/sass/tree/visitors/base.rb:36:in `visit'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:152:in `block in visit'
  sass (3.3.4) lib/sass/stack.rb:79:in `block in with_base'
  sass (3.3.4) lib/sass/stack.rb:121:in `with_frame'
  sass (3.3.4) lib/sass/stack.rb:79:in `with_base'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:152:in `visit'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:297:in `block (2 levels) in visit_import'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:297:in `block in visit_import'
  sass (3.3.4) lib/sass/stack.rb:88:in `block in with_import'
  sass (3.3.4) lib/sass/stack.rb:121:in `with_frame'
  sass (3.3.4) lib/sass/stack.rb:88:in `with_import'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:294:in `visit_import'
  sass (3.3.4) lib/sass/tree/visitors/base.rb:36:in `visit'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:152:in `block in visit'
  sass (3.3.4) lib/sass/stack.rb:79:in `block in with_base'
  sass (3.3.4) lib/sass/stack.rb:121:in `with_frame'
  sass (3.3.4) lib/sass/stack.rb:79:in `with_base'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:152:in `visit'
  sass (3.3.4) lib/sass/tree/visitors/base.rb:52:in `block in visit_children'
  sass (3.3.4) lib/sass/tree/visitors/base.rb:52:in `visit_children'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:161:in `block in visit_children'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:173:in `with_environment'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:160:in `visit_children'
  sass (3.3.4) lib/sass/tree/visitors/base.rb:36:in `block in visit'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:180:in `visit_root'
  sass (3.3.4) lib/sass/tree/visitors/base.rb:36:in `visit'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:151:in `visit'
  sass (3.3.4) lib/sass/tree/visitors/perform.rb:8:in `visit'
  sass (3.3.4) lib/sass/tree/root_node.rb:36:in `css_tree'
  sass (3.3.4) lib/sass/tree/root_node.rb:20:in `render'
  sass (3.3.4) lib/sass/engine.rb:274:in `render'
  sprockets (2.12.0) lib/sprockets/sass_template.rb:53:in `evaluate'
  tilt (1.4.1) lib/tilt/template.rb:103:in `render'
  sprockets (2.12.0) lib/sprockets/context.rb:197:in `block in evaluate'
  sprockets (2.12.0) lib/sprockets/context.rb:194:in `evaluate'
  sprockets (2.12.0) lib/sprockets/processed_asset.rb:12:in `initialize'
  sprockets (2.12.0) lib/sprockets/base.rb:374:in `block in build_asset'
  sprockets (2.12.0) lib/sprockets/base.rb:395:in `circular_call_protection'
  sprockets (2.12.0) lib/sprockets/base.rb:373:in `build_asset'
  sprockets (2.12.0) lib/sprockets/index.rb:94:in `block in build_asset'
  sprockets (2.12.0) lib/sprockets/caching.rb:51:in `cache_asset'
  sprockets (2.12.0) lib/sprockets/index.rb:93:in `build_asset'
  sprockets (2.12.0) lib/sprockets/base.rb:287:in `find_asset'
  sprockets (2.12.0) lib/sprockets/index.rb:61:in `find_asset'
  sprockets (2.12.0) lib/sprockets/processed_asset.rb:111:in `block in resolve_dependencies'
  sprockets (2.12.0) lib/sprockets/processed_asset.rb:105:in `resolve_dependencies'
  sprockets (2.12.0) lib/sprockets/processed_asset.rb:97:in `build_required_assets'
  sprockets (2.12.0) lib/sprockets/processed_asset.rb:16:in `initialize'
  sprockets (2.12.0) lib/sprockets/base.rb:374:in `block in build_asset'
  sprockets (2.12.0) lib/sprockets/base.rb:395:in `circular_call_protection'
  sprockets (2.12.0) lib/sprockets/base.rb:373:in `build_asset'
  sprockets (2.12.0) lib/sprockets/index.rb:94:in `block in build_asset'
  sprockets (2.12.0) lib/sprockets/caching.rb:51:in `cache_asset'
  sprockets (2.12.0) lib/sprockets/index.rb:93:in `build_asset'
  sprockets (2.12.0) lib/sprockets/base.rb:287:in `find_asset'
  sprockets (2.12.0) lib/sprockets/index.rb:61:in `find_asset'
  sprockets (2.12.0) lib/sprockets/bundled_asset.rb:16:in `initialize'
  sprockets (2.12.0) lib/sprockets/base.rb:377:in `build_asset'
  sprockets (2.12.0) lib/sprockets/index.rb:94:in `block in build_asset'
  sprockets (2.12.0) lib/sprockets/caching.rb:51:in `cache_asset'
  sprockets (2.12.0) lib/sprockets/index.rb:93:in `build_asset'
  sprockets (2.12.0) lib/sprockets/base.rb:287:in `find_asset'
  sprockets (2.12.0) lib/sprockets/index.rb:61:in `find_asset'
  sprockets (2.12.0) lib/sprockets/environment.rb:75:in `find_asset'
  sprockets (2.12.0) lib/sprockets/base.rb:295:in `[]'
  padrino-pipeline (0.4.0) lib/padrino-pipeline/pipelines/sprockets.rb:64:in `block in mount_assets'
  padrino-core (0.12.0) lib/padrino-core/application/routing.rb:698:in `block in route'
  padrino-core (0.12.0) lib/padrino-core/application/routing.rb:62:in `block (3 levels) in process_destination_path'
  sinatra (1.4.4) lib/sinatra/base.rb:976:in `route_eval'
  padrino-core (0.12.0) lib/padrino-core/application/routing.rb:62:in `block (2 levels) in process_destination_path'
  padrino-core (0.12.0) lib/padrino-core/application/routing.rb:62:in `block in process_destination_path'
  padrino-core (0.12.0) lib/padrino-core/application/routing.rb:37:in `process_destination_path'
  (eval):93:in `block in call'
  (eval):82:in `call'
<snipped remaining stack>

I can probably hack around that by:

assets.context_class.class_eval do
  def asset_path(path, options = {})
    "/assets/#{path}"
  end
end

or something, but I haven't had time to test this properly.

Ortuna commented 10 years ago

@pdf I'm wondering if it's a load order issue? Because I a variation of the code here