README.md in hanami-assets-0.0.0 vs README.md in hanami-assets-0.2.0

- old
+ new

@@ -1,36 +1,453 @@ # Hanami::Assets -Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/hanami/assets`. To experiment with that code, run `bin/console` for an interactive prompt. +Assets management for Ruby web projects -TODO: Delete this and the text above, and describe your gem +## Status +[![Gem Version](http://img.shields.io/gem/v/hanami-assets.svg)](https://badge.fury.io/rb/hanami-assets) +[![Build Status](http://img.shields.io/travis/hanami/assets/master.svg)](https://travis-ci.org/hanami/assets?branch=master) +[![Coverage](http://img.shields.io/coveralls/hanami/assets/master.svg)](https://coveralls.io/r/hanami/assets) +[![Code Climate](http://img.shields.io/codeclimate/github/hanami/assets.svg)](https://codeclimate.com/github/hanami/assets) +[![Dependencies](http://img.shields.io/gemnasium/hanami/assets.svg)](https://gemnasium.com/hanami/assets) +[![Inline Docs](http://inch-ci.org/github/hanami/assets.svg)](http://inch-ci.org/github/hanami/assets) + +## Contact + +* Home page: http://hanamirb.org +* Community: http://hanamirb.org/community +* Guides: http://hanamirb.org/guides +* Mailing List: http://hanamirb.org/mailing-list +* API Doc: http://rdoc.info/gems/hanami-assets +* Bugs/Issues: https://github.com/hanami/assets/issues +* Support: http://stackoverflow.com/questions/tagged/hanami +* Forum: https://discuss.hanamirb.org +* Chat: http://chat.hanamirb.org + +## Rubies + +__Hanami::Assets__ supports Ruby (MRI) 2.2+ + ## Installation Add this line to your application's Gemfile: ```ruby gem 'hanami-assets' ``` And then execute: - $ bundle +```shell +$ bundle +``` Or install it yourself as: - $ gem install hanami-assets +```shell +$ gem install hanami-assets +``` ## Usage -TODO: Write usage instructions here +### Helpers -## Development +The framework offers assets specific helpers to be used in templates. +They resolve one or multiple sources into corresponding HTML tags. +Those sources can be the name of the local asset or an absolute URL. -After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment. +Given the following template: -To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). +```erb +<!doctype HTML> +<html> + <head> + <title>Assets example</title> + <%= stylesheet 'reset', 'grid', 'main' %> + </head> + <body> + <!-- ... --> + <%= javascript 'https://code.jquery.com/jquery-2.1.1.min.js', 'application' %> + <%= javascript 'modals' %> + </body> +</html> +``` + +It will output this markup. + +```html +<!doctype HTML> +<html> + <head> + <title>Assets example</title> + <link href="/assets/reset.css" type="text/css" rel="stylesheet"> + <link href="/assets/grid.css" type="text/css" rel="stylesheet"> + <link href="/assets/main.css" type="text/css" rel="stylesheet"> + </head> + + <body> + <!-- ... --> + <script src="https://code.jquery.com/jquery-2.1.1.min.js" type="text/javascript"></script> + <script src="/assets/application.js" type="text/javascript"></script> + <script src="/assets/modals.js" type="text/javascript"></script> + </body> +</html> +``` + +Let's have a look at the corresponding Ruby code. +In this example we use ERb, but remember that `Hanami::Assets` is compatible with +all the rendering engines such as HAML, Slim, Mustache, etc.. + +```ruby +require 'erb' +require 'hanami/assets' +require 'hanami/assets/helpers' + +class View + include Hanami::Assets::Helpers + + def initialize + @template = File.read('template.erb') + @engine = ERB.new(@template) + end + + def render + @engine.result(binding) + end +end + +View.new.render # => HTML markup +``` + +For advanced configurations, please have a look at +[`Hanami::Assets::Configuration`](https://github.com/hanami/assets/blob/master/lib/hanami/assets/configuration.rb). + +### Available Helpers + +This gems ships with the following helpers: + + * `javascript` + * `stylesheet` + * `favicon` + * `image` + * `video` + * `audio` + * `asset_path` + * `asset_url` + +### Development mode + +`Hanami::Assets` can help you during the development process of your application. +It can manage multiple source directories for each asset type or run a +preprocessor for you. + +#### Sources + +Imagine to have your application's javascripts under `app/assets/javascripts` and that +those assets depends on a vendored version of jQuery. + +```ruby +require 'hanami/assets' + +Hanami::Assets.configure do + compile true + + sources << [ + 'app/assets', + 'vendor/jquery' + ] +end +``` + +When from a template you do: + +```erb +<%= javascript 'jquery', 'jquery-ui', 'login' %> +``` + +`Hanami::Assets` looks at the defined sources and **lazily copies** those files +under `public/assets` (by default), before the markup is generated. + +Your public directory will have the following structure. + +```shell +% tree public +public/ +└── assets + ├── jquery.js + ├── jquery-ui.js + └── login.js + +``` + +**Please remember that sources are recursively looked up in order of declaration.** + +If in the example above we had a `jquery.js` under `app/assets/javascripts/**/*.js` +that file would be copied into the public directory instead of the one under +`vendor/jquery`. The reason is because we declared `app/assets/javascripts` first. + +#### Preprocessors + +`Hanami::Assets` is able to run assets preprocessors and **lazily compile** them +under `public/assets` (by default), before the markup is generated. + +Imagine to have `main.css.scss` under `app/assets/stylesheets` and `reset.css` under +`vendor/stylesheets`. + +**The extensions structure is important.** +The first one is mandatory and it's used to understand which asset type we are +handling: `.css` for stylesheets. +The second one is optional and it's for a preprocessor: `.scss` for Sass. + +```ruby +require 'sass' +require 'hanami/assets' + +Hanami::Assets.configure do + compile true + + sources << [ + 'assets', + 'vendor/assets' + ] +end +``` + +When from a template you do: + +```erb +<%= stylesheet 'reset', 'main' %> +``` + +Your public directory will have the following structure. + +```shell +% tree public +public/ +└── assets + ├── reset.css + └── main.css +``` + +### Preprocessors engines + +`Hanami::Assets` uses [Tilt](https://github.com/rtomayko/tilt) to provide support for the most common preprocessors, such as [Sass](http://sass-lang.com/) (including `sassc-ruby`), [Less](http://lesscss.org/), ES6, [JSX](https://jsx.github.io/), [CoffeScript](http://coffeescript.org), [Opal](http://opalrb.org), [Handlebars](http://handlebarsjs.com), [JBuilder](https://github.com/rails/jbuilder). + +In order to use one or more of them, be sure to include the corresponding gem into your `Gemfile` and require the library. + +#### EcmaScript 6 + +We strongly suggest to use [EcmaScript 6](http://es6-features.org/) for your next project. +It isn't fully [supported](https://kangax.github.io/compat-table/es6/) yet by browser vendors, but it's the future of JavaScript. + +As of today, you need to transpile ES6 code into something understandable by current browsers, which is ES5. +For this purpose we support [Babel](https://babeljs.io). + +### Deployment + +`Hanami::Assets` ships with an executable (`hanami-assets`), which can be used to precompile assets and make them cacheable by browsers (via checksum suffix). + +Let's say we have an application that has main file that requires the entire code (`config/environment.rb`), a gem that brings Ember.js code, and the following sources: + +```shell +% tree . +├── apps +│   ├── admin +│   │   ├── assets +│   │   │   └── js +│   │   │   ├── application.js +│   │   │   └── zepto.js +# ... +│   ├── metrics +│   │   ├── assets +│   │   │   └── javascripts +│   │   │   └── dashboard.js +# ... +│   └── web +│   ├── assets +│   │   ├── images +│   │   │   └── bookshelf.jpg +│   │   └── javascripts +│   │   └── application.js +# ... +│   └── vendor +│   └── assets +│   └── javascripts +│   └── jquery.js +└── config +    └── environment.rb +``` + +In order to deploy, we can run: + +```shell +bundle exec hanami-assets --config=config/environment.rb +``` + +It will output: + +```shell +tree public +public +├── assets +│   ├── admin +│   │   ├── application-28a6b886de2372ee3922fcaf3f78f2d8.js +│   │   ├── application.js +│   │   ├── ember-b2d6de1e99c79a0e52cf5c205aa2e07a.js +│   │   ├── ember-source-e74117fc6ba74418b2601ffff9eb1568.js +│   │   ├── ember-source.js +│   │   ├── ember.js +│   │   ├── zepto-ca736a378613d484138dec4e69be99b6.js +│   │   └── zepto.js +│   ├── application-d1829dc353b734e3adc24855693b70f9.js +│   ├── application.js +│   ├── bookshelf-237ecbedf745af5a477e380f0232039a.jpg +│   ├── bookshelf.jpg +│   ├── ember-b2d6de1e99c79a0e52cf5c205aa2e07a.js +│   ├── ember-source-e74117fc6ba74418b2601ffff9eb1568.js +│   ├── ember-source.js +│   ├── ember.js +│   ├── jquery-05277a4edea56b7f82a4c1442159e183.js +│   ├── jquery.js +│   └── metrics +│   ├── dashboard-7766a63ececc63a7a629bfb0666e9c62.js +│   ├── dashboard.js +│   ├── ember-b2d6de1e99c79a0e52cf5c205aa2e07a.js +│   ├── ember-source-e74117fc6ba74418b2601ffff9eb1568.js +│   ├── ember-source.js +│   └── ember.js +└── assets.json +``` + +#### Compressors + +Minification is a process that shrink file size in production, by removing unnecessary spaces and characters. +The goal of this step, is to have lighter assets to be served faster to the browsers. + +Hanami supports JavaScript and stylesheets minifiers. + +Because this framework relies on external gems for minification, this feature is **turned off by default**. + +To do so we need to specify which gem we want to use and add it to our `Gemfile`. + +##### JavaScript Compressors + +Hanami can use the following compressors (aka minifiers) for JavaScript. + + * `:builtin` - Ruby based implementation of jsmin. It doesn't require any external gem. + * `:yui` - [YUI Compressor](http://yui.github.io/yuicompressor), it depends on [`yui-compressor`](https://rubygems.org/gems/yui-compressor) gem and iπt requires Java 1.4+ + * `:uglifier` - [UglifyJS](http://lisperator.net/uglifyjs), it depends on [`uglifier`](https://rubygems.org/gems/uglifier) gem and it requires Node.js + * `:closure` - [Google Closure Compiler](https://developers.google.com/closure/compiler), it depends on [`closure-compiler`](https://rubygems.org/gems/closure-compiler) gem and it requires Java + +```ruby +Hanami::Assets.configure do + javascript_compressor :uglifier +end +``` + +##### Stylesheet Compressors + +Hanami can use the following compressors (aka minifiers) for Stylesheet. + + * `:builtin` - Ruby based compressor. It doesn't require any external gem. It's fast, but not an efficient compressor. + * `:yui` - [YUI Compressor](http://yui.github.io/yuicompressor), it depends on [`yui-compressor`](https://rubygems.org/gems/yui-compressor) gem and iπt requires Java 1.4+ + * `:sass` - [Sass](http://sass-lang.com/), it depends on [`sass`](https://rubygems.org/gems/sass) gem + +```ruby +Hanami::Assets.configure do + stylesheet_compressor :sass +end +``` + +##### Custom Compressors + +We can specify our own minifiers: + +```ruby +Hanami::Assets.configure do + javascript_compressor MyJavascriptCompressor.new + stylesheet_compressor MyStylesheetCompressor.new +end +``` + +### Digest Mode + +This is a mode that can be activated via the configuration and it's suitable for production environments. + +```ruby +Hanami::Assets.configure do + digest true +end +``` + +Once turned on, it will look at `/public/assets.json`, and helpers such as `javascript` will return a relative URL that includes the digest of the asset. + +```erb +<%= javascript 'application' %> +``` + +```html +<script src="/assets/application-d1829dc353b734e3adc24855693b70f9.js" type="text/javascript"></script> +``` + +### CDN Mode + +A Hanami project can serve assets via CDN. + +```ruby +Hanami::Assets.configure do + scheme 'https' + host '123.cloudfront.net' + port 443 + cdn true +end +``` + +Since now on, helpers will return the CDN absolute URL for the asset. + +```erb +<%= javascript 'application' %> +``` + +```html +<script src="https://123.cloudfront.net/assets/application-d1829dc353b734e3adc24855693b70f9.js" type="text/javascript"></script> +``` + +## Third party gems + +Developers can maintain gems that distribute assets for Hanami. For instance `hanami-ember` or `hanami-jquery`. + +As a gem developer, you must add one or more paths, where the assets are stored inside the gem. + +```ruby +# lib/hanami/jquery.rb +Hanami::Assets.sources << '/path/to/jquery' +``` + +## Running tests + + * Make sure you have one of [ExecJS](https://github.com/rails/execjs) +supported runtime on your machine. + * Java 1.4+ + +```sh +bundle exec rake test +``` + +## Versioning + +__Hanami::Assets__ uses [Semantic Versioning 2.0.0](http://semver.org) + ## Contributing -Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/hanami-assets. +1. Fork it ( https://github.com/hanami/assets/fork ) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new Pull Request +## Copyright + +Copyright © 2014-2016 Luca Guidi – Released under MIT License + +This project was formerly known as Lotus (`lotus-assets`).