bower-vendor 0.0.1
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.
- data/.gitignore +18 -0
- data/.ruby-gemset +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +181 -0
- data/Rakefile +1 -0
- data/bower-vendor.gemspec +24 -0
- data/lib/bower-vendor/bower_root.rb +3 -0
- data/lib/bower-vendor/railtie.rb +5 -0
- data/lib/bower-vendor/utils.rb +32 -0
- data/lib/bower-vendor/version.rb +3 -0
- data/lib/bower-vendor.rb +4 -0
- data/lib/generators/bower_vendor/clean_generator.rb +19 -0
- data/lib/generators/bower_vendor/configure_generator.rb +11 -0
- data/lib/generators/bower_vendor/install_generator.rb +65 -0
- data/lib/tasks/bower_vendor.rake +19 -0
- metadata +94 -0
data/.gitignore
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
bower-vendor
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Peter Fern
|
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
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
# BowerVendor
|
2
|
+
|
3
|
+
Vendor the bower assets you want for Ruby on Rails. Inspired by [bower-installer](https://github.com/blittle/bower-installer).
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your Rails application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'bower-vendor'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
```shell
|
16
|
+
bundle
|
17
|
+
rails generate bower_vendor:configure
|
18
|
+
```
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
Add bower packages to the `bower.json` file in your Rails root as normal, then
|
23
|
+
execute:
|
24
|
+
|
25
|
+
```shell
|
26
|
+
rails generate bower_vendor:install
|
27
|
+
```
|
28
|
+
|
29
|
+
To automatically vendor files specified by the bower package's `main` attribute
|
30
|
+
to the appropriate vendor directory.
|
31
|
+
|
32
|
+
Files are vendored based on file extension under:
|
33
|
+
|
34
|
+
`vendor/assets/(javascripts|stylesheets|images|media)/[package-name]`
|
35
|
+
|
36
|
+
Currently supported file extensions are:
|
37
|
+
* `javascripts`: `.js` `.coffee`
|
38
|
+
* `stylesheets`: `.css` `.scss` `.sass` `.less`
|
39
|
+
* `images`: `.gif` `.png` `.jpg` `.svg`
|
40
|
+
* `media`: `.\*` (everything else)
|
41
|
+
|
42
|
+
The following generators are available:
|
43
|
+
|
44
|
+
### Available Generators
|
45
|
+
|
46
|
+
`rails generate bower_vendor:install [options]`
|
47
|
+
|
48
|
+
Options:
|
49
|
+
[--update] # Update bower assets (ie - `bower update`)
|
50
|
+
[--skip-git-ignore] # Add vendored bower asset package directories to .gitignore
|
51
|
+
[--force-clean] # Clean vendored bower assets without prompting
|
52
|
+
[--skip-clean] # Skip cleaning vendored bower assets
|
53
|
+
|
54
|
+
Runtime options:
|
55
|
+
-f, [--force] # Overwrite files that already exist
|
56
|
+
-p, [--pretend] # Run but do not make any changes
|
57
|
+
-q, [--quiet] # Suppress status output
|
58
|
+
-s, [--skip] # Skip files that already exist
|
59
|
+
|
60
|
+
Vendor bower assets based on bower.json
|
61
|
+
|
62
|
+
|
63
|
+
`rails generate bower_vendor:clean [options]`
|
64
|
+
|
65
|
+
Options:
|
66
|
+
[--force] # Delete vendored bower assets without prompting
|
67
|
+
|
68
|
+
Runtime options:
|
69
|
+
-p, [--pretend] # Run but do not make any changes
|
70
|
+
-q, [--quiet] # Suppress status output
|
71
|
+
-s, [--skip] # Skip files that already exist
|
72
|
+
|
73
|
+
Cleans bower assets (CAUTION: Vendored asset directories for all bower packages will be deleted!)
|
74
|
+
|
75
|
+
### Configuring installed assets
|
76
|
+
|
77
|
+
Take the following example bower package:
|
78
|
+
|
79
|
+
```json
|
80
|
+
{
|
81
|
+
"name": "widgets",
|
82
|
+
"repo": "pdf/widgets",
|
83
|
+
"description": "Now with more widgets!",
|
84
|
+
"version": "0.0.1",
|
85
|
+
"main": [
|
86
|
+
"build/dir/js/widgets.js",
|
87
|
+
"build/dir/css/widgets.css",
|
88
|
+
]
|
89
|
+
}
|
90
|
+
```
|
91
|
+
|
92
|
+
Let's add `widgets` to our application's `bower.json`, like so:
|
93
|
+
|
94
|
+
```json
|
95
|
+
{
|
96
|
+
"dependencies": {
|
97
|
+
"widgets": "~0.0.1"
|
98
|
+
}
|
99
|
+
}
|
100
|
+
```
|
101
|
+
|
102
|
+
This is a contrived example, but it exists in the real world - if we were to
|
103
|
+
install this using bower directly, we'd end up with some pretty ugly paths to
|
104
|
+
reference in our application. It might look something like this:
|
105
|
+
|
106
|
+
components/widgets/build/dir/js/widgets.js
|
107
|
+
components/widgets/build/dir/js/widgets-super.js
|
108
|
+
components/widgets/build/dir/css/widgets.css
|
109
|
+
components/widgets/src/cruft/widgets.coffee
|
110
|
+
components/widgets/src/widgets.scss
|
111
|
+
components/widgets/.ilikedonuts
|
112
|
+
|
113
|
+
However, if we instead vendor the bower package by executing
|
114
|
+
`rails g bower_vendor:install`, we end up with just the following files added
|
115
|
+
to our project space:
|
116
|
+
|
117
|
+
vendor/assets/javascripts/widgets/widgets.js
|
118
|
+
vendor/assets/stylesheets/widgets/widgets.css
|
119
|
+
|
120
|
+
Much nicer.
|
121
|
+
|
122
|
+
### Advanced bower.json
|
123
|
+
(Hat-tip to [bower-installer](https://github.com/blittle/bower-installer) for the inspiration)
|
124
|
+
|
125
|
+
If the bower package's `main` attribute does not include all the files you want
|
126
|
+
to vendor (or files you want to omit from vendoring), you can override the
|
127
|
+
vendored files using a `sources` attribute with a key of the package name,
|
128
|
+
containing an array of source files to install, like so:
|
129
|
+
|
130
|
+
```json
|
131
|
+
{
|
132
|
+
"dependencies": {
|
133
|
+
"widgets": "~0.0.1"
|
134
|
+
},
|
135
|
+
"sources": {
|
136
|
+
"widgets": [
|
137
|
+
"build/dir/js/widgets.js",
|
138
|
+
"build/dir/js/widgets-super.js",
|
139
|
+
"build/dir/css/widgets.css"
|
140
|
+
]
|
141
|
+
}
|
142
|
+
}
|
143
|
+
```
|
144
|
+
|
145
|
+
Which will result in the following files being vendored:
|
146
|
+
|
147
|
+
vendor/assets/javascripts/widgets/widgets.js
|
148
|
+
vendor/assets/javascripts/widgets/widgets-super.js
|
149
|
+
vendor/assets/stylesheets/widgets/widgets.css
|
150
|
+
|
151
|
+
You can also override the destination path/filename, by using a hash of source
|
152
|
+
paths to destinations instead of an array, like so:
|
153
|
+
|
154
|
+
```json
|
155
|
+
{
|
156
|
+
"dependencies": {
|
157
|
+
"widgets": "~0.0.1"
|
158
|
+
},
|
159
|
+
"sources": {
|
160
|
+
"widgets": {
|
161
|
+
"build/dir/js/widgets.js": "widgets.js",
|
162
|
+
"build/dir/js/widgets-super.js": "super/widgets-super.js",
|
163
|
+
"build/dir/css/widgets.css": "my_widgets.css"
|
164
|
+
}
|
165
|
+
}
|
166
|
+
}
|
167
|
+
```
|
168
|
+
|
169
|
+
Resulting in the following:
|
170
|
+
|
171
|
+
vendor/assets/javascripts/widgets/widgets.js
|
172
|
+
vendor/assets/javascripts/widgets/super/widgets-super.js
|
173
|
+
vendor/assets/stylesheets/widgets/my_widgets.css
|
174
|
+
|
175
|
+
## Contributing
|
176
|
+
|
177
|
+
1. Fork it
|
178
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
179
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
180
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
181
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'bower-vendor/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "bower-vendor"
|
8
|
+
gem.version = BowerVendor::VERSION
|
9
|
+
gem.authors = ["Peter Fern"]
|
10
|
+
gem.email = ["ruby@obfusc8.org"]
|
11
|
+
gem.description = %q{Vendor the bower assets you want for Ruby on Rails}
|
12
|
+
gem.summary = %q{Vendor the bower assets you want for Ruby on Rails}
|
13
|
+
gem.homepage = "http://github.com/pdf/bower-vendor"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.required_ruby_version = '>= 1.9.2'
|
21
|
+
|
22
|
+
gem.add_dependency('ruby-bower', '~> 0.0.1')
|
23
|
+
gem.add_dependency('rails', '>= 3.1.0')
|
24
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'ruby-bower'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class BowerVendor::Utils
|
5
|
+
attr_accessor :bower_paths, :bower_json
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
bower = Bower.new
|
9
|
+
@bower_json = ::JSON.load(File.read('bower.json'))
|
10
|
+
begin
|
11
|
+
@bower_paths = bower.list(paths: true)
|
12
|
+
rescue ::ExecJS::ProgramError => e
|
13
|
+
err = 'failed to retrieve installed bowser components'
|
14
|
+
err << ': ' << e.to_s if e.to_s
|
15
|
+
raise RuntimeError, err
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def prefixed_path(package, prefix, path)
|
20
|
+
File.join('vendor', 'assets', prefix, package, path)
|
21
|
+
end
|
22
|
+
|
23
|
+
def merged_paths
|
24
|
+
if bower_json.has_key? 'sources'
|
25
|
+
bower_json['sources'].each do |package, paths|
|
26
|
+
bower_paths[package] = paths
|
27
|
+
end
|
28
|
+
end
|
29
|
+
bower_paths
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/lib/bower-vendor.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
class BowerVendor::CleanGenerator < Rails::Generators::Base
|
2
|
+
attr_accessor :utils
|
3
|
+
|
4
|
+
class_option :force, type: :boolean, desc: 'Delete vendored bower assets without prompting'
|
5
|
+
desc 'Cleans bower assets (CAUTION: Vendored asset directories for all bower packages will be deleted!)'
|
6
|
+
def clean_packages
|
7
|
+
@utils = BowerVendor::Utils.new
|
8
|
+
utils.merged_paths.keys.each do |package|
|
9
|
+
%w[javascripts stylesheets images].each do |prefix|
|
10
|
+
path = File.join('vendor', 'assets', prefix, package)
|
11
|
+
if Dir.exist? path
|
12
|
+
if options.force? or yes?("Remove #{path}?", :cyan)
|
13
|
+
remove_dir(path)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class BowerVendor::ConfigureGenerator < Rails::Generators::Base
|
2
|
+
desc 'Creates/updates .bowerrc for use with bower-vendor'
|
3
|
+
def configure_bower
|
4
|
+
if File.exist? '.bowerrc'
|
5
|
+
gsub_file '.bowerrc', /"directory":\s*"[^"]*"\s*,/, "\"directory\": \"#{BowerVendor::BOWER_ROOT}\""
|
6
|
+
end
|
7
|
+
create_file '.bowerrc', {directory: BowerVendor::BOWER_ROOT}.to_json
|
8
|
+
|
9
|
+
append_file '.gitignore', "\n# Temporary bower components\n/tmp/bower_components\n"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class BowerVendor::InstallGenerator < Rails::Generators::Base
|
2
|
+
source_root Rails.root
|
3
|
+
|
4
|
+
attr_accessor :utils
|
5
|
+
|
6
|
+
class_option :update, type: :boolean, desc: 'Update bower assets (ie - `bower update`)'
|
7
|
+
class_option :skip_git_ignore, type: :boolean, desc: 'Add vendored bower asset package directories to .gitignore'
|
8
|
+
class_option :force_clean, type: :boolean, desc: 'Clean vendored bower assets without prompting'
|
9
|
+
class_option :skip_clean, type: :boolean, desc: 'Skip cleaning vendored bower assets'
|
10
|
+
class_option :include_dev_dependencies, type: :boolean, default: false, desc: 'Include bower devDependencies'
|
11
|
+
desc 'Vendor bower assets based on bower.json'
|
12
|
+
def bower_install
|
13
|
+
if !options.skip_clean? and Dir.exist? BowerVendor::BOWER_ROOT
|
14
|
+
generate options.force_clean? ? 'bower_vendor:clean --force' : 'bower_vendor:clean'
|
15
|
+
end
|
16
|
+
|
17
|
+
action = options.update? ? 'update' : 'install'
|
18
|
+
action << ' --production' unless options.include_dev_dependencies?
|
19
|
+
say_status :run, "bower #{action}"
|
20
|
+
`bower #{action}`
|
21
|
+
|
22
|
+
@utils = BowerVendor::Utils.new
|
23
|
+
|
24
|
+
utils.merged_paths.each do |package, paths|
|
25
|
+
append_file '.gitignore', "\n# Vendored bower package '#{package}'\n" unless options.skip_git_ignore?
|
26
|
+
case paths
|
27
|
+
when Hash
|
28
|
+
paths.each do |source, dest|
|
29
|
+
vendor_asset(package, File.join(BowerVendor::BOWER_ROOT, package, source), dest)
|
30
|
+
end
|
31
|
+
when Array
|
32
|
+
paths.each do |source|
|
33
|
+
vendor_asset(package, File.join(BowerVendor::BOWER_ROOT, package, source))
|
34
|
+
end
|
35
|
+
when String
|
36
|
+
vendor_asset(package, paths)
|
37
|
+
else
|
38
|
+
raise ArgumentError, "Paths must be either Hash, Array or String, received: #{paths.class}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
def vendor_asset(package, source, dest=nil)
|
45
|
+
file_ext = File.extname(source)
|
46
|
+
case file_ext
|
47
|
+
when '.js', '.coffee'
|
48
|
+
prefix = 'javascripts'
|
49
|
+
when '.css', '.scss', '.sass', '.less'
|
50
|
+
prefix = 'stylesheets'
|
51
|
+
when '.gif', '.png', '.jpg', '.svg'
|
52
|
+
prefix = 'images'
|
53
|
+
else
|
54
|
+
prefix = 'media'
|
55
|
+
end
|
56
|
+
|
57
|
+
if dest
|
58
|
+
dest = utils.prefixed_path(package, prefix, dest)
|
59
|
+
else
|
60
|
+
dest = utils.prefixed_path(package, prefix, File.basename(source))
|
61
|
+
end
|
62
|
+
append_file '.gitignore', "/#{File.join('vendor', 'assets', prefix, package)}\n" unless options.skip_git_ignore?
|
63
|
+
copy_file(source, dest)
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'json'
|
2
|
+
namespace :bower do
|
3
|
+
desc 'vendor bower assets'
|
4
|
+
task :vendor do
|
5
|
+
sh 'bower install'
|
6
|
+
BowerVendor::Utils.new().deploy_assets
|
7
|
+
end
|
8
|
+
|
9
|
+
desc 'update bower assets'
|
10
|
+
task :update do
|
11
|
+
sh 'bower update'
|
12
|
+
BowerVendor::Utils.new().deploy_assets
|
13
|
+
end
|
14
|
+
|
15
|
+
desc 'clean bower assets'
|
16
|
+
task :clean do
|
17
|
+
BowerVendor::Utils.new().clean_packages
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bower-vendor
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Peter Fern
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-05-17 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: ruby-bower
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.0.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.0.1
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rails
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 3.1.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.1.0
|
46
|
+
description: Vendor the bower assets you want for Ruby on Rails
|
47
|
+
email:
|
48
|
+
- ruby@obfusc8.org
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- .gitignore
|
54
|
+
- .ruby-gemset
|
55
|
+
- Gemfile
|
56
|
+
- LICENSE.txt
|
57
|
+
- README.md
|
58
|
+
- Rakefile
|
59
|
+
- bower-vendor.gemspec
|
60
|
+
- lib/bower-vendor.rb
|
61
|
+
- lib/bower-vendor/bower_root.rb
|
62
|
+
- lib/bower-vendor/railtie.rb
|
63
|
+
- lib/bower-vendor/utils.rb
|
64
|
+
- lib/bower-vendor/version.rb
|
65
|
+
- lib/generators/bower_vendor/clean_generator.rb
|
66
|
+
- lib/generators/bower_vendor/configure_generator.rb
|
67
|
+
- lib/generators/bower_vendor/install_generator.rb
|
68
|
+
- lib/tasks/bower_vendor.rake
|
69
|
+
homepage: http://github.com/pdf/bower-vendor
|
70
|
+
licenses: []
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ! '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 1.9.2
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
requirements: []
|
88
|
+
rubyforge_project:
|
89
|
+
rubygems_version: 1.8.25
|
90
|
+
signing_key:
|
91
|
+
specification_version: 3
|
92
|
+
summary: Vendor the bower assets you want for Ruby on Rails
|
93
|
+
test_files: []
|
94
|
+
has_rdoc:
|