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 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: