assets-publisher-for-hanami 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +7 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +257 -0
  8. data/Rakefile +2 -0
  9. data/assets-publisher-for-hanami.gemspec +33 -0
  10. data/bin/setup +7 -0
  11. data/lib/cabeza-de-termo/assets-publisher/assets/asset.rb +81 -0
  12. data/lib/cabeza-de-termo/assets-publisher/assets/types/asset-type.rb +41 -0
  13. data/lib/cabeza-de-termo/assets-publisher/assets/types/javascript-type.rb +20 -0
  14. data/lib/cabeza-de-termo/assets-publisher/assets/types/stylesheet-type.rb +20 -0
  15. data/lib/cabeza-de-termo/assets-publisher/clock-cards/clock-card-machine.rb +43 -0
  16. data/lib/cabeza-de-termo/assets-publisher/clock-cards/clock-card.rb +47 -0
  17. data/lib/cabeza-de-termo/assets-publisher/compilation-jobs/compilation-job.rb +80 -0
  18. data/lib/cabeza-de-termo/assets-publisher/compilation-jobs/compilation-jobs-builder.rb +52 -0
  19. data/lib/cabeza-de-termo/assets-publisher/compilation-jobs/one-file-per-asset-builder.rb +66 -0
  20. data/lib/cabeza-de-termo/assets-publisher/compilers/command-line-compiler.rb +26 -0
  21. data/lib/cabeza-de-termo/assets-publisher/compilers/compiler.rb +50 -0
  22. data/lib/cabeza-de-termo/assets-publisher/compilers/tilt-compiler.rb +47 -0
  23. data/lib/cabeza-de-termo/assets-publisher/configuration/configuration.rb +66 -0
  24. data/lib/cabeza-de-termo/assets-publisher/errors/asset-not-found-error.rb +12 -0
  25. data/lib/cabeza-de-termo/assets-publisher/errors/compilation-job-failed-error.rb +14 -0
  26. data/lib/cabeza-de-termo/assets-publisher/errors/compilation-job-not-supported-error.rb +14 -0
  27. data/lib/cabeza-de-termo/assets-publisher/errors/error.rb +6 -0
  28. data/lib/cabeza-de-termo/assets-publisher/errors/unknown-asset-location-error.rb +12 -0
  29. data/lib/cabeza-de-termo/assets-publisher/helpers/helper.rb +27 -0
  30. data/lib/cabeza-de-termo/assets-publisher/locations/absolute-location.rb +25 -0
  31. data/lib/cabeza-de-termo/assets-publisher/locations/location.rb +54 -0
  32. data/lib/cabeza-de-termo/assets-publisher/locations/source-location.rb +13 -0
  33. data/lib/cabeza-de-termo/assets-publisher/publisher.rb +142 -0
  34. data/lib/cabeza-de-termo/assets-publisher/source-finders/assets-finder.rb +44 -0
  35. data/lib/cabeza-de-termo/assets-publisher/source-finders/assets-source.rb +31 -0
  36. data/lib/cabeza-de-termo/assets-publisher/version.rb +7 -0
  37. metadata +191 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ade9157e66ba76611af970ee42bc61d400ae4dbf
4
+ data.tar.gz: fab9d08054b310d470ea9145242d05ff97ad93ed
5
+ SHA512:
6
+ metadata.gz: 7c7fc21318151e0f491ad4a3c9e28a0e8fe19cbb40f15bae519cc5e18d3199f9e4e15af02b6bd4a0f7e059bbd6ff102a4d3b3d6e0bc57d03c92994f900c20538
7
+ data.tar.gz: c1642b1873b33193f38e61a6aa2e66d9bc084b0673ed691069c227dbc61c3645d46bebd0711760a7882e5aff3f6d965f4e4eaae23855792dc83878df6c79803f
@@ -0,0 +1,7 @@
1
+ Gemfile.lock
2
+
3
+ # Caches
4
+ .sass-cache/
5
+
6
+ # Simplecov test coverage report
7
+ coverage/
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require 'spec-helper'
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - "2.0"
5
+ - "2.1"
6
+ - "2.2"
7
+
8
+ before_install: gem install bundler
9
+
10
+ script: bundle exec rspec
11
+
12
+ git:
13
+ submodules: false
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'rspec', require: false
6
+ gem 'simplecov', require: false
7
+ gem 'coveralls', require: false
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Martin Rubi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,257 @@
1
+ # CabezaDeTermo::AssetsPublisher::Helper
2
+
3
+ A framework to declare bundles of assets in your Hanami application, compile them into a public folder and add them to your template.
4
+
5
+ ## Status
6
+
7
+ [![Gem Version](https://badge.fury.io/rb/assets-publisher-for-hanami.svg)](https://badge.fury.io/rb/assets-publisher-for-hanami)
8
+ [![Build Status](https://travis-ci.org/cabeza-de-termo/assets-publisher-for-hanami.svg?branch=master)](https://travis-ci.org/cabeza-de-termo/assets-publisher-for-hanami)
9
+ [![Coverage Status](https://coveralls.io/repos/cabeza-de-termo/assets-publisher-for-hanami/badge.svg?branch=master&service=github)](https://coveralls.io/github/cabeza-de-termo/assets-publisher-for-hanami?branch=master)
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ ```ruby
16
+ gem 'assets-publisher-for-hanami', '~> 2.0'
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install assets-publisher-for-hanami
26
+
27
+ ## Usage
28
+
29
+ To declare the asset bundles, add this required file to the application.rb file:
30
+
31
+ ```ruby
32
+ require 'cabeza-de-termo/assets-publisher/helpers/helper'
33
+ ```
34
+
35
+ and then add this to your Application class:
36
+
37
+ ```ruby
38
+ module Web
39
+ class Application < Hanami::Application
40
+ configure do
41
+ ...
42
+
43
+ # Define the asset bundles.
44
+ # See https://github.com/cabeza-de-termo/assets-library-for-hanami for more details.
45
+ CabezaDeTermo::Assets::Library.definition do
46
+ # Css
47
+ bundle :'bootstrap-css' do
48
+ include '/vendor/bootstrap/css/bootstrap.min.css' # include this asset in the bundle
49
+ end
50
+
51
+ # Js
52
+ bundle :jquery do
53
+ include '/vendor/jquery/jquery-1.11.3.min.js'
54
+ end
55
+
56
+ bundle :'bootstrap-js' do
57
+ require :jquery # declare that this bundle depends on the :jquery bundle
58
+ include '/vendor/bootstrap/js/bootstrap.min.js'
59
+ end
60
+ end
61
+
62
+ # Configure the AssetsPublisher.
63
+ CabezaDeTermo::AssetsPublisher::Publisher.configure do
64
+ # Where we want to publish the compiled assets
65
+ destination_folder 'apps/web/public'
66
+
67
+ # Where to look for assets
68
+ sources << 'apps/web/assets'
69
+
70
+ # Optional, true by default.
71
+ add_timestamps_to_published_assets true
72
+
73
+ # Optionally uncomment to define custom compilers. You can also use :command_line_compiler
74
+ # stylesheets_compiler { CustomCssCompiler.new }
75
+ # javascripts_compiler { CustomJsCompiler.new }
76
+ end
77
+
78
+ ...
79
+ end
80
+ end
81
+ end
82
+ ```
83
+
84
+ To define the assets to be included in the layout, you can add these methods to your Web::Views::ApplicationLayout class:
85
+
86
+ ```ruby
87
+ module Web
88
+ module Views
89
+ class ApplicationLayout
90
+ ...
91
+ # Define the stylesheet for this layout
92
+ def layout_stylesheets(assets_collector)
93
+ assets_collector.require :'bootstrap-css' # include the bundle :'bootstrap-css'
94
+ assets_collector.include 'layout/layout.css.scss' # include the asset layout.css.scss'
95
+ end
96
+
97
+ # Define the javascripts for this layout
98
+ def layout_javascripts(assets_collector)
99
+ assets_collector.require :'bootstrap-js'
100
+ end
101
+ ...
102
+ end
103
+ end
104
+ end
105
+ ```
106
+
107
+ To define the assets to be included in the view, you can add these methods to your Web::Views::SomeView class:
108
+
109
+ ```ruby
110
+ module Web::Views::LandingPage
111
+ class Index
112
+ include Web::View
113
+
114
+ # Define the stylesheet for this view
115
+ def view_stylesheets(assets_collector)
116
+ assets_collector.include 'landing-page/landing-page.css.scss'
117
+ end
118
+
119
+ # Define the javascripts for this view
120
+ def view_javascripts(assets_collector)
121
+ assets_collector.include 'landing-page/landing-page.js'
122
+ end
123
+ end
124
+ end
125
+ ```
126
+
127
+ To collect the assets, add the AssetsPublisher::Helper to your ApplicationLayout:
128
+
129
+ ```ruby
130
+ module Web
131
+ module Views
132
+ class ApplicationLayout
133
+ include Web::Layout
134
+ include CabezaDeTermo::AssetsPublisher::Helper
135
+
136
+ ...
137
+ end
138
+ end
139
+ end
140
+ ```
141
+
142
+ and then use the assets_publisher from your layout template:
143
+
144
+ ```ruby
145
+ doctype html
146
+ html
147
+ head
148
+ meta charset="UTF-8"
149
+ meta name="viewport" content="width=device-width, initial-scale=1"
150
+
151
+ / This will collect, publish and include all your stylesheets required by your layout and view
152
+ == assets_publisher.stylesheets_for self
153
+
154
+ body
155
+ ...
156
+
157
+ / This will collect, publish and include all your javascripts required by your layout and view
158
+ == assets_publisher.javascripts_for self
159
+ ```
160
+ ## Using custom assets compilers
161
+
162
+ By default, Publisher uses a TiltCompiler to compile the assets. But you can change that to use a custom one.
163
+
164
+ If you compile the assets by invoking a command line, there is a `command_line_compiler` you can use. In this example we configure the Publisher to use [lesscss](http://lesscss.org/usage/#command-line-usage-command-line-usage) to compile stylesheets and [uglifyjs](https://github.com/mishoo/UglifyJS2) to compile the javascripts. For this to work you must first install those tools of course.
165
+
166
+ ```ruby
167
+ CabezaDeTermo::AssetsPublisher::Publisher.configure do
168
+ ...
169
+
170
+ stylesheets_compiler {
171
+ command_line_compiler do |compiler, compilation_job|
172
+ files_list = compilation_job.source_filenames.join(' ')
173
+ include_folders = compilation_job.source_folders.join(';')
174
+
175
+ compiler.command_line "lessc",
176
+ "--include-path=#{include_folders}",
177
+ "--compress",
178
+ files_list,
179
+ compilation_job.destination_filename
180
+ end
181
+ }
182
+
183
+ javascripts_compiler {
184
+ command_line_compiler do |compiler, compilation_job|
185
+ files_list = compilation_job.source_filenames.join(' ')
186
+ compiler.command_line 'uglifyjs', files_list, '--output', compilation_job.destination_filename
187
+ end
188
+ }
189
+
190
+ ...
191
+ end
192
+ ```
193
+
194
+ If you need to write your own compiler, create a class that inherits from [CabezaDeTermo::AssetsPublisher::Compiler](lib/cabeza-de-termo/assets-publisher/compilers/compiler.rb)
195
+
196
+ ```ruby
197
+ require 'cabeza-de-termo/assets-publisher/compilers/compiler'
198
+
199
+ class CustomCompiler < CabezaDeTermo::AssetsPublisher::Compiler
200
+ def compile_assets()
201
+ # you can access which files to compile with
202
+ compilation_job.source_filenames
203
+
204
+ # you can access which file to compile to with
205
+ compilation_job.destination_filename
206
+
207
+ # you can access the assets source folders with
208
+ compilation_job.source_folders
209
+
210
+ # do compile the assets
211
+ ...
212
+ end
213
+ end
214
+ ```
215
+
216
+ and then configure Publisher to use your custom compiler
217
+
218
+ ```ruby
219
+ CabezaDeTermo::AssetsPublisher::Publisher.configure do
220
+ ...
221
+ stylesheets_compiler { CustomCompiler.new }
222
+
223
+ # and/or
224
+
225
+ javascripts_compiler { CustomCompiler.new }
226
+ ...
227
+ end
228
+ ```
229
+
230
+ ## See also
231
+
232
+ * [**Hanami framework**](http://hanamirb.org/) - A complete web framework for Ruby.
233
+ * [**CabezaDeTermo::Assets::Library**](https://github.com/cabeza-de-termo/assets-library-for-hanami) - A framework to declare bundles of assets in your Hanami application and collect them resolving the dependencies.
234
+
235
+ ## Running the tests
236
+
237
+ - `bundle install`
238
+ - `bundle exec rspec`
239
+
240
+ ## Roadmap for v2.1
241
+
242
+ - Allow to define different compiling strategies:
243
+ - One compiled file per asset (for development)
244
+ - Maybe one compiled file per Action?
245
+ - One compiled file per application (for production)
246
+
247
+ ## Roadmap for v2.2
248
+
249
+ - Allow the assets_publisher to publish other asset types (images and fonts)
250
+
251
+ ## Contributing
252
+
253
+ 1. Fork it ( https://github.com/cabeza-de-termo/assets-publisher-for-hanami/fork )
254
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
255
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
256
+ 4. Push to the branch (`git push origin my-new-feature`)
257
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cabeza-de-termo/assets-publisher/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "assets-publisher-for-hanami"
8
+ spec.version = CabezaDeTermo::AssetsPublisher::Publisher::VERSION
9
+ spec.authors = ["Martin Rubi"]
10
+ spec.email = ["martinrubi@gmail.com"]
11
+
12
+ spec.summary = %q{Framework to define and publish assets on your Hanami application.}
13
+ spec.description = %q{Framework to define and publish assets on your Hanami application.}
14
+ spec.homepage = "https://github.com/cabeza-de-termo/assets-publisher-for-hanami"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.required_ruby_version = '>= 2.0'
23
+
24
+ spec.add_dependency "cdt-utilities", "~> 0.3"
25
+ spec.add_dependency "assets-library-for-hanami", "~> 3.0"
26
+ spec.add_dependency "tilt", "~> 2.0"
27
+
28
+ spec.add_development_dependency "bundler", "~> 1.8"
29
+ spec.add_development_dependency "rake", "~> 10.0"
30
+ spec.add_development_dependency "sass"
31
+ spec.add_development_dependency "coffee-script"
32
+ spec.add_development_dependency "therubyracer"
33
+ end
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,81 @@
1
+ require 'cabeza-de-termo/assets-publisher/locations/location'
2
+
3
+ require_relative 'types/stylesheet-type'
4
+ require_relative 'types/javascript-type'
5
+
6
+ module CabezaDeTermo
7
+ module AssetsPublisher
8
+ # An assets to be included in a template.
9
+ class Asset
10
+ # Answer a new asset on the asset_uri.
11
+ def self.on_uri(asset_type, asset_uri)
12
+ new(asset_type, asset_uri, Location.from(asset_uri))
13
+ end
14
+
15
+ # Initialize the instance.
16
+ def initialize(asset_type, asset_uri, location)
17
+ @uri = Pathname.new(asset_uri)
18
+ @type = asset_type
19
+ @location = location
20
+ @real_path = nil
21
+ @uri_parameters = nil
22
+ end
23
+
24
+ # Answer the asset uri.
25
+ def uri()
26
+ @uri
27
+ end
28
+
29
+ # Answer the asset uri with optional parameters
30
+ def uri_with_parameters()
31
+ return uri.to_s if uri_parameters.nil?
32
+
33
+ uri.to_s + '?' + URI.escape(uri_parameters)
34
+ end
35
+
36
+ # Answer the asset type
37
+ def type()
38
+ @type
39
+ end
40
+
41
+ # Answer the location of the asset
42
+ def location()
43
+ @location
44
+ end
45
+
46
+ # Answer the file path of the asset uri.
47
+ def real_path()
48
+ @real_path ||= location.real_path_of(uri)
49
+ end
50
+
51
+ def uri_parameters()
52
+ @uri_parameters
53
+ end
54
+
55
+ def set_uri_parameters(string)
56
+ @uri_parameters = string
57
+ self
58
+ end
59
+
60
+ # Answer the html to include this asset in a template
61
+ def html()
62
+ type.html_for uri_with_parameters
63
+ end
64
+
65
+ def validate_real_path()
66
+ raise_asset_not_found_error unless real_path.exist?
67
+ end
68
+
69
+ def modification_time()
70
+ return :not_found unless real_path.exist?
71
+ real_path.mtime
72
+ end
73
+
74
+ protected
75
+
76
+ def raise_asset_not_found_error()
77
+ raise AssetNotFoundError.new(uri)
78
+ end
79
+ end
80
+ end
81
+ end