bower-vendor 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .ruby-version
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ bower-vendor
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bower-vendor.gemspec
4
+ gemspec
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,3 @@
1
+ module BowerVendor
2
+ BOWER_ROOT = File.join('tmp','bower_components')
3
+ end
@@ -0,0 +1,5 @@
1
+ require 'bower-vendor'
2
+ require 'rails'
3
+ class BowerVendor::Railtie < Rails::Railtie
4
+ railtie_name :bower_vendor
5
+ 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
@@ -0,0 +1,3 @@
1
+ module BowerVendor
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,4 @@
1
+ require 'bower-vendor/version'
2
+ require 'bower-vendor/bower_root'
3
+ require 'bower-vendor/utils'
4
+ require 'bower-vendor/railtie'
@@ -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: