hanami-assets 0.0.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/LICENSE.md +22 -0
  4. data/README.md +426 -9
  5. data/bin/hanami-assets +22 -0
  6. data/hanami-assets.gemspec +26 -12
  7. data/lib/hanami/assets.rb +153 -2
  8. data/lib/hanami/assets/bundler.rb +173 -0
  9. data/lib/hanami/assets/cache.rb +58 -0
  10. data/lib/hanami/assets/compiler.rb +212 -0
  11. data/lib/hanami/assets/compressors/abstract.rb +119 -0
  12. data/lib/hanami/assets/compressors/builtin_javascript.rb +36 -0
  13. data/lib/hanami/assets/compressors/builtin_stylesheet.rb +57 -0
  14. data/lib/hanami/assets/compressors/closure_javascript.rb +25 -0
  15. data/lib/hanami/assets/compressors/javascript.rb +77 -0
  16. data/lib/hanami/assets/compressors/jsmin.rb +283 -0
  17. data/lib/hanami/assets/compressors/null_compressor.rb +19 -0
  18. data/lib/hanami/assets/compressors/sass_stylesheet.rb +38 -0
  19. data/lib/hanami/assets/compressors/stylesheet.rb +77 -0
  20. data/lib/hanami/assets/compressors/uglifier_javascript.rb +25 -0
  21. data/lib/hanami/assets/compressors/yui_javascript.rb +25 -0
  22. data/lib/hanami/assets/compressors/yui_stylesheet.rb +25 -0
  23. data/lib/hanami/assets/config/global_sources.rb +50 -0
  24. data/lib/hanami/assets/config/manifest.rb +112 -0
  25. data/lib/hanami/assets/config/sources.rb +77 -0
  26. data/lib/hanami/assets/configuration.rb +539 -0
  27. data/lib/hanami/assets/helpers.rb +733 -0
  28. data/lib/hanami/assets/precompiler.rb +67 -0
  29. data/lib/hanami/assets/version.rb +4 -1
  30. metadata +189 -17
  31. data/.gitignore +0 -9
  32. data/Gemfile +0 -4
  33. data/Rakefile +0 -2
  34. data/bin/console +0 -14
  35. data/bin/setup +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 799f1705c3aaeeb889f0b1b227d3aa5ee1ef9571
4
- data.tar.gz: 8329ada74df211e8c7b7715f37739f23549b0a22
3
+ metadata.gz: a443db3ecee31792abeda3bc3c777df04b3ed8e7
4
+ data.tar.gz: e8cabf2dc50f5a1a9d6c2e44403a251bddbf9873
5
5
  SHA512:
6
- metadata.gz: 3add3df0ca42d323c89062d69aed34a7f6399d9d5f27c00eb6e3d76c5e6e59a75a259331c8e5d25a8a7ea5a1543b616f3289b3982f85614ce42e0182504538cd
7
- data.tar.gz: 9b0def07ac7a0c5cd8dc5827c131b3d135cb1c25f6208ece09af95acd08d416d4f06b2c04c8885fb82ce996de2e5587493dda1f54f854c89688f747ba6765613
6
+ metadata.gz: c837a69fa374ed5ccefedc39c202769135e8d15021a6eb11859d3d8737e0152c5add82a756a58a138ece98d258a1acb08fc0557258c225fc679ece71a5787d1c
7
+ data.tar.gz: d54301922da41e242a1b5bb3e6bbf952a61007f3e3ece7c17462853dd105f42e11c0e465b46e58883d9d1a44e62b5efa8ea5b2c0ec4436c93b815957d6aa7c81
data/CHANGELOG.md ADDED
@@ -0,0 +1,23 @@
1
+ # Hanami::Assets
2
+ Assets management for Ruby web applications
3
+
4
+ ## v0.2.0 - 2016-01-22
5
+ ### Changed
6
+ - [Luca Guidi] Renamed the project
7
+
8
+ ## v0.1.0 - 2016-01-12
9
+ ### Added
10
+ - [Luca Guidi] Configurable assets compressors
11
+ - [Luca Guidi] Builtin JavaScript and stylesheet compressors
12
+ - [deepj & Michael Deol] Added `Lotus::Assets::Helpers#favicon`
13
+ - [Leigh Halliday] Added `Lotus::Assets::Helpers#video`
14
+ - [Kleber Correia] Added `Lotus::Assets::Helpers#audio`
15
+ - [Gonzalo Rodríguez-Baltanás Díaz] Added `Lotus::Assets::Helpers#image`
16
+ - [Luca Guidi] Added `Lotus::Assets::Helpers#javascript` and `#stylesheet`
17
+ - [Luca Guidi] Added `Lotus::Assets::Helpers#asset_path` and `#asset_url`
18
+ - [Luca Guidi] "CDN Mode" let helpers to generate CDN URLs (eg. `https://123.cloudfront.net/assets/application-d1829dc353b734e3adc24855693b70f9.js`)
19
+ - [Luca Guidi] "Digest Mode" let helpers to generate digest URLs (eg. `/assets/application-d1829dc353b734e3adc24855693b70f9.js`)
20
+ - [Luca Guidi] Added `hanami-assets` command to precompile assets at the deploy time
21
+ - [Luca Guidi] Added support for third party gems that want to ship gemified assets for Lotus
22
+ - [Luca Guidi] Assets preprocessors (eg. Sass, ES6, CoffeeScript, Opal, JSX)
23
+ - [Luca Guidi] Official support for Ruby 2.0+
data/LICENSE.md ADDED
@@ -0,0 +1,22 @@
1
+ Copyright © 2014-2016 Luca Guidi
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,8 +1,31 @@
1
1
  # Hanami::Assets
2
2
 
3
- 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.
3
+ Assets management for Ruby web projects
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ ## Status
6
+
7
+ [![Gem Version](http://img.shields.io/gem/v/hanami-assets.svg)](https://badge.fury.io/rb/hanami-assets)
8
+ [![Build Status](http://img.shields.io/travis/hanami/assets/master.svg)](https://travis-ci.org/hanami/assets?branch=master)
9
+ [![Coverage](http://img.shields.io/coveralls/hanami/assets/master.svg)](https://coveralls.io/r/hanami/assets)
10
+ [![Code Climate](http://img.shields.io/codeclimate/github/hanami/assets.svg)](https://codeclimate.com/github/hanami/assets)
11
+ [![Dependencies](http://img.shields.io/gemnasium/hanami/assets.svg)](https://gemnasium.com/hanami/assets)
12
+ [![Inline Docs](http://inch-ci.org/github/hanami/assets.svg)](http://inch-ci.org/github/hanami/assets)
13
+
14
+ ## Contact
15
+
16
+ * Home page: http://hanamirb.org
17
+ * Community: http://hanamirb.org/community
18
+ * Guides: http://hanamirb.org/guides
19
+ * Mailing List: http://hanamirb.org/mailing-list
20
+ * API Doc: http://rdoc.info/gems/hanami-assets
21
+ * Bugs/Issues: https://github.com/hanami/assets/issues
22
+ * Support: http://stackoverflow.com/questions/tagged/hanami
23
+ * Forum: https://discuss.hanamirb.org
24
+ * Chat: http://chat.hanamirb.org
25
+
26
+ ## Rubies
27
+
28
+ __Hanami::Assets__ supports Ruby (MRI) 2.2+
6
29
 
7
30
  ## Installation
8
31
 
@@ -14,23 +37,417 @@ gem 'hanami-assets'
14
37
 
15
38
  And then execute:
16
39
 
17
- $ bundle
40
+ ```shell
41
+ $ bundle
42
+ ```
18
43
 
19
44
  Or install it yourself as:
20
45
 
21
- $ gem install hanami-assets
46
+ ```shell
47
+ $ gem install hanami-assets
48
+ ```
22
49
 
23
50
  ## Usage
24
51
 
25
- TODO: Write usage instructions here
52
+ ### Helpers
53
+
54
+ The framework offers assets specific helpers to be used in templates.
55
+ They resolve one or multiple sources into corresponding HTML tags.
56
+ Those sources can be the name of the local asset or an absolute URL.
57
+
58
+ Given the following template:
59
+
60
+ ```erb
61
+ <!doctype HTML>
62
+ <html>
63
+ <head>
64
+ <title>Assets example</title>
65
+ <%= stylesheet 'reset', 'grid', 'main' %>
66
+ </head>
67
+
68
+ <body>
69
+ <!-- ... -->
70
+ <%= javascript 'https://code.jquery.com/jquery-2.1.1.min.js', 'application' %>
71
+ <%= javascript 'modals' %>
72
+ </body>
73
+ </html>
74
+ ```
75
+
76
+ It will output this markup.
77
+
78
+ ```html
79
+ <!doctype HTML>
80
+ <html>
81
+ <head>
82
+ <title>Assets example</title>
83
+ <link href="/assets/reset.css" type="text/css" rel="stylesheet">
84
+ <link href="/assets/grid.css" type="text/css" rel="stylesheet">
85
+ <link href="/assets/main.css" type="text/css" rel="stylesheet">
86
+ </head>
87
+
88
+ <body>
89
+ <!-- ... -->
90
+ <script src="https://code.jquery.com/jquery-2.1.1.min.js" type="text/javascript"></script>
91
+ <script src="/assets/application.js" type="text/javascript"></script>
92
+ <script src="/assets/modals.js" type="text/javascript"></script>
93
+ </body>
94
+ </html>
95
+ ```
96
+
97
+ Let's have a look at the corresponding Ruby code.
98
+ In this example we use ERb, but remember that `Hanami::Assets` is compatible with
99
+ all the rendering engines such as HAML, Slim, Mustache, etc..
100
+
101
+ ```ruby
102
+ require 'erb'
103
+ require 'hanami/assets'
104
+ require 'hanami/assets/helpers'
105
+
106
+ class View
107
+ include Hanami::Assets::Helpers
108
+
109
+ def initialize
110
+ @template = File.read('template.erb')
111
+ @engine = ERB.new(@template)
112
+ end
113
+
114
+ def render
115
+ @engine.result(binding)
116
+ end
117
+ end
118
+
119
+ View.new.render # => HTML markup
120
+ ```
121
+
122
+ For advanced configurations, please have a look at
123
+ [`Hanami::Assets::Configuration`](https://github.com/hanami/assets/blob/master/lib/hanami/assets/configuration.rb).
124
+
125
+ ### Available Helpers
126
+
127
+ This gems ships with the following helpers:
128
+
129
+ * `javascript`
130
+ * `stylesheet`
131
+ * `favicon`
132
+ * `image`
133
+ * `video`
134
+ * `audio`
135
+ * `asset_path`
136
+ * `asset_url`
137
+
138
+ ### Development mode
139
+
140
+ `Hanami::Assets` can help you during the development process of your application.
141
+ It can manage multiple source directories for each asset type or run a
142
+ preprocessor for you.
143
+
144
+ #### Sources
145
+
146
+ Imagine to have your application's javascripts under `app/assets/javascripts` and that
147
+ those assets depends on a vendored version of jQuery.
148
+
149
+ ```ruby
150
+ require 'hanami/assets'
151
+
152
+ Hanami::Assets.configure do
153
+ compile true
154
+
155
+ sources << [
156
+ 'app/assets',
157
+ 'vendor/jquery'
158
+ ]
159
+ end
160
+ ```
161
+
162
+ When from a template you do:
163
+
164
+ ```erb
165
+ <%= javascript 'jquery', 'jquery-ui', 'login' %>
166
+ ```
167
+
168
+ `Hanami::Assets` looks at the defined sources and **lazily copies** those files
169
+ under `public/assets` (by default), before the markup is generated.
170
+
171
+ Your public directory will have the following structure.
172
+
173
+ ```shell
174
+ % tree public
175
+ public/
176
+ └── assets
177
+ ├── jquery.js
178
+ ├── jquery-ui.js
179
+ └── login.js
180
+
181
+ ```
182
+
183
+ **Please remember that sources are recursively looked up in order of declaration.**
184
+
185
+ If in the example above we had a `jquery.js` under `app/assets/javascripts/**/*.js`
186
+ that file would be copied into the public directory instead of the one under
187
+ `vendor/jquery`. The reason is because we declared `app/assets/javascripts` first.
188
+
189
+ #### Preprocessors
190
+
191
+ `Hanami::Assets` is able to run assets preprocessors and **lazily compile** them
192
+ under `public/assets` (by default), before the markup is generated.
193
+
194
+ Imagine to have `main.css.scss` under `app/assets/stylesheets` and `reset.css` under
195
+ `vendor/stylesheets`.
196
+
197
+ **The extensions structure is important.**
198
+ The first one is mandatory and it's used to understand which asset type we are
199
+ handling: `.css` for stylesheets.
200
+ The second one is optional and it's for a preprocessor: `.scss` for Sass.
201
+
202
+ ```ruby
203
+ require 'sass'
204
+ require 'hanami/assets'
205
+
206
+ Hanami::Assets.configure do
207
+ compile true
208
+
209
+ sources << [
210
+ 'assets',
211
+ 'vendor/assets'
212
+ ]
213
+ end
214
+ ```
215
+
216
+ When from a template you do:
217
+
218
+ ```erb
219
+ <%= stylesheet 'reset', 'main' %>
220
+ ```
221
+
222
+ Your public directory will have the following structure.
223
+
224
+ ```shell
225
+ % tree public
226
+ public/
227
+ └── assets
228
+ ├── reset.css
229
+ └── main.css
230
+ ```
231
+
232
+ ### Preprocessors engines
233
+
234
+ `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).
235
+
236
+ In order to use one or more of them, be sure to include the corresponding gem into your `Gemfile` and require the library.
237
+
238
+ #### EcmaScript 6
26
239
 
27
- ## Development
240
+ We strongly suggest to use [EcmaScript 6](http://es6-features.org/) for your next project.
241
+ It isn't fully [supported](https://kangax.github.io/compat-table/es6/) yet by browser vendors, but it's the future of JavaScript.
28
242
 
29
- 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.
243
+ As of today, you need to transpile ES6 code into something understandable by current browsers, which is ES5.
244
+ For this purpose we support [Babel](https://babeljs.io).
30
245
 
31
- 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).
246
+ ### Deployment
247
+
248
+ `Hanami::Assets` ships with an executable (`hanami-assets`), which can be used to precompile assets and make them cacheable by browsers (via checksum suffix).
249
+
250
+ 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:
251
+
252
+ ```shell
253
+ % tree .
254
+ ├── apps
255
+ │   ├── admin
256
+ │   │   ├── assets
257
+ │   │   │   └── js
258
+ │   │   │   ├── application.js
259
+ │   │   │   └── zepto.js
260
+ # ...
261
+ │   ├── metrics
262
+ │   │   ├── assets
263
+ │   │   │   └── javascripts
264
+ │   │   │   └── dashboard.js
265
+ # ...
266
+ │   └── web
267
+ │   ├── assets
268
+ │   │   ├── images
269
+ │   │   │   └── bookshelf.jpg
270
+ │   │   └── javascripts
271
+ │   │   └── application.js
272
+ # ...
273
+ │   └── vendor
274
+ │   └── assets
275
+ │   └── javascripts
276
+ │   └── jquery.js
277
+ └── config
278
+    └── environment.rb
279
+ ```
280
+
281
+ In order to deploy, we can run:
282
+
283
+ ```shell
284
+ bundle exec hanami-assets --config=config/environment.rb
285
+ ```
286
+
287
+ It will output:
288
+
289
+ ```shell
290
+ tree public
291
+ public
292
+ ├── assets
293
+ │   ├── admin
294
+ │   │   ├── application-28a6b886de2372ee3922fcaf3f78f2d8.js
295
+ │   │   ├── application.js
296
+ │   │   ├── ember-b2d6de1e99c79a0e52cf5c205aa2e07a.js
297
+ │   │   ├── ember-source-e74117fc6ba74418b2601ffff9eb1568.js
298
+ │   │   ├── ember-source.js
299
+ │   │   ├── ember.js
300
+ │   │   ├── zepto-ca736a378613d484138dec4e69be99b6.js
301
+ │   │   └── zepto.js
302
+ │   ├── application-d1829dc353b734e3adc24855693b70f9.js
303
+ │   ├── application.js
304
+ │   ├── bookshelf-237ecbedf745af5a477e380f0232039a.jpg
305
+ │   ├── bookshelf.jpg
306
+ │   ├── ember-b2d6de1e99c79a0e52cf5c205aa2e07a.js
307
+ │   ├── ember-source-e74117fc6ba74418b2601ffff9eb1568.js
308
+ │   ├── ember-source.js
309
+ │   ├── ember.js
310
+ │   ├── jquery-05277a4edea56b7f82a4c1442159e183.js
311
+ │   ├── jquery.js
312
+ │   └── metrics
313
+ │   ├── dashboard-7766a63ececc63a7a629bfb0666e9c62.js
314
+ │   ├── dashboard.js
315
+ │   ├── ember-b2d6de1e99c79a0e52cf5c205aa2e07a.js
316
+ │   ├── ember-source-e74117fc6ba74418b2601ffff9eb1568.js
317
+ │   ├── ember-source.js
318
+ │   └── ember.js
319
+ └── assets.json
320
+ ```
321
+
322
+ #### Compressors
323
+
324
+ Minification is a process that shrink file size in production, by removing unnecessary spaces and characters.
325
+ The goal of this step, is to have lighter assets to be served faster to the browsers.
326
+
327
+ Hanami supports JavaScript and stylesheets minifiers.
328
+
329
+ Because this framework relies on external gems for minification, this feature is **turned off by default**.
330
+
331
+ To do so we need to specify which gem we want to use and add it to our `Gemfile`.
332
+
333
+ ##### JavaScript Compressors
334
+
335
+ Hanami can use the following compressors (aka minifiers) for JavaScript.
336
+
337
+ * `:builtin` - Ruby based implementation of jsmin. It doesn't require any external gem.
338
+ * `: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+
339
+ * `:uglifier` - [UglifyJS](http://lisperator.net/uglifyjs), it depends on [`uglifier`](https://rubygems.org/gems/uglifier) gem and it requires Node.js
340
+ * `: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
341
+
342
+ ```ruby
343
+ Hanami::Assets.configure do
344
+ javascript_compressor :uglifier
345
+ end
346
+ ```
347
+
348
+ ##### Stylesheet Compressors
349
+
350
+ Hanami can use the following compressors (aka minifiers) for Stylesheet.
351
+
352
+ * `:builtin` - Ruby based compressor. It doesn't require any external gem. It's fast, but not an efficient compressor.
353
+ * `: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+
354
+ * `:sass` - [Sass](http://sass-lang.com/), it depends on [`sass`](https://rubygems.org/gems/sass) gem
355
+
356
+ ```ruby
357
+ Hanami::Assets.configure do
358
+ stylesheet_compressor :sass
359
+ end
360
+ ```
361
+
362
+ ##### Custom Compressors
363
+
364
+ We can specify our own minifiers:
365
+
366
+ ```ruby
367
+ Hanami::Assets.configure do
368
+ javascript_compressor MyJavascriptCompressor.new
369
+ stylesheet_compressor MyStylesheetCompressor.new
370
+ end
371
+ ```
372
+
373
+ ### Digest Mode
374
+
375
+ This is a mode that can be activated via the configuration and it's suitable for production environments.
376
+
377
+ ```ruby
378
+ Hanami::Assets.configure do
379
+ digest true
380
+ end
381
+ ```
382
+
383
+ 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.
384
+
385
+ ```erb
386
+ <%= javascript 'application' %>
387
+ ```
388
+
389
+ ```html
390
+ <script src="/assets/application-d1829dc353b734e3adc24855693b70f9.js" type="text/javascript"></script>
391
+ ```
392
+
393
+ ### CDN Mode
394
+
395
+ A Hanami project can serve assets via CDN.
396
+
397
+ ```ruby
398
+ Hanami::Assets.configure do
399
+ scheme 'https'
400
+ host '123.cloudfront.net'
401
+ port 443
402
+ cdn true
403
+ end
404
+ ```
405
+
406
+ Since now on, helpers will return the CDN absolute URL for the asset.
407
+
408
+ ```erb
409
+ <%= javascript 'application' %>
410
+ ```
411
+
412
+ ```html
413
+ <script src="https://123.cloudfront.net/assets/application-d1829dc353b734e3adc24855693b70f9.js" type="text/javascript"></script>
414
+ ```
415
+
416
+ ## Third party gems
417
+
418
+ Developers can maintain gems that distribute assets for Hanami. For instance `hanami-ember` or `hanami-jquery`.
419
+
420
+ As a gem developer, you must add one or more paths, where the assets are stored inside the gem.
421
+
422
+ ```ruby
423
+ # lib/hanami/jquery.rb
424
+ Hanami::Assets.sources << '/path/to/jquery'
425
+ ```
426
+
427
+ ## Running tests
428
+
429
+ * Make sure you have one of [ExecJS](https://github.com/rails/execjs)
430
+ supported runtime on your machine.
431
+ * Java 1.4+
432
+
433
+ ```sh
434
+ bundle exec rake test
435
+ ```
436
+
437
+ ## Versioning
438
+
439
+ __Hanami::Assets__ uses [Semantic Versioning 2.0.0](http://semver.org)
32
440
 
33
441
  ## Contributing
34
442
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/hanami-assets.
443
+ 1. Fork it ( https://github.com/hanami/assets/fork )
444
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
445
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
446
+ 4. Push to the branch (`git push origin my-new-feature`)
447
+ 5. Create new Pull Request
448
+
449
+ ## Copyright
450
+
451
+ Copyright © 2014-2016 Luca Guidi – Released under MIT License
36
452
 
453
+ This project was formerly known as Lotus (`lotus-assets`).